@3deye-toolkit/core 0.0.1-alpha.20 → 0.0.1-alpha.23
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/core.d.ts +124 -44
- package/dist/core.js +1 -1
- package/dist/tsdoc-metadata.json +1 -1
- package/package.json +7 -8
package/dist/core.d.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
|
|
1
3
|
import { BehaviorSubject } from 'rxjs';
|
|
2
4
|
import crossfilter from 'crossfilter2';
|
|
3
5
|
import type { IReactionDisposer } from 'mobx';
|
|
@@ -9,18 +11,17 @@ import { Subscription } from 'rxjs';
|
|
|
9
11
|
declare class AccountStore extends ApiStore {
|
|
10
12
|
private notification?;
|
|
11
13
|
user: User | null;
|
|
12
|
-
camerasPermissions: Map<number, string[]>;
|
|
13
14
|
auth: Auth;
|
|
14
15
|
constructor(notification?: NotificationService | undefined);
|
|
15
16
|
get userDisplayName(): string | null;
|
|
16
17
|
protected afterInit(): void;
|
|
17
|
-
|
|
18
|
+
loadUser(): Observable<RawUser | null>;
|
|
19
|
+
setUser: (user: User | null) => void;
|
|
18
20
|
setAuthStore(auth: Auth): void;
|
|
19
21
|
updateUserPassword(passwordData: {
|
|
20
22
|
previous: string;
|
|
21
23
|
new: string;
|
|
22
24
|
}): Promise<void>;
|
|
23
|
-
fetchPermissions(): Promise<void>;
|
|
24
25
|
updateUserSettings({ firstName, lastName }: {
|
|
25
26
|
firstName: string;
|
|
26
27
|
lastName: string;
|
|
@@ -28,6 +29,7 @@ declare class AccountStore extends ApiStore {
|
|
|
28
29
|
updateCustomPreferences: (preferences: Record<string, any>) => Observable<RawUser>;
|
|
29
30
|
setDefaultGroup(groupId: number): Observable<RawUser> | undefined;
|
|
30
31
|
getPreference: (key: string) => any;
|
|
32
|
+
private retryOnVersionMismatch;
|
|
31
33
|
}
|
|
32
34
|
|
|
33
35
|
declare class Api<T> {
|
|
@@ -103,6 +105,7 @@ declare class ArchiveChunk implements Chunk {
|
|
|
103
105
|
}
|
|
104
106
|
|
|
105
107
|
declare class ArchivesStore extends ApiStore {
|
|
108
|
+
private camerasStore;
|
|
106
109
|
data: crossfilter.Crossfilter<ArchiveChunk>;
|
|
107
110
|
chunksByCameraId: crossfilter.Dimension<ArchiveChunk, number>;
|
|
108
111
|
chunksByStart: crossfilter.Dimension<ArchiveChunk, number>;
|
|
@@ -114,22 +117,47 @@ declare class ArchivesStore extends ApiStore {
|
|
|
114
117
|
private pendingRequestsByCameraId;
|
|
115
118
|
knownIntervals: Map<number, [Date, Date]>;
|
|
116
119
|
updates: number;
|
|
117
|
-
constructor();
|
|
120
|
+
constructor(camerasStore: CamerasStore);
|
|
118
121
|
/**
|
|
119
122
|
* Fetches archive chunks for given camera and period
|
|
120
123
|
* @param cameraId - camera id
|
|
121
124
|
* @param startTime - start of the period
|
|
122
125
|
* @param endTime - end of the period
|
|
123
126
|
* TODO: add support for null endTime in order to remove requestedArchivesSince logic from player controller
|
|
127
|
+
* TODO: add error handling
|
|
124
128
|
*/
|
|
125
129
|
fetch(cameraId: number, startTime: Date, endTime: Date): Observable<ArchiveChunk[]>;
|
|
126
|
-
extendKnownInterval(cameraId: number, chunks: ArchiveChunk[]): void;
|
|
130
|
+
extendKnownInterval(cameraId: number, startTime: Date, chunks: ArchiveChunk[]): void;
|
|
127
131
|
add(chunks: ArchiveChunk[]): void;
|
|
128
132
|
getChunks({ cameraId, from, to }: ChunksQuery): ArchiveChunk[];
|
|
129
|
-
|
|
133
|
+
/**
|
|
134
|
+
* Returns chunk that either contain the given time or is right adjacent to it
|
|
135
|
+
* @param camera - camera id
|
|
136
|
+
* @param time - time to search for
|
|
137
|
+
* @returns ArchiveChunk or undefined if there is no such chunk in the current archive
|
|
138
|
+
*/
|
|
139
|
+
getClosestChunkRight: ({ cameraId, time }: {
|
|
140
|
+
cameraId: number;
|
|
141
|
+
time: Date;
|
|
142
|
+
}) => ArchiveChunk;
|
|
143
|
+
/**
|
|
144
|
+
* Return chunks that either contain the given time or is left adjacent to it
|
|
145
|
+
* @param camera - camera id
|
|
146
|
+
* @param time - time to search for
|
|
147
|
+
* @returns ArchiveChunk or undefined if there is no such chunk in the current archive
|
|
148
|
+
*/
|
|
149
|
+
getClosestChunkLeft: ({ cameraId, time }: {
|
|
150
|
+
cameraId: number;
|
|
151
|
+
time: Date;
|
|
152
|
+
}) => ArchiveChunk;
|
|
153
|
+
fetchNextChunk: ({ cameraId, time }: {
|
|
154
|
+
cameraId: number;
|
|
155
|
+
time: Date;
|
|
156
|
+
}) => Observable<ArchiveChunk | undefined>;
|
|
157
|
+
fetchPrevChunk: ({ cameraId, time }: {
|
|
130
158
|
cameraId: number;
|
|
131
159
|
time: Date;
|
|
132
|
-
})
|
|
160
|
+
}) => Observable<ArchiveChunk | undefined>;
|
|
133
161
|
protected afterInit(): void;
|
|
134
162
|
}
|
|
135
163
|
|
|
@@ -139,31 +167,30 @@ declare class Auth {
|
|
|
139
167
|
storage: Storage_2;
|
|
140
168
|
tokenServiceUrl: string;
|
|
141
169
|
tokenStorageKey: string;
|
|
142
|
-
widgetTokenServiceUrl?: string;
|
|
143
170
|
deviceInfo: string | null;
|
|
144
171
|
clientId: string;
|
|
145
172
|
private pendingUpdateTokenRequest;
|
|
146
173
|
get isAuthenticated(): boolean;
|
|
147
|
-
constructor({ tokenServiceUrl,
|
|
174
|
+
constructor({ tokenServiceUrl, storage, tokenStorageKey, deviceInfo, clientId }: AuthStoreOptions);
|
|
148
175
|
signOut: () => void;
|
|
149
|
-
signIn: (
|
|
176
|
+
signIn: (options: {
|
|
150
177
|
username: string;
|
|
151
178
|
password: string;
|
|
152
|
-
|
|
153
|
-
agreedWithTerms?: boolean
|
|
179
|
+
replaceToken?: string;
|
|
180
|
+
agreedWithTerms?: boolean;
|
|
181
|
+
code?: string;
|
|
154
182
|
}) => Promise<Token> | undefined;
|
|
155
183
|
invalidateToken: () => void;
|
|
156
184
|
getTokenFromStorage(): Promise<Token | null>;
|
|
157
185
|
private storeToken;
|
|
158
186
|
private getInitialToken;
|
|
159
|
-
private
|
|
187
|
+
private fetchToken;
|
|
160
188
|
private updateToken;
|
|
161
189
|
private fetchWidgetToken;
|
|
162
190
|
}
|
|
163
191
|
|
|
164
192
|
declare interface AuthStoreOptions {
|
|
165
193
|
tokenServiceUrl: string;
|
|
166
|
-
widgetTokenServiceUrl?: string;
|
|
167
194
|
storage: Storage_2;
|
|
168
195
|
tokenStorageKey: string;
|
|
169
196
|
deviceInfo: any;
|
|
@@ -197,6 +224,7 @@ declare class Camera {
|
|
|
197
224
|
pin: string;
|
|
198
225
|
webRtcUrl: string;
|
|
199
226
|
isPtz: boolean;
|
|
227
|
+
permissions: number;
|
|
200
228
|
get isOnline(): boolean;
|
|
201
229
|
get supportsWebRTC(): boolean;
|
|
202
230
|
constructor(raw: RawCamera);
|
|
@@ -210,6 +238,7 @@ declare class CameraEvent {
|
|
|
210
238
|
thumbnailUrl: string;
|
|
211
239
|
detectedObjects: DetectedObject[];
|
|
212
240
|
faces: Face[];
|
|
241
|
+
instant: boolean;
|
|
213
242
|
get id(): number;
|
|
214
243
|
get startTime(): Date;
|
|
215
244
|
get endTime(): Date;
|
|
@@ -226,7 +255,7 @@ declare class CamerasStore extends ApiStore {
|
|
|
226
255
|
constructor();
|
|
227
256
|
load: () => Observable<RawCamera[]> | undefined;
|
|
228
257
|
add: (cameras: RawCamera[]) => void;
|
|
229
|
-
sync: () =>
|
|
258
|
+
sync: () => Observable<RawCamera[]>;
|
|
230
259
|
protected afterInit(): void;
|
|
231
260
|
dispose(): void;
|
|
232
261
|
}
|
|
@@ -294,6 +323,8 @@ declare type DeepPartial<T> = {
|
|
|
294
323
|
|
|
295
324
|
declare interface DetectedObject {
|
|
296
325
|
Type: string;
|
|
326
|
+
Value?: string;
|
|
327
|
+
Number?: string;
|
|
297
328
|
Box: {
|
|
298
329
|
Left: number;
|
|
299
330
|
Top: number;
|
|
@@ -301,11 +332,19 @@ declare interface DetectedObject {
|
|
|
301
332
|
Bottom: number;
|
|
302
333
|
};
|
|
303
334
|
Probability: number;
|
|
304
|
-
Colors
|
|
335
|
+
Colors?: {
|
|
305
336
|
Color: string;
|
|
306
337
|
}[];
|
|
307
338
|
}
|
|
308
339
|
|
|
340
|
+
declare interface DetectedObjectOption {
|
|
341
|
+
id: string;
|
|
342
|
+
name: string;
|
|
343
|
+
color: string;
|
|
344
|
+
highlightColor: string;
|
|
345
|
+
type: 'detectedObject';
|
|
346
|
+
}
|
|
347
|
+
|
|
309
348
|
declare const events: {
|
|
310
349
|
[P in keyof PartialApi]: Array<{
|
|
311
350
|
name: string;
|
|
@@ -317,13 +356,7 @@ declare class EventSchemaStore extends ApiStore {
|
|
|
317
356
|
schemaDescription: SchemaDescriptionParameter[];
|
|
318
357
|
constructor();
|
|
319
358
|
get foundObjectTypes(): string[];
|
|
320
|
-
get foundObjectTypesForSelect():
|
|
321
|
-
id: EventType;
|
|
322
|
-
name: string;
|
|
323
|
-
color: string;
|
|
324
|
-
highlightColor: any;
|
|
325
|
-
isEventType: boolean;
|
|
326
|
-
}[];
|
|
359
|
+
get foundObjectTypesForSelect(): DetectedObjectOption[];
|
|
327
360
|
get colorsByFoundObjectType(): Map<string, string>;
|
|
328
361
|
fetchAnalyticEventSchema: () => void;
|
|
329
362
|
protected afterInit(): void;
|
|
@@ -381,13 +414,31 @@ declare class EventsStore extends ApiStore {
|
|
|
381
414
|
from: Date;
|
|
382
415
|
to: Date;
|
|
383
416
|
}): CameraEvent[];
|
|
384
|
-
|
|
417
|
+
getLastNonAnalyticEventBefore({ cameraId, date }: {
|
|
418
|
+
cameraId: number;
|
|
419
|
+
date: Date;
|
|
420
|
+
}): CameraEvent;
|
|
421
|
+
getLastObjectBefore({ cameraId, date, objectFilters }: {
|
|
422
|
+
cameraId: number;
|
|
423
|
+
date: Date;
|
|
424
|
+
objectFilters: {
|
|
425
|
+
people: boolean;
|
|
426
|
+
cars: boolean;
|
|
427
|
+
misc: boolean;
|
|
428
|
+
};
|
|
429
|
+
}): CameraEvent;
|
|
430
|
+
getFirstNonAnalyticEventAfter({ cameraId, date }: {
|
|
385
431
|
cameraId: number;
|
|
386
432
|
date: Date;
|
|
387
433
|
}): CameraEvent;
|
|
388
|
-
|
|
434
|
+
getFirstObjectAfter({ cameraId, date, objectFilters }: {
|
|
389
435
|
cameraId: number;
|
|
390
436
|
date: Date;
|
|
437
|
+
objectFilters: {
|
|
438
|
+
people: boolean;
|
|
439
|
+
cars: boolean;
|
|
440
|
+
misc: boolean;
|
|
441
|
+
};
|
|
391
442
|
}): CameraEvent;
|
|
392
443
|
protected afterInit(): void;
|
|
393
444
|
processNewEvents: ({ data }: {
|
|
@@ -452,6 +503,9 @@ declare interface IApi {
|
|
|
452
503
|
GetCameras: (camera: {
|
|
453
504
|
id?: number;
|
|
454
505
|
} | null, since: Date | null) => Observable<ApiResult<RawCamera>>;
|
|
506
|
+
/**
|
|
507
|
+
* @deprecated
|
|
508
|
+
*/
|
|
455
509
|
GetMotionEvents: (params: {
|
|
456
510
|
cameraId: number;
|
|
457
511
|
endTime: Date | null;
|
|
@@ -465,6 +519,12 @@ declare interface IApi {
|
|
|
465
519
|
MoveCamera: (camera: {
|
|
466
520
|
id: number;
|
|
467
521
|
}, x: number, y: number, zoom: number, moveSpeed: number, zoomSpeed: number) => Observable<any>;
|
|
522
|
+
MoveCameraContinuousStart: ({ id }: {
|
|
523
|
+
id: number;
|
|
524
|
+
}, x: number, y: number, zoom: number, timeout: number) => Observable<any>;
|
|
525
|
+
MoveCameraContinuousStop: ({ id }: {
|
|
526
|
+
id: number;
|
|
527
|
+
}) => Observable<any>;
|
|
468
528
|
GoHomePtzCamera: ({ id }: {
|
|
469
529
|
id: number;
|
|
470
530
|
}) => Observable<any>;
|
|
@@ -515,7 +575,6 @@ declare interface InitParams {
|
|
|
515
575
|
tokenStorageKey?: string;
|
|
516
576
|
apiUrl?: string;
|
|
517
577
|
tokenServiceUrl?: string;
|
|
518
|
-
widgetTokenServiceUrl?: string;
|
|
519
578
|
}
|
|
520
579
|
|
|
521
580
|
declare interface Interval_2 {
|
|
@@ -539,15 +598,33 @@ declare interface NotificationOptions_2 {
|
|
|
539
598
|
declare class NotificationService implements Notifier {
|
|
540
599
|
private notifier;
|
|
541
600
|
constructor(notifier: Notifier);
|
|
542
|
-
error(message: string
|
|
543
|
-
|
|
544
|
-
|
|
601
|
+
error(message: string | {
|
|
602
|
+
title: string;
|
|
603
|
+
text: string;
|
|
604
|
+
}): void;
|
|
605
|
+
success(message: string | {
|
|
606
|
+
title: string;
|
|
607
|
+
text: string;
|
|
608
|
+
}, options?: NotificationOptions_2): void;
|
|
609
|
+
warn(message: string | {
|
|
610
|
+
title: string;
|
|
611
|
+
text: string;
|
|
612
|
+
}): void;
|
|
545
613
|
}
|
|
546
614
|
|
|
547
615
|
declare interface Notifier {
|
|
548
|
-
success: (message: string
|
|
549
|
-
|
|
550
|
-
|
|
616
|
+
success: (message: string | {
|
|
617
|
+
title: string;
|
|
618
|
+
text: string;
|
|
619
|
+
}, options?: NotificationOptions_2) => void;
|
|
620
|
+
warn: (message: string | {
|
|
621
|
+
title: string;
|
|
622
|
+
text: string;
|
|
623
|
+
}) => void;
|
|
624
|
+
error: (message: string | {
|
|
625
|
+
title: string;
|
|
626
|
+
text: string;
|
|
627
|
+
}) => void;
|
|
551
628
|
}
|
|
552
629
|
|
|
553
630
|
declare type OBVIOUSLY_NEEDS_TO_BE_FIXED_EventsApiResult<T> = {
|
|
@@ -705,29 +782,32 @@ declare interface RawSharedClip {
|
|
|
705
782
|
validTo: string | Date;
|
|
706
783
|
}
|
|
707
784
|
|
|
708
|
-
declare
|
|
709
|
-
access_token: string;
|
|
785
|
+
declare type RawToken = {
|
|
710
786
|
accessToken: string;
|
|
711
|
-
access_token_expires: string;
|
|
712
787
|
accessTokenExpires: string;
|
|
713
|
-
access_token_issued: string;
|
|
714
788
|
accessTokenIssued: string;
|
|
715
|
-
client_id: string;
|
|
716
789
|
clientId: string;
|
|
717
|
-
expires_in: number;
|
|
718
790
|
expiresIn: number;
|
|
719
|
-
refresh_token: string;
|
|
720
791
|
refreshToken: string;
|
|
721
|
-
refresh_token_expires: string;
|
|
722
792
|
refreshTokenExpires: string;
|
|
723
|
-
refresh_token_issued: string;
|
|
724
793
|
refreshTokenIssued: string;
|
|
725
|
-
token_type: string;
|
|
726
794
|
tokenType: string;
|
|
727
795
|
userName: string;
|
|
796
|
+
} & {
|
|
797
|
+
access_token: string;
|
|
798
|
+
access_token_expires: string;
|
|
799
|
+
access_token_issued: string;
|
|
800
|
+
client_id: string;
|
|
801
|
+
expires_in: number;
|
|
802
|
+
refresh_token: string;
|
|
803
|
+
refresh_token_expires: string;
|
|
804
|
+
refresh_token_issued: string;
|
|
805
|
+
token_type: string;
|
|
806
|
+
userName: string;
|
|
807
|
+
} & {
|
|
728
808
|
widgetId?: string;
|
|
729
809
|
widgetToken?: string;
|
|
730
|
-
}
|
|
810
|
+
};
|
|
731
811
|
|
|
732
812
|
declare interface RawUser {
|
|
733
813
|
id: number;
|
|
@@ -911,7 +991,7 @@ declare class ToolkitApp {
|
|
|
911
991
|
private disposables;
|
|
912
992
|
private tokenUpdateReactions;
|
|
913
993
|
constructor(name: string);
|
|
914
|
-
init({ token, tokenStorage: storage, tokenStorageKey, apiUrl, tokenServiceUrl
|
|
994
|
+
init({ token, tokenStorage: storage, tokenStorageKey, apiUrl, tokenServiceUrl }: InitParams, name?: string): ToolkitApp;
|
|
915
995
|
dispose: () => void;
|
|
916
996
|
/**
|
|
917
997
|
* Adds a reaction to token changes
|
package/dist/core.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{reaction as e,computed as t,runInAction as r,makeObservable as n,observable as i,action as a,when as s}from"mobx";import{Subject as o,BehaviorSubject as l,EMPTY as u,timer as c,throwError as d,Observable as h,of as f,Subscription as b}from"rxjs";import{filter as p,switchMap as v,delay as m,take as g,mergeMap as y,catchError as w,takeUntil as j,retryWhen as O,startWith as k,pairwise as I,concatMap as P,flatMap as T,shareReplay as S,map as B,tap as C,share as _,skip as A,expand as E}from"rxjs/operators";import U from"jqueryless-signalr";import q from"http-status-codes";import R from"crossfilter2";import D from"string-natural-compare";import x from"material-colors";import N from"react";function M(e){return null!=e}function F(){return e=>e.pipe(p(M))}const z={archives:{PopulateArchive:null,GetArchives:null,GetClips:null,UpdateClip:null,DeleteClip:null,SaveClip:null,SaveTimelaps:null,SaveArchive:null,DeleteArchive:null,ShareClip:null,GetSharedClips:null,UpdateSharedClip:null,DeleteSharedClip:null},cameras:{GetCameras:null,GetSensorDataSchema:null,GetMotionEvents:null,GetSensorEvents:null,GetSensorEventsPage:null,AddUserSensorEvent:null,AcknowledgeSensorEvent:null,MoveCamera:null,GoHomePtzCamera:null,SetHomePtzCamera:null},camgroups:{GetCamgroups:null,DeleteCamgroup:null,AddCamgroup:null,UpdateCamgroup:null},sound:{GetPushSoundServiceUrl:null},thumbnails:{GetThumbnailsInfo:null,GetThumbnailInfo:null,GetHeatMapsInfo:null},users:{GetUser:null,UserUpdateProfile:null}},$={cameras:[{name:"OnCameraMotionEvent",explicit:!0},{name:"OnCameraAdded"},{name:"OnCameraUpdated"},{name:"OnSystemCameraUpdated"},{name:"OnCameraDeleted"}],users:[{name:"OnUserUpdateProfile"}],camgroups:[{name:"OnAdd"},{name:"OnUpdate"},{name:"OnDelete"}],archives:[{name:"OnTimelapsAdded"},{name:"OnClipAdded"},{name:"OnClipUpdated"},{name:"OnClipDeleted"},{name:"OnArchiveAdded"},{name:"OnArchiveUpdated"},{name:"OnArchiveDeleted"},{name:"OnArchiveRecordCreated"}]};var G,L;!function(e){e[e.CONNECTING=0]="CONNECTING",e[e.CONNECTED=1]="CONNECTED",e[e.RECONNECTING=2]="RECONNECTING",e[e.DISCONNECTED=3]="DISCONNECTED"}(G||(G={}));class W{constructor(t,r,n){Object.defineProperty(this,"connectionShutdown$",{enumerable:!0,configurable:!0,writable:!0,value:new o}),Object.defineProperty(this,"connection$",{enumerable:!0,configurable:!0,writable:!0,value:new l(null)}),Object.defineProperty(this,"events",{enumerable:!0,configurable:!0,writable:!0,value:new o}),Object.defineProperty(this,"logging",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"authStore",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"createConnection",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"apiConfig",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.apiConfig=t,this.init(),this.createConnection=n,this.authStore=r,e((()=>r.token),(e=>{if(!e)return void this.shutdownConnection();if(e.invalid)return;if(!e.accessToken)return;const t=this.connection$.getValue();t&&t.state!==G.DISCONNECTED?t.qs.access_token=e.accessToken:this.connect(e)})),this.connection$.pipe(v((e=>null!==e||!r.isAuthenticated||r.token&&r.token.invalid?u:(this.logging&&console.warn("disconnected by some reason"),c(5e3)))),p((()=>r.isAuthenticated&&!!r.token&&!r.token.invalid))).subscribe((()=>{this.connect(r.token),this.logging&&console.warn("attempting to reconnect")})),this.connection$.pipe(F(),m(100)).subscribe(this.subscribeToEvents)}static create(e,t,r){return new W(null!==e?e:z,t,r)}connect(e){if(this.connection$.getValue()&&this.connection$.getValue().state===G.CONNECTED)return;const{accessToken:t}=e,r=this.createConnection(t);Object.keys(this.apiConfig).forEach((e=>r.createHubProxy(e))),Object.entries($).forEach((([e,t])=>{t&&r.proxies[e]&&t.forEach((({name:t})=>{r.proxies[e].on(t,(r=>this.events.next({hub:e,event:t,data:r})))}))})),r.start().done((()=>{this.logging&&console.warn("connected"),this.connection$.next(r)})).fail((e=>{var t,r,n;401!==(null===(t=e.source)||void 0===t?void 0:t.status)&&403!==(null===(r=e.source)||void 0===r?void 0:r.status)&&409!==(null===(n=e.source)||void 0===n?void 0:n.status)||this.authStore.invalidateToken()})),r.error((e=>{if(e.source&&(401===e.source.status||403===e.source.status||409===e.source.status))return this.logging&&console.warn("authentication error, invalidating token"),this.authStore.invalidateToken()})),r.disconnected((()=>{this.connection$.getValue()?this.logging&&console.warn("disconnected",this.connection$.getValue().lastError):this.logging&&console.warn("disconnected. this connection is already null"),this.connection$.next(null)})),r.reconnecting((()=>console.log("reconnecting"))),r.reconnected((()=>{this.connection$.getValue()===r&&(this.logging&&console.warn("reconnected"),this.connection$.next(r))}))}shutdownConnection(){const e=this.connection$.getValue();e&&e.stop(),this.connectionShutdown$.next(null)}init(){Object.keys(this.apiConfig).forEach((e=>{this[e]={},Object.keys(this.apiConfig[e]).forEach((t=>{this[e][t]=this.createHubMethod(e,t)}))}))}createHubMethod(e,t){const r=this;return function n(...i){return r.connection$.pipe(F(),p((e=>e.state===G.CONNECTED)),g(1)).pipe(y((r=>new Promise(((n,a)=>{r.proxies[e].invoke(t,...i).done((e=>n(e))).fail((e=>a(e)))})))),w((e=>!e.message||"Connection started reconnecting before invocation result was received."!==e.message&&"Connection was disconnected before invocation result was received."!==e.message?e.message&&e.message.startsWith("Caller is not authorized to invoke the ")?(console.warn(e.message),r.connection$.getValue().stop(),r.authStore.invalidateToken(),n(...i)):d(e):(console.warn(e.message),n(...i)))),j(r.connectionShutdown$))}}subscribeToEvents(e){Object.entries($).forEach((([t,r])=>{r&&e.proxies[t]&&r.filter((({explicit:e})=>e)).forEach((({name:r})=>{e.proxies[t].invoke("SubscribeToEvent",r)}))}))}}class V{constructor(e){Object.defineProperty(this,"accessToken",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"accessTokenExpires",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"accessTokenIssued",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"clientId",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"expiresIn",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"refreshToken",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"refreshTokenExpires",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"refreshTokenIssued",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"tokenType",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"userName",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"invalid",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"widgetId",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"widgetToken",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"json",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.json=e,this.accessToken=e.access_token||e.accessToken,this.accessTokenExpires=new Date(e.access_token_expires||e.accessTokenExpires),this.accessTokenIssued=new Date(e.access_token_issued||e.accessTokenIssued),this.clientId=e.client_id||e.clientId,this.expiresIn=e.expires_in||e.expiresIn,this.refreshToken=e.refresh_token||e.refreshToken,this.refreshTokenExpires=new Date(e.refresh_token_expires||e.refreshTokenExpires),this.refreshTokenIssued=new Date(e.refresh_token_issued||e.refreshTokenIssued),this.tokenType=e.token_type||e.tokenType,this.userName=e.userName,this.widgetId=e.widgetId,this.widgetToken=e.widgetToken,this.invalid=!1}}class K{constructor({tokenServiceUrl:e,widgetTokenServiceUrl:s,storage:o,tokenStorageKey:l,deviceInfo:b,clientId:m}){Object.defineProperty(this,"token",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"isAuthenticating",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"storage",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"tokenServiceUrl",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"tokenStorageKey",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"widgetTokenServiceUrl",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"deviceInfo",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"clientId",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"pendingUpdateTokenRequest",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"signOut",{enumerable:!0,configurable:!0,writable:!0,value:()=>{this.isAuthenticating||r((()=>this.token=null))}}),Object.defineProperty(this,"signIn",{enumerable:!0,configurable:!0,writable:!0,value:({username:e,password:t,tokenToKick:n,agreedWithTerms:i})=>{if(this.isAuthenticating)return;r((()=>this.isAuthenticating=!0));const a={username:e,password:t};n&&(a.kick_refresh_token=n),i&&(a.agree_with_terms=!0);return this.fetchTokenBy("password",a).then((e=>(r((()=>{this.token=e,this.isAuthenticating=!1})),e))).catch((e=>{throw r((()=>{this.isAuthenticating=!1})),e}))}}),Object.defineProperty(this,"invalidateToken",{enumerable:!0,configurable:!0,writable:!0,value:()=>{this.token&&r((()=>{this.token=Object.assign(Object.assign({},this.token),{invalid:!0})}))}}),n(this,{token:i.ref,isAuthenticating:i,isAuthenticated:t,signOut:a,invalidateToken:a}),this.isAuthenticating=!0,this.storage=o,this.tokenServiceUrl=e,this.widgetTokenServiceUrl=s,this.tokenStorageKey=l,this.deviceInfo=b,this.clientId=m;const g=function(e,r=!1){const n=t(e);return new h((e=>{const t=n.observe_((({newValue:t})=>e.next(t)),r);return()=>t()}))}((()=>this.token)),j=g.pipe(v((e=>{if(null===e)return u;const t=f(e).pipe(y((e=>e.widgetId?this.fetchWidgetToken(e):this.updateToken(e.refreshToken))),O((e=>e.pipe(y((e=>!e.status||401!==e.status&&403!==e.status&&409!==e.status?e.error&&"refresh_token_error"===e.error||"invalid_grant"===e.error?d(e):c(5e3):d(e)))))));if(!e.invalid){const r=Math.max(.75*(+e.accessTokenExpires-Date.now()),0);return c(r).pipe(y((()=>t)))}return t})),w((e=>(console.error(e),r((()=>this.token=null)),j))));j.subscribe((e=>{r((()=>this.token=e))})),g.pipe(k(null),I(),p((([e,t])=>!!(t||!t&&e))),P((([,e])=>this.storeToken(e)))).subscribe(),this.getInitialToken().then((e=>{r((()=>{this.token=e,this.isAuthenticating=!1}))}))}get isAuthenticated(){return Boolean(this.token&&!this.isAuthenticating)}async getTokenFromStorage(){const e=await this.storage.getItem(this.tokenStorageKey);return e?new V(JSON.parse(e)):null}async storeToken(e){return!e||e.invalid?this.storage.removeItem(this.tokenStorageKey):this.storage.setItem(this.tokenStorageKey,JSON.stringify(e.json))}async getInitialToken(){const e=await this.getTokenFromStorage();return e||null}async fetchTokenBy(e,t){const r=Object.assign({grant_type:e,client_id:this.clientId,device:this.deviceInfo},t),n=Object.keys(r).map((e=>`${e}=${encodeURIComponent(r[e])}`)).join("&"),i=new Headers;i.append("Content-Type","application/x-www-form-urlencoded"),i.append("accept","application/json");const a=await fetch(this.tokenServiceUrl,{method:"POST",headers:i,body:n});try{const e=await a.json();return 200!==a.status?Promise.reject({status:a.status,data:e}):new V(e)}catch(e){return Promise.reject(a)}}async updateToken(e){var t;try{return this.pendingUpdateTokenRequest&&this.pendingUpdateTokenRequest.refreshToken===e||(this.pendingUpdateTokenRequest={refreshToken:e,request:this.fetchTokenBy("refresh_token",{refresh_token:e})}),await this.pendingUpdateTokenRequest.request}finally{(null===(t=this.pendingUpdateTokenRequest)||void 0===t?void 0:t.refreshToken)===e&&(this.pendingUpdateTokenRequest=null)}}async fetchWidgetToken(e){const{widgetId:t,widgetToken:r}=e;if(!t||!r)throw new Error("token must contain widgetId and widgetToken");if(!this.widgetTokenServiceUrl)throw new Error("please set widgetTokenServiceUrl");const n={widgetId:t,userKey:r},i=new Headers;i.append("Content-Type","application/x-www-form-urlencoded"),i.append("accept","application/json");const a=Object.keys(n).map((e=>`${e}=${encodeURIComponent(n[e])}`)).join("&"),s=await fetch(this.widgetTokenServiceUrl,{method:"POST",headers:i,body:a});try{const e=await s.json();return 200!==s.status?Promise.reject({status:s.status,data:e}):new V(Object.assign({widgetId:t,widgetToken:r},e))}catch(e){return Promise.reject(s)}}}!function(e){e[e.Motion=0]="Motion",e[e.Tampering=1]="Tampering",e[e.PanTiltZoom=2]="PanTiltZoom",e[e.CrossLine=3]="CrossLine",e[e.Intrusion=4]="Intrusion",e[e.LicensePlate=5]="LicensePlate",e[e.FaceDetection=6]="FaceDetection",e[e.Audio=7]="Audio",e[e.Analytic=8]="Analytic",e[e.SpeedDetection=9]="SpeedDetection",e[e.PeopleCounter=10]="PeopleCounter",e[e.Temperature=11]="Temperature",e[e.PoS=12]="PoS",e[e.GPS=13]="GPS",e[e.DigitalInput=14]="DigitalInput",e[e.Normal=15]="Normal",e[e.Suspicious=16]="Suspicious",e[e.Loitering=17]="Loitering",e[e.Vandalism=18]="Vandalism",e[e.Trespass=19]="Trespass",e[e.Emergency=20]="Emergency",e[e.LifeInDanger=21]="LifeInDanger",e[e.ErroneousAlert=22]="ErroneousAlert",e[e.Misidentification=23]="Misidentification",e[e.Fire=24]="Fire",e[e.MedicalDuress=25]="MedicalDuress",e[e.HoldUp=26]="HoldUp",e[e.CheckIn=27]="CheckIn",e[e.CheckOut=28]="CheckOut",e[e.ClockIn=29]="ClockIn",e[e.ClockOut=30]="ClockOut",e[e.ParkingStart=31]="ParkingStart",e[e.ParkingEnd=32]="ParkingEnd",e[e.ParkingViolation=33]="ParkingViolation",e[e.GateAccess=34]="GateAccess",e[e.DoorAccess=35]="DoorAccess",e[e.TemperatureCheck=36]="TemperatureCheck",e[e.IDCheck=37]="IDCheck",e[e.PPECheck=38]="PPECheck",e[e.WelfareCheck=39]="WelfareCheck",e[e.Uncategorized=40]="Uncategorized",e[e.Unknown=999]="Unknown"}(L||(L={}));class H{constructor(){Object.defineProperty(this,"values",{enumerable:!0,configurable:!0,writable:!0,value:new Map})}getItem(e){return this.values.get(e)||null}setItem(e,t){this.values.set(e,t)}removeItem(e){this.values.delete(e)}}let J=[];function Z(){return Array.isArray(J)?J[0]:J}class Q{constructor(){Object.defineProperty(this,"api",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"disposables",{enumerable:!0,configurable:!0,writable:!0,value:[]})}initWith(e){this.api=e,this.afterInit&&this.afterInit()}dispose(){this.disposables.forEach((e=>{e instanceof b?e.closed||e.unsubscribe():e()}))}}class X extends Q{constructor(e){super(),Object.defineProperty(this,"notification",{enumerable:!0,configurable:!0,writable:!0,value:e}),Object.defineProperty(this,"user",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"camerasPermissions",{enumerable:!0,configurable:!0,writable:!0,value:new Map}),Object.defineProperty(this,"auth",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"updateCustomPreferences",{enumerable:!0,configurable:!0,writable:!0,value:e=>{if(!this.user)return d("user is not initialized");const t={id:this.user.id,jsonField:JSON.stringify({...JSON.parse(this.user.jsonField||"{}"),...e}),version:this.user.version},r=this.api.users.UserUpdateProfile(t).pipe(T((e=>e.success?f(e.resultItems[0]):d(e.error))),S());return r.subscribe((e=>{this.setUser(e)})),r}}),Object.defineProperty(this,"getPreference",{enumerable:!0,configurable:!0,writable:!0,value:e=>{var t;try{return JSON.parse((null===(t=this.user)||void 0===t?void 0:t.jsonField)||"{}")[e]}catch{return null}}}),n(this,{user:i.ref,setUser:a,camerasPermissions:i,userDisplayName:t}),s((()=>!!this.user),(()=>{this.fetchPermissions()}))}get userDisplayName(){return this.user?this.user.firstName&&this.user.firstName.trim()||this.user.lastName&&this.user.lastName.trim()?[this.user.firstName,this.user.lastName].filter(Boolean).join(" ").trim():this.user.email:null}afterInit(){this.api.users.GetUser().pipe(T((e=>e.success?f(e.resultItems[0]):d(e.error)))).subscribe((e=>this.setUser(e)),(()=>console.error("Couldn't get user")))}setUser(e){this.user=e}setAuthStore(e){this.auth=e}async updateUserPassword(e){var t,r;const n=Z().changePasswordUrl,i=null===(r=null===(t=this.auth)||void 0===t?void 0:t.token)||void 0===r?void 0:r.accessToken,a=JSON.stringify({currentPassword:e.previous,newPassword:e.new}),s=new Headers;s.append("content-type","application/json"),s.append("accept","application/json"),s.append("authorization",`bearer ${i}`);const o=await fetch(n,{method:"PUT",headers:s,body:a}),{status:l}=o;if(l!==q.OK){const e=await o.json();throw new Error(e.errors[0].message)}}async fetchPermissions(){var e,t;if(!Z())return;const r=Z().userPermissionsUrl;if(!r)return console.warn("user permissions URL is missing in config");const n=null===(t=null===(e=this.auth)||void 0===e?void 0:e.token)||void 0===t?void 0:t.accessToken,i=new Headers;i.append("content-type","application/json"),i.append("accept","application/json"),i.append("authorization",`bearer ${n}`);const a=await fetch(r,{headers:i}),{status:s}=a;if(s!==q.OK){const e=await a.json();throw new Error(e.errors[0].message)}(await a.json()).securables.forEach((e=>{"camera"===e.securableType&&this.camerasPermissions.set(e.securableId,e.permissions)}))}updateUserSettings({firstName:e,lastName:t}){if(!this.user)return d("user is not initialized");const r={id:this.user.id,firstName:e,lastName:t,version:this.user.version},n=this.api.users.UserUpdateProfile(r).pipe(T((e=>e.success?f(e.resultItems[0]):d(e.error))),S());return n.subscribe((e=>{this.setUser(e)})),n}setDefaultGroup(e){if(!this.user)return;const t={id:this.user.id,layoutStartId:e,layoutStartType:"camgroup",version:this.user.version},r=this.api.users.UserUpdateProfile(t).pipe(T((e=>e.success?f(e.resultItems[0]):d(e.error))),S());return r.subscribe((e=>{var t;this.setUser(e),null===(t=this.notification)||void 0===t||t.success("Successfully set default group")}),(e=>{var t;console.error(e),null===(t=this.notification)||void 0===t||t.error(e.message)})),r}}class Y{constructor(e){Object.defineProperty(this,"json",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"startTime",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"endTime",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"streamUrl",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"duration",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"isLive",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"cameraId",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"id",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.json=JSON.stringify(e,null,2),this.startTime=new Date(e.startTime),this.endTime=new Date(e.endTime),this.streamUrl=e.streamUrl,this.cameraId=e.cameraId,this.duration=e.duration,this.id=e.id}}window.ArchiveChunk=Y;class ee extends Q{constructor(){super(),Object.defineProperty(this,"data",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"chunksByCameraId",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"chunksByStart",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"chunksByEnd",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"chunksById",{enumerable:!0,configurable:!0,writable:!0,value:new Map}),Object.defineProperty(this,"pendingRequests",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"pendingRequestsByEnd",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"pendingRequestsByStart",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"pendingRequestsByCameraId",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"knownIntervals",{enumerable:!0,configurable:!0,writable:!0,value:new Map}),Object.defineProperty(this,"updates",{enumerable:!0,configurable:!0,writable:!0,value:0}),n(this,{updates:i,add:a.bound}),this.data=R(),this.chunksByCameraId=this.data.dimension((e=>e.cameraId)),this.chunksByStart=this.data.dimension((e=>+e.startTime)),this.chunksByEnd=this.data.dimension((e=>+e.endTime)),this.pendingRequests=R(),this.pendingRequestsByStart=this.pendingRequests.dimension((e=>+e.startTime)),this.pendingRequestsByEnd=this.pendingRequests.dimension((e=>+e.endTime)),this.pendingRequestsByCameraId=this.pendingRequests.dimension((e=>e.cameraId))}fetch(e,t,r){this.pendingRequestsByCameraId.filter(e),this.pendingRequestsByStart.filter(t),this.pendingRequestsByEnd.filter(r);const n=this.pendingRequests.allFiltered()[0];if(this.pendingRequestsByCameraId.filterAll(),this.pendingRequestsByStart.filterAll(),this.pendingRequestsByEnd.filterAll(),n)return n.request;if(this.knownIntervals.has(e)){const[n,i]=this.knownIntervals.get(e);if(n<=t&&i>=r)return f(this.getChunks({cameraId:e,from:t,to:r}));n<=t&&i<r&&(t=i),n>t&&i>=r&&(r=n),r<n&&(r=n),t>i&&(t=i)}const i=this.api.archives.PopulateArchive({cameraId:e,startTime:t,endTime:r}).pipe(B((e=>e.resultItems[0].chunks.map((e=>new Y(e))))),C(this.add),C((t=>this.extendKnownInterval(e,t))),S());return this.pendingRequests.add([{cameraId:e,startTime:t,endTime:r,request:i}]),i.pipe(C((()=>this.pendingRequests.remove((e=>e.request===i))))).subscribe(),i}extendKnownInterval(e,t){const r=new Date(Math.min(...t.map((e=>+e.startTime)))),n=new Date(Math.max(...t.map((e=>+e.endTime))));if(this.knownIntervals.has(e)){const t=this.knownIntervals.get(e);r<t[0]&&(t[0]=r),n>t[1]&&(t[1]=n)}else this.knownIntervals.set(e,[r,n])}add(e){const t=e.filter((e=>!this.chunksById.has(e.id)));t.forEach((e=>this.chunksById.set(e.id,e))),this.data.add(t),t.length&&this.updates++}getChunks({cameraId:e,from:t,to:r}){this.chunksByStart.filter([-1/0,+r+5e-4]),this.chunksByEnd.filter([t,1/0]),e&&this.chunksByCameraId.filter(e);const n=this.chunksByStart.top(1/0);return e&&this.chunksByCameraId.filterAll(),this.chunksByStart.filterAll(),this.chunksByEnd.filterAll(),n}findClosestChunk({cameraId:e,time:t}){this.chunksByCameraId.filter(e),this.chunksByEnd.filter([t,1/0]);const r=this.chunksByStart.bottom(1);return this.chunksByCameraId.filterAll(),this.chunksByEnd.filterAll(),r[0]}afterInit(){this.api.events.pipe(p((({hub:e,event:t})=>"archives"===e&&"OnArchiveChunksCreated"===t))).subscribe((({data:e})=>{this.add(e.resultItems.map((e=>new Y(e))))}))}}class te{constructor(e){Object.defineProperty(this,"id",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"imageUrl",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"streamUrl",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"dashStreamUrl",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"address",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"archiveDuration",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"dvrWindowLength",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"stateUpdatedAt",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"raw",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"enabled",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"isMicEnabled",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"state",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"pin",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"webRtcUrl",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"isPtz",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"update",{enumerable:!0,configurable:!0,writable:!0,value:e=>{this.raw=e,this.id=e.id,this.name=e.name,this.isPtz=e.isPTZ,this.isMicEnabled=e.isMicEnabled,this.imageUrl=e.imageUrl,this.address=e.cameraAddress?JSON.parse(e.cameraAddress):null,this.streamUrl=e.streamUrl,this.dashStreamUrl=e.dashStreamUrl,this.enabled=e.enabled,this.state=this.raw.cameraState,this.dvrWindowLength=e.dvrWindowLength?1e3*e.dvrWindowLength:e.dvrWindowLength,this.archiveDuration=e.archiveDuration,this.pin=e.pin,this.webRtcUrl=e.webRtcUrl,this.stateUpdatedAt=new Date(e.cameraStateChangedTime)}}),n(this,{name:i,streamUrl:i,dashStreamUrl:i,enabled:i,isMicEnabled:i,state:i,pin:i,webRtcUrl:i,isOnline:t,update:a}),this.update(e)}get isOnline(){return this.enabled&&"Started"===this.state}get supportsWebRTC(){return!!this.webRtcUrl}}class re extends Q{constructor(){super(),Object.defineProperty(this,"camerasById",{enumerable:!0,configurable:!0,writable:!0,value:new Map}),Object.defineProperty(this,"data",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"loading",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"loaded",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"load",{enumerable:!0,configurable:!0,writable:!0,value:()=>{if(this.loaded)return;r((()=>this.loading=!0));const e=this.api.cameras.GetCameras({},null).pipe(T((e=>e.success?f(e.resultItems):(console.error(e.error),d(e.error)))),_());return e.subscribe((e=>{r((()=>{this.add(e),this.loading=!1,this.loaded=!0}))})),e}}),Object.defineProperty(this,"add",{enumerable:!0,configurable:!0,writable:!0,value:e=>{e.forEach((e=>{this.camerasById.has(e.id)?this.camerasById.get(e.id).update(e):this.camerasById.set(e.id,new te(e))})),this.data=Array.from(this.camerasById.values()).sort(((e,t)=>D.caseInsensitive(e.name,t.name)))}}),Object.defineProperty(this,"sync",{enumerable:!0,configurable:!0,writable:!0,value:()=>{const e=this.data.reduce(((e,t)=>Math.max(e,+t.stateUpdatedAt)),0);e&&this.api.cameras.GetCameras({},new Date(1e3*(Math.floor(e/1e3)+1))).pipe(T((e=>e.success?f(e.resultItems):(console.error(e.error),d(e.error))))).subscribe((e=>this.add(e)))}}),n(this,{data:i.ref,loading:i,loaded:i,add:a}),this.disposables.push(s((()=>this.loaded),(()=>{this.api.connection$.pipe(A(1)).subscribe(this.sync)})))}afterInit(){this.disposables.push(this.api.events.pipe(p((({hub:e,event:t})=>"cameras"===e&&("OnCameraUpdated"===t||"OnSystemCameraUpdated"===t))),B((({data:e})=>e.resultItems?e.resultItems[0]:e))).subscribe((e=>{const t=this.camerasById.get(e.id);if(!t)return console.warn("got update for unknown camera:",e.id);t.update(e)})))}dispose(){super.dispose(),this.camerasById.clear(),this.data=[]}}const ne={Person:"red",Car:"green",Animal:"blue"},ie=["green","red","blue","purple","teal","amber","pink","cyan","lightGreen","deepOrange","deepPurple","lime","indigo","orange","lightBlue"];class ae extends Q{constructor(){super(),Object.defineProperty(this,"schemaDescription",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"fetchAnalyticEventSchema",{enumerable:!0,configurable:!0,writable:!0,value:()=>{this.api.cameras.GetSensorDataSchema("Analytic").subscribe((e=>{e.success?this.schemaDescription=e.resultItems:console.error(e)}),console.error)}}),n(this,{schemaDescription:i.ref,foundObjectTypes:t,foundObjectTypesForSelect:t,colorsByFoundObjectType:t})}get foundObjectTypes(){if(!this.schemaDescription.length)return[];const e=this.schemaDescription.filter((e=>"filter"===e.parameterType&&"Type"===e.fieldName&&"Analytic"===e.eventType))[0];return e?e.valueSet.split(", "):[]}get foundObjectTypesForSelect(){const e=Object.entries(ne).filter((([e])=>this.foundObjectTypes.includes(e))).map((([,e])=>e)),t=ie.filter((t=>!e.includes(t)));let r=0;return this.foundObjectTypes.map((e=>{const n=e in ne?ne[e]:t[r++],i=x[n];return{id:e,name:e.toLowerCase(),color:i[500],highlightColor:i.a400,isEventType:!0}}))}get colorsByFoundObjectType(){const e=new Map;return this.foundObjectTypesForSelect.forEach((t=>{e.set(t.id,t.highlightColor)})),e}afterInit(){this.fetchAnalyticEventSchema()}dispose(){super.dispose(),this.schemaDescription=[]}}var se=function(e,t,r,n){for(var i=-1,a=null==e?0:e.length;++i<a;){var s=e[i];t(n,s,r(s),e)}return n};var oe=function(e){return function(t,r,n){for(var i=-1,a=Object(t),s=n(t),o=s.length;o--;){var l=s[e?o:++i];if(!1===r(a[l],l,a))break}return t}}();var le=function(e,t){for(var r=-1,n=Array(e);++r<e;)n[r]=t(r);return n},ue="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function ce(e){var t={exports:{}};return e(t,t.exports),t.exports}var de="object"==typeof ue&&ue&&ue.Object===Object&&ue,he="object"==typeof self&&self&&self.Object===Object&&self,fe=de||he||Function("return this")(),be=fe.Symbol,pe=Object.prototype,ve=pe.hasOwnProperty,me=pe.toString,ge=be?be.toStringTag:void 0;var ye=function(e){var t=ve.call(e,ge),r=e[ge];try{e[ge]=void 0;var n=!0}catch(e){}var i=me.call(e);return n&&(t?e[ge]=r:delete e[ge]),i},we=Object.prototype.toString;var je=function(e){return we.call(e)},Oe=be?be.toStringTag:void 0;var ke=function(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":Oe&&Oe in Object(e)?ye(e):je(e)};var Ie=function(e){return null!=e&&"object"==typeof e};var Pe=function(e){return Ie(e)&&"[object Arguments]"==ke(e)},Te=Object.prototype,Se=Te.hasOwnProperty,Be=Te.propertyIsEnumerable,Ce=Pe(function(){return arguments}())?Pe:function(e){return Ie(e)&&Se.call(e,"callee")&&!Be.call(e,"callee")},_e=Array.isArray;var Ae=function(){return!1},Ee=ce((function(e,t){var r=t&&!t.nodeType&&t,n=r&&e&&!e.nodeType&&e,i=n&&n.exports===r?fe.Buffer:void 0,a=(i?i.isBuffer:void 0)||Ae;e.exports=a})),Ue=/^(?:0|[1-9]\d*)$/;var qe=function(e,t){var r=typeof e;return!!(t=null==t?9007199254740991:t)&&("number"==r||"symbol"!=r&&Ue.test(e))&&e>-1&&e%1==0&&e<t};var Re=function(e){return"number"==typeof e&&e>-1&&e%1==0&&e<=9007199254740991},De={};De["[object Float32Array]"]=De["[object Float64Array]"]=De["[object Int8Array]"]=De["[object Int16Array]"]=De["[object Int32Array]"]=De["[object Uint8Array]"]=De["[object Uint8ClampedArray]"]=De["[object Uint16Array]"]=De["[object Uint32Array]"]=!0,De["[object Arguments]"]=De["[object Array]"]=De["[object ArrayBuffer]"]=De["[object Boolean]"]=De["[object DataView]"]=De["[object Date]"]=De["[object Error]"]=De["[object Function]"]=De["[object Map]"]=De["[object Number]"]=De["[object Object]"]=De["[object RegExp]"]=De["[object Set]"]=De["[object String]"]=De["[object WeakMap]"]=!1;var xe=function(e){return Ie(e)&&Re(e.length)&&!!De[ke(e)]};var Ne=function(e){return function(t){return e(t)}},Me=ce((function(e,t){var r=t&&!t.nodeType&&t,n=r&&e&&!e.nodeType&&e,i=n&&n.exports===r&&de.process,a=function(){try{var e=n&&n.require&&n.require("util").types;return e||i&&i.binding&&i.binding("util")}catch(e){}}();e.exports=a})),Fe=Me&&Me.isTypedArray,ze=Fe?Ne(Fe):xe,$e=Object.prototype.hasOwnProperty;var Ge=function(e,t){var r=_e(e),n=!r&&Ce(e),i=!r&&!n&&Ee(e),a=!r&&!n&&!i&&ze(e),s=r||n||i||a,o=s?le(e.length,String):[],l=o.length;for(var u in e)!t&&!$e.call(e,u)||s&&("length"==u||i&&("offset"==u||"parent"==u)||a&&("buffer"==u||"byteLength"==u||"byteOffset"==u)||qe(u,l))||o.push(u);return o},Le=Object.prototype;var We=function(e){var t=e&&e.constructor;return e===("function"==typeof t&&t.prototype||Le)};var Ve=function(e,t){return function(r){return e(t(r))}}(Object.keys,Object),Ke=Object.prototype.hasOwnProperty;var He=function(e){if(!We(e))return Ve(e);var t=[];for(var r in Object(e))Ke.call(e,r)&&"constructor"!=r&&t.push(r);return t};var Je=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)};var Ze=function(e){if(!Je(e))return!1;var t=ke(e);return"[object Function]"==t||"[object GeneratorFunction]"==t||"[object AsyncFunction]"==t||"[object Proxy]"==t};var Qe=function(e){return null!=e&&Re(e.length)&&!Ze(e)};var Xe=function(e){return Qe(e)?Ge(e):He(e)};var Ye=function(e,t){return function(r,n){if(null==r)return r;if(!Qe(r))return e(r,n);for(var i=r.length,a=t?i:-1,s=Object(r);(t?a--:++a<i)&&!1!==n(s[a],a,s););return r}}((function(e,t){return e&&oe(e,t,Xe)}));var et=function(e,t,r,n){return Ye(e,(function(e,i,a){t(n,e,r(e),a)})),n};var tt=function(){this.__data__=[],this.size=0};var rt=function(e,t){return e===t||e!=e&&t!=t};var nt=function(e,t){for(var r=e.length;r--;)if(rt(e[r][0],t))return r;return-1},it=Array.prototype.splice;var at=function(e){var t=this.__data__,r=nt(t,e);return!(r<0)&&(r==t.length-1?t.pop():it.call(t,r,1),--this.size,!0)};var st=function(e){var t=this.__data__,r=nt(t,e);return r<0?void 0:t[r][1]};var ot=function(e){return nt(this.__data__,e)>-1};var lt=function(e,t){var r=this.__data__,n=nt(r,e);return n<0?(++this.size,r.push([e,t])):r[n][1]=t,this};function ut(e){var t=-1,r=null==e?0:e.length;for(this.clear();++t<r;){var n=e[t];this.set(n[0],n[1])}}ut.prototype.clear=tt,ut.prototype.delete=at,ut.prototype.get=st,ut.prototype.has=ot,ut.prototype.set=lt;var ct=ut;var dt=function(){this.__data__=new ct,this.size=0};var ht=function(e){var t=this.__data__,r=t.delete(e);return this.size=t.size,r};var ft=function(e){return this.__data__.get(e)};var bt,pt=function(e){return this.__data__.has(e)},vt=fe["__core-js_shared__"],mt=(bt=/[^.]+$/.exec(vt&&vt.keys&&vt.keys.IE_PROTO||""))?"Symbol(src)_1."+bt:"";var gt=function(e){return!!mt&&mt in e},yt=Function.prototype.toString;var wt=function(e){if(null!=e){try{return yt.call(e)}catch(e){}try{return e+""}catch(e){}}return""},jt=/^\[object .+?Constructor\]$/,Ot=Function.prototype,kt=Object.prototype,It=Ot.toString,Pt=kt.hasOwnProperty,Tt=RegExp("^"+It.call(Pt).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");var St=function(e){return!(!Je(e)||gt(e))&&(Ze(e)?Tt:jt).test(wt(e))};var Bt=function(e,t){return null==e?void 0:e[t]};var Ct=function(e,t){var r=Bt(e,t);return St(r)?r:void 0},_t=Ct(fe,"Map"),At=Ct(Object,"create");var Et=function(){this.__data__=At?At(null):{},this.size=0};var Ut=function(e){var t=this.has(e)&&delete this.__data__[e];return this.size-=t?1:0,t},qt=Object.prototype.hasOwnProperty;var Rt=function(e){var t=this.__data__;if(At){var r=t[e];return"__lodash_hash_undefined__"===r?void 0:r}return qt.call(t,e)?t[e]:void 0},Dt=Object.prototype.hasOwnProperty;var xt=function(e){var t=this.__data__;return At?void 0!==t[e]:Dt.call(t,e)};var Nt=function(e,t){var r=this.__data__;return this.size+=this.has(e)?0:1,r[e]=At&&void 0===t?"__lodash_hash_undefined__":t,this};function Mt(e){var t=-1,r=null==e?0:e.length;for(this.clear();++t<r;){var n=e[t];this.set(n[0],n[1])}}Mt.prototype.clear=Et,Mt.prototype.delete=Ut,Mt.prototype.get=Rt,Mt.prototype.has=xt,Mt.prototype.set=Nt;var Ft=Mt;var zt=function(){this.size=0,this.__data__={hash:new Ft,map:new(_t||ct),string:new Ft}};var $t=function(e){var t=typeof e;return"string"==t||"number"==t||"symbol"==t||"boolean"==t?"__proto__"!==e:null===e};var Gt=function(e,t){var r=e.__data__;return $t(t)?r["string"==typeof t?"string":"hash"]:r.map};var Lt=function(e){var t=Gt(this,e).delete(e);return this.size-=t?1:0,t};var Wt=function(e){return Gt(this,e).get(e)};var Vt=function(e){return Gt(this,e).has(e)};var Kt=function(e,t){var r=Gt(this,e),n=r.size;return r.set(e,t),this.size+=r.size==n?0:1,this};function Ht(e){var t=-1,r=null==e?0:e.length;for(this.clear();++t<r;){var n=e[t];this.set(n[0],n[1])}}Ht.prototype.clear=zt,Ht.prototype.delete=Lt,Ht.prototype.get=Wt,Ht.prototype.has=Vt,Ht.prototype.set=Kt;var Jt=Ht;var Zt=function(e,t){var r=this.__data__;if(r instanceof ct){var n=r.__data__;if(!_t||n.length<199)return n.push([e,t]),this.size=++r.size,this;r=this.__data__=new Jt(n)}return r.set(e,t),this.size=r.size,this};function Qt(e){var t=this.__data__=new ct(e);this.size=t.size}Qt.prototype.clear=dt,Qt.prototype.delete=ht,Qt.prototype.get=ft,Qt.prototype.has=pt,Qt.prototype.set=Zt;var Xt=Qt;var Yt=function(e){return this.__data__.set(e,"__lodash_hash_undefined__"),this};var er=function(e){return this.__data__.has(e)};function tr(e){var t=-1,r=null==e?0:e.length;for(this.__data__=new Jt;++t<r;)this.add(e[t])}tr.prototype.add=tr.prototype.push=Yt,tr.prototype.has=er;var rr=tr;var nr=function(e,t){for(var r=-1,n=null==e?0:e.length;++r<n;)if(t(e[r],r,e))return!0;return!1};var ir=function(e,t){return e.has(t)};var ar=function(e,t,r,n,i,a){var s=1&r,o=e.length,l=t.length;if(o!=l&&!(s&&l>o))return!1;var u=a.get(e);if(u&&a.get(t))return u==t;var c=-1,d=!0,h=2&r?new rr:void 0;for(a.set(e,t),a.set(t,e);++c<o;){var f=e[c],b=t[c];if(n)var p=s?n(b,f,c,t,e,a):n(f,b,c,e,t,a);if(void 0!==p){if(p)continue;d=!1;break}if(h){if(!nr(t,(function(e,t){if(!ir(h,t)&&(f===e||i(f,e,r,n,a)))return h.push(t)}))){d=!1;break}}else if(f!==b&&!i(f,b,r,n,a)){d=!1;break}}return a.delete(e),a.delete(t),d},sr=fe.Uint8Array;var or=function(e){var t=-1,r=Array(e.size);return e.forEach((function(e,n){r[++t]=[n,e]})),r};var lr=function(e){var t=-1,r=Array(e.size);return e.forEach((function(e){r[++t]=e})),r},ur=be?be.prototype:void 0,cr=ur?ur.valueOf:void 0;var dr=function(e,t,r,n,i,a,s){switch(r){case"[object DataView]":if(e.byteLength!=t.byteLength||e.byteOffset!=t.byteOffset)return!1;e=e.buffer,t=t.buffer;case"[object ArrayBuffer]":return!(e.byteLength!=t.byteLength||!a(new sr(e),new sr(t)));case"[object Boolean]":case"[object Date]":case"[object Number]":return rt(+e,+t);case"[object Error]":return e.name==t.name&&e.message==t.message;case"[object RegExp]":case"[object String]":return e==t+"";case"[object Map]":var o=or;case"[object Set]":var l=1&n;if(o||(o=lr),e.size!=t.size&&!l)return!1;var u=s.get(e);if(u)return u==t;n|=2,s.set(e,t);var c=ar(o(e),o(t),n,i,a,s);return s.delete(e),c;case"[object Symbol]":if(cr)return cr.call(e)==cr.call(t)}return!1};var hr=function(e,t){for(var r=-1,n=t.length,i=e.length;++r<n;)e[i+r]=t[r];return e};var fr=function(e,t,r){var n=t(e);return _e(e)?n:hr(n,r(e))};var br=function(e,t){for(var r=-1,n=null==e?0:e.length,i=0,a=[];++r<n;){var s=e[r];t(s,r,e)&&(a[i++]=s)}return a};var pr=function(){return[]},vr=Object.prototype.propertyIsEnumerable,mr=Object.getOwnPropertySymbols,gr=mr?function(e){return null==e?[]:(e=Object(e),br(mr(e),(function(t){return vr.call(e,t)})))}:pr;var yr=function(e){return fr(e,Xe,gr)},wr=Object.prototype.hasOwnProperty;var jr=function(e,t,r,n,i,a){var s=1&r,o=yr(e),l=o.length;if(l!=yr(t).length&&!s)return!1;for(var u=l;u--;){var c=o[u];if(!(s?c in t:wr.call(t,c)))return!1}var d=a.get(e);if(d&&a.get(t))return d==t;var h=!0;a.set(e,t),a.set(t,e);for(var f=s;++u<l;){var b=e[c=o[u]],p=t[c];if(n)var v=s?n(p,b,c,t,e,a):n(b,p,c,e,t,a);if(!(void 0===v?b===p||i(b,p,r,n,a):v)){h=!1;break}f||(f="constructor"==c)}if(h&&!f){var m=e.constructor,g=t.constructor;m==g||!("constructor"in e)||!("constructor"in t)||"function"==typeof m&&m instanceof m&&"function"==typeof g&&g instanceof g||(h=!1)}return a.delete(e),a.delete(t),h},Or=Ct(fe,"DataView"),kr=Ct(fe,"Promise"),Ir=Ct(fe,"Set"),Pr=Ct(fe,"WeakMap"),Tr=wt(Or),Sr=wt(_t),Br=wt(kr),Cr=wt(Ir),_r=wt(Pr),Ar=ke;(Or&&"[object DataView]"!=Ar(new Or(new ArrayBuffer(1)))||_t&&"[object Map]"!=Ar(new _t)||kr&&"[object Promise]"!=Ar(kr.resolve())||Ir&&"[object Set]"!=Ar(new Ir)||Pr&&"[object WeakMap]"!=Ar(new Pr))&&(Ar=function(e){var t=ke(e),r="[object Object]"==t?e.constructor:void 0,n=r?wt(r):"";if(n)switch(n){case Tr:return"[object DataView]";case Sr:return"[object Map]";case Br:return"[object Promise]";case Cr:return"[object Set]";case _r:return"[object WeakMap]"}return t});var Er=Ar,Ur="[object Object]",qr=Object.prototype.hasOwnProperty;var Rr=function(e,t,r,n,i,a){var s=_e(e),o=_e(t),l=s?"[object Array]":Er(e),u=o?"[object Array]":Er(t),c=(l="[object Arguments]"==l?Ur:l)==Ur,d=(u="[object Arguments]"==u?Ur:u)==Ur,h=l==u;if(h&&Ee(e)){if(!Ee(t))return!1;s=!0,c=!1}if(h&&!c)return a||(a=new Xt),s||ze(e)?ar(e,t,r,n,i,a):dr(e,t,l,r,n,i,a);if(!(1&r)){var f=c&&qr.call(e,"__wrapped__"),b=d&&qr.call(t,"__wrapped__");if(f||b){var p=f?e.value():e,v=b?t.value():t;return a||(a=new Xt),i(p,v,r,n,a)}}return!!h&&(a||(a=new Xt),jr(e,t,r,n,i,a))};var Dr=function e(t,r,n,i,a){return t===r||(null==t||null==r||!Ie(t)&&!Ie(r)?t!=t&&r!=r:Rr(t,r,n,i,e,a))};var xr=function(e,t,r,n){var i=r.length,a=i,s=!n;if(null==e)return!a;for(e=Object(e);i--;){var o=r[i];if(s&&o[2]?o[1]!==e[o[0]]:!(o[0]in e))return!1}for(;++i<a;){var l=(o=r[i])[0],u=e[l],c=o[1];if(s&&o[2]){if(void 0===u&&!(l in e))return!1}else{var d=new Xt;if(n)var h=n(u,c,l,e,t,d);if(!(void 0===h?Dr(c,u,3,n,d):h))return!1}}return!0};var Nr=function(e){return e==e&&!Je(e)};var Mr=function(e){for(var t=Xe(e),r=t.length;r--;){var n=t[r],i=e[n];t[r]=[n,i,Nr(i)]}return t};var Fr=function(e,t){return function(r){return null!=r&&(r[e]===t&&(void 0!==t||e in Object(r)))}};var zr=function(e){var t=Mr(e);return 1==t.length&&t[0][2]?Fr(t[0][0],t[0][1]):function(r){return r===e||xr(r,e,t)}};var $r=function(e){return"symbol"==typeof e||Ie(e)&&"[object Symbol]"==ke(e)},Gr=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,Lr=/^\w*$/;var Wr=function(e,t){if(_e(e))return!1;var r=typeof e;return!("number"!=r&&"symbol"!=r&&"boolean"!=r&&null!=e&&!$r(e))||(Lr.test(e)||!Gr.test(e)||null!=t&&e in Object(t))};function Vr(e,t){if("function"!=typeof e||null!=t&&"function"!=typeof t)throw new TypeError("Expected a function");var r=function(){var n=arguments,i=t?t.apply(this,n):n[0],a=r.cache;if(a.has(i))return a.get(i);var s=e.apply(this,n);return r.cache=a.set(i,s)||a,s};return r.cache=new(Vr.Cache||Jt),r}Vr.Cache=Jt;var Kr=Vr;var Hr=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,Jr=/\\(\\)?/g,Zr=function(e){var t=Kr(e,(function(e){return 500===r.size&&r.clear(),e})),r=t.cache;return t}((function(e){var t=[];return 46===e.charCodeAt(0)&&t.push(""),e.replace(Hr,(function(e,r,n,i){t.push(n?i.replace(Jr,"$1"):r||e)})),t}));var Qr=function(e,t){for(var r=-1,n=null==e?0:e.length,i=Array(n);++r<n;)i[r]=t(e[r],r,e);return i},Xr=be?be.prototype:void 0,Yr=Xr?Xr.toString:void 0;var en=function e(t){if("string"==typeof t)return t;if(_e(t))return Qr(t,e)+"";if($r(t))return Yr?Yr.call(t):"";var r=t+"";return"0"==r&&1/t==-Infinity?"-0":r};var tn=function(e){return null==e?"":en(e)};var rn=function(e,t){return _e(e)?e:Wr(e,t)?[e]:Zr(tn(e))};var nn=function(e){if("string"==typeof e||$r(e))return e;var t=e+"";return"0"==t&&1/e==-Infinity?"-0":t};var an=function(e,t){for(var r=0,n=(t=rn(t,e)).length;null!=e&&r<n;)e=e[nn(t[r++])];return r&&r==n?e:void 0};var sn=function(e,t,r){var n=null==e?void 0:an(e,t);return void 0===n?r:n};var on=function(e,t){return null!=e&&t in Object(e)};var ln=function(e,t,r){for(var n=-1,i=(t=rn(t,e)).length,a=!1;++n<i;){var s=nn(t[n]);if(!(a=null!=e&&r(e,s)))break;e=e[s]}return a||++n!=i?a:!!(i=null==e?0:e.length)&&Re(i)&&qe(s,i)&&(_e(e)||Ce(e))};var un=function(e,t){return null!=e&&ln(e,t,on)};var cn=function(e,t){return Wr(e)&&Nr(t)?Fr(nn(e),t):function(r){var n=sn(r,e);return void 0===n&&n===t?un(r,e):Dr(t,n,3)}};var dn=function(e){return e};var hn=function(e){return function(t){return null==t?void 0:t[e]}};var fn=function(e){return function(t){return an(t,e)}};var bn=function(e){return Wr(e)?hn(nn(e)):fn(e)};var pn=function(e){return"function"==typeof e?e:null==e?dn:"object"==typeof e?_e(e)?cn(e[0],e[1]):zr(e):bn(e)};var vn=function(e,t){return function(r,n){var i=_e(r)?se:et,a=t?t():{};return i(r,e,pn(n),a)}}((function(e,t,r){e[r?0:1].push(t)}),(function(){return[[],[]]}));var mn=function(e,t,r,n){for(var i=e.length,a=r+(n?1:-1);n?a--:++a<i;)if(t(e[a],a,e))return a;return-1};var gn=function(e){return e!=e};var yn=function(e,t,r){for(var n=r-1,i=e.length;++n<i;)if(e[n]===t)return n;return-1};var wn=function(e,t,r){return t==t?yn(e,t,r):mn(e,gn,r)};var jn=function(e,t){return!!(null==e?0:e.length)&&wn(e,t,0)>-1};var On=function(e,t,r){for(var n=-1,i=null==e?0:e.length;++n<i;)if(r(t,e[n]))return!0;return!1};var kn=function(){},In=Ir&&1/lr(new Ir([,-0]))[1]==1/0?function(e){return new Ir(e)}:kn;var Pn=function(e,t,r){var n=-1,i=jn,a=e.length,s=!0,o=[],l=o;if(r)s=!1,i=On;else if(a>=200){var u=t?null:In(e);if(u)return lr(u);s=!1,i=ir,l=new rr}else l=t?[]:o;e:for(;++n<a;){var c=e[n],d=t?t(c):c;if(c=r||0!==c?c:0,s&&d==d){for(var h=l.length;h--;)if(l[h]===d)continue e;t&&l.push(d),o.push(c)}else i(l,d,r)||(l!==o&&l.push(d),o.push(c))}return o};var Tn=function(e,t){return e&&e.length?Pn(e,pn(t)):[]};const Sn=new Set(["LicensePlate","FaceDetection","Analytic","SpeedDetection","Temperature","PoS","GPS","DigitalInput"]);class Bn{constructor(e){if(Object.defineProperty(this,"cameraId",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"type",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"raw",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"thumbnailUrl",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"detectedObjects",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"faces",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),n(this,{id:t,startTime:t,endTime:t,acknowledged:t,isLive:t,raw:i.ref}),this.raw=e,this.type=e.eventType,this.cameraId=e.sensorId,("Analytic"===this.type||"FaceDetection"===this.type)&&e.data)try{const t=JSON.parse(e.data);t.FoundObjects&&(this.type="Analytic",this.detectedObjects=t.FoundObjects),t.Faces&&(this.type="FaceDetection",this.faces=t.Faces),this.thumbnailUrl=t.ThumbnailUrl}catch{console.warn("invalid data",e.data),this.type="Motion"}this.detectedObjects||(this.detectedObjects=[])}get id(){return this.raw.id}get startTime(){return new Date(this.raw.startTime)}get endTime(){return new Date(this.raw.endTime)}get isLive(){return!Sn.has(this.type)&&+this.startTime==+this.endTime}get acknowledged(){return"sensorId"in this.raw&&!!this.raw.ackEventType}}function Cn(e){if(e.length<2)return e;const t=[e[0]];for(let r=1;r<e.length;r++){const n=t.length-1,i=t[n],a=e[r];a[0]>i[1]?t.push(a):t[n]=[i[0],new Date(Math.max(+i[1],+a[1]))]}return t}const _n=()=>!0;class An extends Q{constructor(e){super(),Object.defineProperty(this,"camerasStore",{enumerable:!0,configurable:!0,writable:!0,value:e}),Object.defineProperty(this,"data",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"eventsByCameraId",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"eventsByStart",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"eventsByEnd",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"eventsByType",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"eventsByFoundObjects",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"eventsByColor",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"eventsByLiveliness",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"pendingRequests",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"pendingRequestsByEnd",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"pendingRequestsByStart",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"pendingRequestsByCameraId",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"knownIntervals",{enumerable:!0,configurable:!0,writable:!0,value:R()}),Object.defineProperty(this,"knownIntervalsByCameraId",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"knownIntervalsByStart",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"knownIntervalsByEnd",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"eventsById",{enumerable:!0,configurable:!0,writable:!0,value:new Map}),Object.defineProperty(this,"updates",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,"recentAdditions",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"update",{enumerable:!0,configurable:!0,writable:!0,value:e=>{e.forEach((e=>{const t=this.eventsById.get(e.id);t&&(t.raw=e.raw,this.data.remove((t=>t.id===e.id)),this.data.add([t]))}))}}),Object.defineProperty(this,"add",{enumerable:!0,configurable:!0,writable:!0,value:e=>{const t=e.filter((e=>!this.eventsById.has(e.id)));t.forEach((e=>this.eventsById.set(e.id,e))),this.data.add(t),t.length&&this.updates++}}),Object.defineProperty(this,"processNewEvents",{enumerable:!0,configurable:!0,writable:!0,value:({data:e})=>{const t=Tn(e.filter((e=>this.camerasStore.camerasById.has(e.sensorId))).reverse(),"id").map((e=>new Bn(e))),[r,n]=vn(t,(e=>this.eventsById.has(e.id)));this.update(r),this.add(n),n.length&&(this.recentAdditions=n.map((e=>e.id)))}}),n(this,{updates:i,recentAdditions:i.ref,processNewEvents:a,update:a,add:a,dispose:a}),this.data=R(),this.eventsByCameraId=this.data.dimension((e=>e.cameraId)),this.eventsByStart=this.data.dimension((e=>+e.startTime)),this.eventsByEnd=this.data.dimension((e=>+e.endTime)),this.eventsByType=this.data.dimension((e=>e.type)),this.eventsByFoundObjects=this.data.dimension((e=>e.detectedObjects.map((e=>e.Type))),!0),this.eventsByColor=this.data.dimension((e=>e.detectedObjects.reduce(((e,t)=>e.concat(...t.Colors.map((e=>e.Color)))),[])),!0),this.eventsByLiveliness=this.data.dimension((e=>e.isLive)),this.pendingRequests=R(),this.pendingRequestsByStart=this.pendingRequests.dimension((e=>+e.startTime)),this.pendingRequestsByEnd=this.pendingRequests.dimension((e=>+e.endTime)),this.pendingRequestsByCameraId=this.pendingRequests.dimension((e=>e.cameraId)),this.knownIntervalsByCameraId=this.knownIntervals.dimension((e=>e.cameraId)),this.knownIntervalsByStart=this.knownIntervals.dimension((e=>+e.from)),this.knownIntervalsByEnd=this.knownIntervals.dimension((e=>+e.to))}populateEvents(e,t,r){const n=null===r?new Date(Date.now()-6e5):r;-1===e?this.knownIntervalsByCameraId.filter(-1):this.knownIntervalsByCameraId.filter((t=>-1===t||t===e)),this.knownIntervalsByStart.filter([-1/0,n]),this.knownIntervalsByEnd.filter([t,1/0]);const i=this.knownIntervalsByStart.bottom(1/0),a=[];if(this.knownIntervalsByCameraId.filterAll(),this.knownIntervalsByStart.filterAll(),this.knownIntervalsByEnd.filterAll(),i.length){const s=Cn(i.map((e=>[e.from,e.to])));s[0][0]>t&&a.push([t,s[0][0]]);for(let e=0;e<s.length-1;e++)a.push([s[e][1],s[e+1][0]]);s[Cn.length-1][1]<n&&a.push([s[Cn.length-1][1],n]),a.length&&(t=a[0][0],+a[a.length-1][1]<=+n&&(r=a[a.length-1][1]),this.knownIntervals.add([{cameraId:e,from:t,to:n}]))}else this.knownIntervals.add([{cameraId:e,from:t,to:n}]);this.pendingRequestsByCameraId.filter(e),this.pendingRequestsByStart.filter(t),this.pendingRequestsByEnd.filter(n);const s=this.pendingRequests.allFiltered()[0];if(this.pendingRequestsByCameraId.filterAll(),this.pendingRequestsByStart.filterAll(),this.pendingRequestsByEnd.filterAll(),s)return;if(i.length&&!a.length)return;const o=n=>this.api.cameras.GetSensorEventsPage({sensorIds:[e],sensorType:"camera",sensorEventTypes:[],startTime:t,endTime:r,rowsLimit:100,isDescending:!0,pageToken:n},null,[]).pipe(y((e=>e.success?f(e):(console.error(e.error),d(e.error))))),l=o().pipe(E((e=>e.pageInfo.haveMore?o(e.pageInfo.nextPageToken):u)),B((e=>e.resultItems.map((e=>new Bn(e))))),_());this.pendingRequests.add([{cameraId:e,startTime:t,endTime:r||new Date,request:l}]),l.subscribe({next:this.add,error:e=>{console.error(e),this.pendingRequests.remove((e=>e.request===l))},complete:()=>{this.pendingRequests.remove((e=>e.request===l))}})}getEvents({cameraIds:e,from:t,to:r,detectedObjectTypes:n,eventTypes:i,colors:a,probability:s}){this.eventsByStart.filter([+t,r?+r+5e-4:1/0]),(null==e?void 0:e.length)&&this.eventsByCameraId.filter((t=>e.includes(t))),(null==i?void 0:i.length)&&this.eventsByType.filter((e=>i.includes(e))),(null==n?void 0:n.length)&&this.eventsByFoundObjects.filter((e=>n.includes(e))),(null==a?void 0:a.size)&&this.eventsByColor.filter((e=>a.has(e)));let o=this.eventsByStart.top(1/0);return(null==i?void 0:i.length)&&this.eventsByType.filterAll(),(null==e?void 0:e.length)&&this.eventsByCameraId.filterAll(),(null==n?void 0:n.length)&&this.eventsByFoundObjects.filterAll(),(null==a?void 0:a.size)&&this.eventsByColor.filterAll(),this.eventsByStart.filterAll(),void 0!==s&&(null==n?void 0:n.length)&&(o=o.filter((e=>e.detectedObjects.some((e=>e.Probability>=s&&n.includes(e.Type)))))),o}getOverlappedEvents({cameraId:e,from:t,to:r}){this.eventsByCameraId.filter(e),this.eventsByStart.filter([-1/0,+r+5e-4]),this.eventsByLiveliness.filterExact(!0);const n=this.eventsByStart.top(1/0);this.eventsByLiveliness.filterAll(),this.eventsByEnd.filter([+t,1/0]);const i=this.eventsByStart.top(1/0);return this.eventsByCameraId.filterAll(),this.eventsByStart.filterAll(),this.eventsByEnd.filterAll(),i.concat(n)}getLastBefore({cameraId:e,date:t}){this.eventsByCameraId.filter(e),this.eventsByStart.filter([-1/0,+t]);const r=this.eventsByStart.top(1);return this.eventsByCameraId.filterAll(),this.eventsByStart.filterAll(),r[0]}getFirstAfter({cameraId:e,date:t}){this.eventsByCameraId.filter(e),this.eventsByStart.filter([+t+5e-4,1/0]);const r=this.eventsByEnd.bottom(1);return this.eventsByCameraId.filterAll(),this.eventsByStart.filterAll(),r[0]}afterInit(){this.api.events.pipe(p((({hub:e,event:t})=>"cameras"===e&&"OnCameraMotionEvent"===t))).subscribe(this.processNewEvents)}dispose(){super.dispose(),this.data.remove(_n),this.updates++}}class En extends Q{constructor(){super(),Object.defineProperty(this,"thumbnails",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"thumbnailsByCameraId",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"thumbnailsByDate",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"pendingRequests",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"pendingRequestsByEnd",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"pendingRequestsByStart",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"pendingRequestsByCameraId",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"pendingRequestsByCount",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"toThumbnail",{enumerable:!0,configurable:!0,writable:!0,value:e=>({realtimestamp:t,url:r,width:n,height:i})=>({cameraId:e,url:r,width:n,height:i,timestamp:new Date(t)})}),this.thumbnails=R(),this.thumbnailsByCameraId=this.thumbnails.dimension((e=>e.cameraId)),this.thumbnailsByDate=this.thumbnails.dimension((e=>+e.timestamp)),this.pendingRequests=R(),this.pendingRequestsByStart=this.pendingRequests.dimension((e=>+e.from)),this.pendingRequestsByEnd=this.pendingRequests.dimension((e=>+e.to)),this.pendingRequestsByCameraId=this.pendingRequests.dimension((e=>e.cameraId)),this.pendingRequestsByCount=this.pendingRequests.dimension((e=>e.count))}fetchThumbnails(e,t,r,n){this.pendingRequestsByCameraId.filter(e),this.pendingRequestsByStart.filter(t),this.pendingRequestsByEnd.filter(r),this.pendingRequestsByCount.filter(n);const i=this.pendingRequests.allFiltered()[0];if(this.pendingRequestsByCameraId.filterAll(),this.pendingRequestsByStart.filterAll(),this.pendingRequestsByEnd.filterAll(),this.pendingRequestsByCount.filterAll(),i)return i.request;const a=this.api.thumbnails.GetThumbnailsInfo({cameraId:e,from:t,to:r,count:n}).pipe(B((t=>t.resultItems.filter((e=>e.url)).map(this.toThumbnail(e)))),S());return this.pendingRequests.add([{cameraId:e,from:t,to:r,count:n,request:a}]),a.subscribe((e=>{this.thumbnails.add(e),this.pendingRequests.remove((e=>e.request===a))})),a}getIntervalState(e,t,r){const n=this.getThumbnail({cameraId:e,from:t,to:r});if(n)return{state:"fullfilled",data:n};this.pendingRequestsByCameraId.filter(e),this.pendingRequestsByStart.filter([-1/0,+r+5e-4]),this.pendingRequestsByEnd.filter([t,1/0]);let i=this.pendingRequests.allFiltered();return this.pendingRequestsByCameraId.filterAll(),this.pendingRequestsByStart.filterAll(),this.pendingRequestsByEnd.filterAll(),i=i.filter((e=>1===e.count?+e.from==+t&&+e.to==+r:Math.abs((+e.to-+e.from)/e.count-(+r-+t))<=1)),i.length?{state:"pending",request:i[0].request}:null}fetchThumbnail(e,t,r){const n=this.getIntervalState(e,t,r);if(null!==n){if("fullfilled"===n.state)return f(n.data);if("pending"===n.state)return n.request.pipe(B((()=>this.getThumbnail({cameraId:e,from:t,to:r}))))}const i=this.api.thumbnails.GetThumbnailInfo({cameraId:e,from:t,to:r}).pipe(B((e=>e.resultItems)),S());return i.subscribe((t=>{const r=t.filter((e=>e.url)).map(this.toThumbnail(e));this.thumbnails.add(r),this.pendingRequests.remove((e=>e.request===i))})),this.pendingRequests.add([{cameraId:e,from:t,to:r,count:1,request:i}]),i.pipe(B((()=>this.getThumbnail({cameraId:e,from:t,to:r}))))}getThumbnail({cameraId:e,from:t,to:r}){this.thumbnailsByCameraId.filter(e),this.thumbnailsByDate.filter([+t,+r+(+t==+r?5e-4:0)]);const n=this.thumbnails.allFiltered()[0];return this.thumbnailsByDate.filterAll(),this.thumbnailsByCameraId.filterAll(),n}getThumbnails({cameraId:e,from:t,to:r}){this.thumbnailsByCameraId.filter(e),this.thumbnailsByDate.filter([+t,+r+5e-4]);const n=this.thumbnails.allFiltered();return this.thumbnailsByDate.filterAll(),this.thumbnailsByCameraId.filterAll(),n}}class Un{constructor(e){Object.defineProperty(this,"notifier",{enumerable:!0,configurable:!0,writable:!0,value:e})}error(e){this.notifier.error(e)}success(e,t){this.notifier.success(e,t)}warn(e){this.notifier.warn(e)}}const qn=new Map;class Rn{constructor(t){Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:t}),Object.defineProperty(this,"cameras",{enumerable:!0,configurable:!0,writable:!0,value:new re}),Object.defineProperty(this,"archives",{enumerable:!0,configurable:!0,writable:!0,value:new ee}),Object.defineProperty(this,"events",{enumerable:!0,configurable:!0,writable:!0,value:new An(this.cameras)}),Object.defineProperty(this,"eventSchema",{enumerable:!0,configurable:!0,writable:!0,value:new ae}),Object.defineProperty(this,"thumbnails",{enumerable:!0,configurable:!0,writable:!0,value:new En}),Object.defineProperty(this,"account",{enumerable:!0,configurable:!0,writable:!0,value:new X}),Object.defineProperty(this,"notification",{enumerable:!0,configurable:!0,writable:!0,value:new Un({success:console.log,warn:console.warn,error:console.error})}),Object.defineProperty(this,"auth",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"api",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"disposables",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"tokenUpdateReactions",{enumerable:!0,configurable:!0,writable:!0,value:new Set}),Object.defineProperty(this,"dispose",{enumerable:!0,configurable:!0,writable:!0,value:()=>{this.disposables.forEach((e=>{e instanceof b?e.closed||e.unsubscribe():e()})),this.tokenUpdateReactions.forEach((e=>e())),this.tokenUpdateReactions.clear(),this.auth.signOut(),this.cameras.dispose(),this.events.dispose(),this.thumbnails.dispose(),this.eventSchema.dispose(),this.account.dispose(),qn.delete(this.name)}}),Object.defineProperty(this,"onTokenUpdate",{enumerable:!0,configurable:!0,writable:!0,value:t=>{if(!this.auth)throw new Error("app has to be inited first");const r=e((()=>this.auth.token),(e=>t((null==e?void 0:e.json)||null)));return this.tokenUpdateReactions.add(r),()=>{r(),this.tokenUpdateReactions.delete(r)}}}),this.disposables.push(s((()=>!!this.account.user),(()=>{this.cameras.load()})))}init({token:e,tokenStorage:t=new H,tokenStorageKey:r,apiUrl:n="https://services.3deye.me/reactiveapi",tokenServiceUrl:i="https://admin.3deye.me/token",widgetTokenServiceUrl:a="https://admin.3deye.me/widget/token"},s="default"){if(r||(r=`@3deye-toolkit/${s}/token`),qn.has(s))return console.warn("Can`t init two apps with the same name"),qn.get(s);if(this.auth&&s===this.name)return console.warn("Can`t init already inited app"),this;if(this.auth||"default"===this.name&&"default"!==s)return new Rn(s).init({token:e,tokenStorage:t,tokenStorageKey:r,apiUrl:n,tokenServiceUrl:i,widgetTokenServiceUrl:a},s);const o=e&&"clientId"in e?e.clientId:"WebApp";return e&&t.setItem(r,JSON.stringify(e)),this.auth=new K({widgetTokenServiceUrl:a,tokenServiceUrl:i,tokenStorageKey:r,storage:t,clientId:o,deviceInfo:null}),this.api=W.create(z,this.auth,(e=>U(n,{qs:{access_token:e}}))),this.cameras.initWith(this.api),this.archives.initWith(this.api),this.events.initWith(this.api),this.eventSchema.initWith(this.api),this.thumbnails.initWith(this.api),this.account.initWith(this.api),this.account.setAuthStore(this.auth),qn.set(s,this),this}}const Dn=new Rn("default"),xn=N.createContext(null);export{xn as AppContext,Dn as app};
|
|
1
|
+
import{reaction as e,computed as t,runInAction as r,makeObservable as n,observable as i,action as a,when as s}from"mobx";import{Subject as o,BehaviorSubject as l,switchMap as u,EMPTY as c,timer as d,filter as f,delay as h,take as b,mergeMap as p,catchError as v,throwError as m,takeUntil as y,Observable as g,of as w,retryWhen as j,startWith as O,pairwise as I,concatMap as k,Subscription as P,share as A,shareReplay as T,skip as C,exhaustMap as B,map as S}from"rxjs";import _ from"jqueryless-signalr";import{StatusCodes as E}from"http-status-codes";import{mergeMap as R,shareReplay as q,retryWhen as U,filter as D,map as x,tap as N,expand as M,last as F,share as z}from"rxjs/operators";import G from"crossfilter2";import L from"string-natural-compare";import $ from"react";const W={archives:{PopulateArchive:null,GetArchives:null,GetClips:null,UpdateClip:null,DeleteClip:null,SaveClip:null,SaveTimelaps:null,SaveArchive:null,DeleteArchive:null,ShareClip:null,GetSharedClips:null,UpdateSharedClip:null,DeleteSharedClip:null},cameras:{GetCameras:null,GetSensorDataSchema:null,GetMotionEvents:null,GetSensorEvents:null,GetSensorEventsPage:null,AddUserSensorEvent:null,AcknowledgeSensorEvent:null,MoveCamera:null,MoveCameraContinuousStart:null,MoveCameraContinuousStop:null,GoHomePtzCamera:null,SetHomePtzCamera:null},camgroups:{GetCamgroups:null,DeleteCamgroup:null,AddCamgroup:null,UpdateCamgroup:null},sound:{GetPushSoundServiceUrl:null},thumbnails:{GetThumbnailsInfo:null,GetThumbnailInfo:null,GetHeatMapsInfo:null},users:{GetUser:null,UserUpdateProfile:null}},V={cameras:[{name:"OnCameraMotionEvent",explicit:!0},{name:"OnCameraAdded"},{name:"OnCameraUpdated"},{name:"OnSystemCameraUpdated"},{name:"OnCameraDeleted"}],users:[{name:"OnUserUpdateProfile"}],camgroups:[{name:"OnAdd"},{name:"OnUpdate"},{name:"OnDelete"}],archives:[{name:"OnTimelapsAdded"},{name:"OnClipAdded"},{name:"OnClipUpdated"},{name:"OnClipDeleted"},{name:"OnArchiveAdded"},{name:"OnArchiveUpdated"},{name:"OnArchiveDeleted"},{name:"OnArchiveRecordCreated"}]};var H,J;!function(e){e[e.CONNECTING=0]="CONNECTING",e[e.CONNECTED=1]="CONNECTED",e[e.RECONNECTING=2]="RECONNECTING",e[e.DISCONNECTED=3]="DISCONNECTED"}(H||(H={}));class K{constructor(t,r,n){Object.defineProperty(this,"connectionShutdown$",{enumerable:!0,configurable:!0,writable:!0,value:new o}),Object.defineProperty(this,"connection$",{enumerable:!0,configurable:!0,writable:!0,value:new l(null)}),Object.defineProperty(this,"events",{enumerable:!0,configurable:!0,writable:!0,value:new o}),Object.defineProperty(this,"logging",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"authStore",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"createConnection",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"apiConfig",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.apiConfig=t,this.init(),this.createConnection=n,this.authStore=r,e((()=>r.token),(e=>{if(!e)return void this.shutdownConnection();if(e.invalid)return;if(!e.accessToken)return;const t=this.connection$.getValue();t&&t.state!==H.DISCONNECTED?t.qs.access_token=e.accessToken:this.connect(e)})),this.connection$.pipe(u((e=>null!==e||!r.isAuthenticated||r.token&&r.token.invalid?c:(this.logging&&console.warn("disconnected by some reason"),d(5e3)))),f((()=>r.isAuthenticated&&!!r.token&&!r.token.invalid))).subscribe((()=>{this.connect(r.token),this.logging&&console.warn("attempting to reconnect")})),this.connection$.pipe(f(Boolean),h(100)).subscribe(this.subscribeToEvents)}static create(e,t,r){return new K(null!==e?e:W,t,r)}connect(e){if(this.connection$.getValue()&&this.connection$.getValue().state===H.CONNECTED)return;const{accessToken:t}=e,r=this.createConnection(t);Object.keys(this.apiConfig).forEach((e=>r.createHubProxy(e))),Object.entries(V).forEach((([e,t])=>{t&&r.proxies[e]&&t.forEach((({name:t})=>{r.proxies[e].on(t,(r=>this.events.next({hub:e,event:t,data:r})))}))})),r.start().done((()=>{this.logging&&console.warn("connected"),this.connection$.next(r)})).fail((e=>{var t,r,n;401!==(null===(t=e.source)||void 0===t?void 0:t.status)&&403!==(null===(r=e.source)||void 0===r?void 0:r.status)&&409!==(null===(n=e.source)||void 0===n?void 0:n.status)||this.authStore.invalidateToken()})),r.error((e=>{if(e.source&&(401===e.source.status||403===e.source.status||409===e.source.status))return this.logging&&console.warn("authentication error, invalidating token"),this.authStore.invalidateToken()})),r.disconnected((()=>{this.connection$.getValue()?this.logging&&console.warn("disconnected",this.connection$.getValue().lastError):this.logging&&console.warn("disconnected. this connection is already null"),this.connection$.next(null)})),r.reconnecting((()=>console.log("reconnecting"))),r.reconnected((()=>{this.connection$.getValue()===r&&(this.logging&&console.warn("reconnected"),this.connection$.next(r))}))}shutdownConnection(){const e=this.connection$.getValue();e&&e.stop(),this.connectionShutdown$.next(null)}init(){Object.keys(this.apiConfig).forEach((e=>{this[e]={},Object.keys(this.apiConfig[e]).forEach((t=>{this[e][t]=this.createHubMethod(e,t)}))}))}createHubMethod(e,t){const r=this;return function n(...i){return r.connection$.pipe(f(Boolean),f((e=>e.state===H.CONNECTED)),b(1)).pipe(p((r=>new Promise(((n,a)=>{r.proxies[e].invoke(t,...i).done((e=>n(e))).fail((e=>a(e)))})))),v((e=>!e.message||"Connection started reconnecting before invocation result was received."!==e.message&&"Connection was disconnected before invocation result was received."!==e.message?e.message&&e.message.startsWith("Caller is not authorized to invoke the ")?(console.warn(e.message),r.connection$.getValue().stop(),r.authStore.invalidateToken(),n(...i)):m(e):(console.warn(e.message),n(...i)))),y(r.connectionShutdown$))}}subscribeToEvents(e){Object.entries(V).forEach((([t,r])=>{r&&e.proxies[t]&&e.state===H.CONNECTED&&r.filter((({explicit:e})=>e)).forEach((({name:r})=>{e.proxies[t].invoke("SubscribeToEvent",r)}))}))}}class Z{constructor(e){Object.defineProperty(this,"accessToken",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"accessTokenExpires",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"accessTokenIssued",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"clientId",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"expiresIn",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"refreshToken",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"refreshTokenExpires",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"refreshTokenIssued",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"tokenType",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"userName",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"invalid",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"widgetId",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"widgetToken",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"json",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.json=e,this.accessToken=e.access_token||e.accessToken,this.accessTokenExpires=new Date(e.access_token_expires||e.accessTokenExpires),this.accessTokenIssued=new Date(e.access_token_issued||e.accessTokenIssued),this.clientId=e.client_id||e.clientId,this.expiresIn=e.expires_in||e.expiresIn,this.refreshToken=e.refresh_token||e.refreshToken,this.refreshTokenExpires=new Date(e.refresh_token_expires||e.refreshTokenExpires),this.refreshTokenIssued=new Date(e.refresh_token_issued||e.refreshTokenIssued),this.tokenType=e.token_type||e.tokenType,this.userName=e.userName,this.widgetId=e.widgetId,this.widgetToken=e.widgetToken,this.invalid=!1}}class Y{constructor({tokenServiceUrl:e,storage:s,tokenStorageKey:o,deviceInfo:l,clientId:h}){Object.defineProperty(this,"token",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"isAuthenticating",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"storage",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"tokenServiceUrl",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"tokenStorageKey",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"deviceInfo",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"clientId",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"pendingUpdateTokenRequest",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"signOut",{enumerable:!0,configurable:!0,writable:!0,value:()=>{this.isAuthenticating||r((()=>this.token=null))}}),Object.defineProperty(this,"signIn",{enumerable:!0,configurable:!0,writable:!0,value:e=>{if(this.isAuthenticating)return;r((()=>this.isAuthenticating=!0)),!1===e.agreedWithTerms&&(e=Object.assign(Object.assign({},e),{agreedWithTerms:void 0}));return this.fetchToken(e).then((e=>(r((()=>{this.token=e,this.isAuthenticating=!1})),e))).catch((e=>{throw r((()=>{this.isAuthenticating=!1})),e}))}}),Object.defineProperty(this,"invalidateToken",{enumerable:!0,configurable:!0,writable:!0,value:()=>{this.token&&r((()=>{this.token=Object.assign(Object.assign({},this.token),{invalid:!0})}))}}),n(this,{token:i.ref,isAuthenticating:i,isAuthenticated:t,signOut:a,invalidateToken:a}),this.isAuthenticating=!0,this.storage=s,this.tokenServiceUrl=e,this.tokenStorageKey=o,this.deviceInfo=l,this.clientId=h;const b=function(e,r=!1){const n=t(e);return new g((e=>{const t=n.observe_((({newValue:t})=>e.next(t)),r);return()=>t()}))}((()=>this.token)),y=b.pipe(u((e=>{if(null===e)return c;const t=w(e).pipe(p((e=>e.widgetId?this.fetchWidgetToken(e):this.updateToken(e.refreshToken))),j((e=>e.pipe(p(((e,t)=>e.status&&![500,502,503,504].includes(e.status)?m((()=>e)):d(2**Math.min(t+1,6)*1e3)))))));if(!e.invalid){const r=Math.max(.75*(+e.accessTokenExpires-Date.now()),0);return d(r).pipe(p((()=>t)))}return t})),v((e=>(console.error(e),r((()=>this.token=null)),y))));y.subscribe((e=>{r((()=>this.token=e))})),b.pipe(O(null),I(),f((([e,t])=>!!(t||!t&&e))),k((([,e])=>this.storeToken(e)))).subscribe(),this.getInitialToken().then((e=>{r((()=>{this.token=e,this.isAuthenticating=!1}))}))}get isAuthenticated(){return Boolean(this.token&&!this.isAuthenticating)}async getTokenFromStorage(){const e=await this.storage.getItem(this.tokenStorageKey);return e?new Z(JSON.parse(e)):null}async storeToken(e){return!e||e.invalid?this.storage.removeItem(this.tokenStorageKey):this.storage.setItem(this.tokenStorageKey,JSON.stringify(e.json))}async getInitialToken(){const e=await this.getTokenFromStorage();return e||null}async fetchToken(e){const t=Object.assign({clientId:this.clientId,device:this.deviceInfo},e),r=new Headers;r.append("Content-Type","application/json"),r.append("accept","application/json");const n=await fetch(this.tokenServiceUrl,{method:"POST",headers:r,body:JSON.stringify(t)});try{const e=await n.json();return 200!==n.status?Promise.reject({status:n.status,data:e}):new Z(e)}catch(e){return Promise.reject(n)}}async updateToken(e){var t;try{return this.pendingUpdateTokenRequest&&this.pendingUpdateTokenRequest.refreshToken===e||(this.pendingUpdateTokenRequest={refreshToken:e,request:this.fetchToken({refreshToken:e})}),await this.pendingUpdateTokenRequest.request}finally{(null===(t=this.pendingUpdateTokenRequest)||void 0===t?void 0:t.refreshToken)===e&&(this.pendingUpdateTokenRequest=null)}}async fetchWidgetToken(e){const{widgetId:t,widgetToken:r}=e;if(!t||!r)throw new Error("token must contain widgetId and widgetToken");const n={widgetId:t,widgetToken:r},i=new Headers;i.append("Content-Type","application/json"),i.append("accept","application/json");const a=await fetch(this.tokenServiceUrl,{method:"POST",headers:i,body:JSON.stringify(n)});try{const e=await a.json();return 200!==a.status?Promise.reject({status:a.status,data:e}):new Z(Object.assign({widgetId:t,widgetToken:r},e))}catch(e){return Promise.reject(a)}}}!function(e){e[e.Motion=0]="Motion",e[e.Tampering=1]="Tampering",e[e.PanTiltZoom=2]="PanTiltZoom",e[e.CrossLine=3]="CrossLine",e[e.Intrusion=4]="Intrusion",e[e.LicensePlate=5]="LicensePlate",e[e.FaceDetection=6]="FaceDetection",e[e.Audio=7]="Audio",e[e.Analytic=8]="Analytic",e[e.SpeedDetection=9]="SpeedDetection",e[e.PeopleCounter=10]="PeopleCounter",e[e.Temperature=11]="Temperature",e[e.PoS=12]="PoS",e[e.GPS=13]="GPS",e[e.DigitalInput=14]="DigitalInput",e[e.Normal=15]="Normal",e[e.Suspicious=16]="Suspicious",e[e.Loitering=17]="Loitering",e[e.Vandalism=18]="Vandalism",e[e.Trespass=19]="Trespass",e[e.Emergency=20]="Emergency",e[e.LifeInDanger=21]="LifeInDanger",e[e.ErroneousAlert=22]="ErroneousAlert",e[e.Misidentification=23]="Misidentification",e[e.Fire=24]="Fire",e[e.MedicalDuress=25]="MedicalDuress",e[e.HoldUp=26]="HoldUp",e[e.CheckIn=27]="CheckIn",e[e.CheckOut=28]="CheckOut",e[e.ClockIn=29]="ClockIn",e[e.ClockOut=30]="ClockOut",e[e.ParkingStart=31]="ParkingStart",e[e.ParkingEnd=32]="ParkingEnd",e[e.ParkingViolation=33]="ParkingViolation",e[e.GateAccess=34]="GateAccess",e[e.DoorAccess=35]="DoorAccess",e[e.TemperatureCheck=36]="TemperatureCheck",e[e.IDCheck=37]="IDCheck",e[e.PPECheck=38]="PPECheck",e[e.WelfareCheck=39]="WelfareCheck",e[e.Uncategorized=40]="Uncategorized",e[e.Unknown=999]="Unknown"}(J||(J={}));class Q{constructor(){Object.defineProperty(this,"values",{enumerable:!0,configurable:!0,writable:!0,value:new Map})}getItem(e){return this.values.get(e)||null}setItem(e,t){this.values.set(e,t)}removeItem(e){this.values.delete(e)}}let X=[];class ee{constructor(){Object.defineProperty(this,"api",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"disposables",{enumerable:!0,configurable:!0,writable:!0,value:[]})}initWith(e){this.api=e,this.afterInit&&this.afterInit()}dispose(){this.disposables.forEach((e=>{e instanceof P?e.closed||e.unsubscribe():e()}))}}var te;!function(e){e.DEFAULT_VIDEO_RESIZE_MODE="defaultVideoResizeMode",e.RESIZE_MODE_PER_CAMERA="camerasResizeMode",e.FISHEYE_CAMERAS="fisheyeCameras"}(te||(te={}));class re extends ee{constructor(e){super(),Object.defineProperty(this,"notification",{enumerable:!0,configurable:!0,writable:!0,value:e}),Object.defineProperty(this,"user",{enumerable:!0,configurable:!0,writable:!0,value:null}),Object.defineProperty(this,"auth",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"setUser",{enumerable:!0,configurable:!0,writable:!0,value:e=>{this.user=e}}),Object.defineProperty(this,"updateCustomPreferences",{enumerable:!0,configurable:!0,writable:!0,value:e=>{const t=w(null).pipe(R((()=>{if(!this.user)return m((()=>"user is not initialized"));const t={id:this.user.id,jsonField:JSON.stringify({...JSON.parse(this.user.jsonField||"{}"),...e}),version:this.user.version};return this.api.users.UserUpdateProfile(t)})),R((e=>e.success?w(e.resultItems[0]):m((()=>e.error)))),this.retryOnVersionMismatch(),q());return t.subscribe((e=>{this.setUser(e)})),t}}),Object.defineProperty(this,"getPreference",{enumerable:!0,configurable:!0,writable:!0,value:e=>{var t;try{return JSON.parse((null===(t=this.user)||void 0===t?void 0:t.jsonField)||"{}")[e]}catch{return null}}}),Object.defineProperty(this,"retryOnVersionMismatch",{enumerable:!0,configurable:!0,writable:!0,value:()=>U((e=>e.pipe(R(((e,t)=>t?m((()=>e)):-4===e.code?this.loadUser():m((()=>e)))))))}),n(this,{user:i.ref,setUser:a,userDisplayName:t})}get userDisplayName(){return this.user?this.user.firstName&&this.user.firstName.trim()||this.user.lastName&&this.user.lastName.trim()?[this.user.firstName,this.user.lastName].filter(Boolean).join(" ").trim():this.user.email:null}afterInit(){this.disposables.push(this.loadUser().subscribe()),this.disposables.push(this.api.events.pipe(D((({hub:e,event:t})=>"users"===e&&"OnUserUpdateProfile"===t)),x((({data:e})=>e.resultItems[0]))).subscribe(this.setUser))}loadUser(){return this.api.users.GetUser().pipe(R((e=>e.success?w(e.resultItems[0]):m((()=>e.error)))),N(this.setUser),q(1))}setAuthStore(e){this.auth=e}async updateUserPassword(e){var t,r;const n=(Array.isArray(X)?X[0]:X).changePasswordUrl,i=null===(r=null===(t=this.auth)||void 0===t?void 0:t.token)||void 0===r?void 0:r.accessToken,a=JSON.stringify({currentPassword:e.previous,newPassword:e.new}),s=new Headers;s.append("content-type","application/json"),s.append("accept","application/json"),s.append("authorization",`bearer ${i}`);const o=await fetch(n,{method:"PUT",headers:s,body:a}),{status:l}=o;if(l!==E.OK){const e=await o.json();throw new Error(e.errors[0].message)}}updateUserSettings({firstName:e,lastName:t}){const r=w(null).pipe(R((()=>{if(!this.user)throw new Error("user is not initialized");return this.api.users.UserUpdateProfile({id:this.user.id,firstName:e,lastName:t,version:this.user.version})})),R((e=>e.success?w(e.resultItems[0]):m((()=>e.error)))),this.retryOnVersionMismatch(),q());return r.subscribe((e=>{this.setUser(e)})),r}setDefaultGroup(e){const t=w(null).pipe(R((()=>{if(!this.user)return m((()=>"user is not initialized"));const t={id:this.user.id,layoutStartId:e,layoutStartType:"camgroup",version:this.user.version};return this.api.users.UserUpdateProfile(t)})),R((e=>e.success?w(e.resultItems[0]):m((()=>e.error)))),this.retryOnVersionMismatch(),q());return t.subscribe({next:e=>{var t;this.setUser(e),null===(t=this.notification)||void 0===t||t.success("Successfully set default group")},error:e=>{var t;console.error(e),null===(t=this.notification)||void 0===t||t.error(e.message)}}),t}}class ne{constructor(e){Object.defineProperty(this,"json",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"startTime",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"endTime",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"streamUrl",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"duration",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"isLive",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"cameraId",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"id",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),this.json=JSON.stringify(e,null,2),this.startTime=new Date(e.startTime),this.endTime=new Date(e.endTime),this.streamUrl=e.streamUrl,this.cameraId=e.cameraId,this.duration=e.duration,this.id=e.id}}class ie extends ee{constructor(e){super(),Object.defineProperty(this,"camerasStore",{enumerable:!0,configurable:!0,writable:!0,value:e}),Object.defineProperty(this,"data",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"chunksByCameraId",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"chunksByStart",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"chunksByEnd",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"chunksById",{enumerable:!0,configurable:!0,writable:!0,value:new Map}),Object.defineProperty(this,"pendingRequests",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"pendingRequestsByEnd",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"pendingRequestsByStart",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"pendingRequestsByCameraId",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"knownIntervals",{enumerable:!0,configurable:!0,writable:!0,value:new Map}),Object.defineProperty(this,"updates",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,"getClosestChunkRight",{enumerable:!0,configurable:!0,writable:!0,value:({cameraId:e,time:t})=>{this.chunksByCameraId.filter(e),this.chunksByEnd.filter([t,1/0]);const r=this.chunksByStart.bottom(1);return this.chunksByCameraId.filterAll(),this.chunksByEnd.filterAll(),r[0]}}),Object.defineProperty(this,"getClosestChunkLeft",{enumerable:!0,configurable:!0,writable:!0,value:({cameraId:e,time:t})=>{this.chunksByCameraId.filter(e),this.chunksByStart.filter([-1/0,+t+5e-4]);const r=this.chunksByStart.top(1);return this.chunksByCameraId.filterAll(),this.chunksByEnd.filterAll(),r[0]}}),Object.defineProperty(this,"fetchNextChunk",{enumerable:!0,configurable:!0,writable:!0,value:({cameraId:e,time:t})=>{if(this.knownIntervals.has(e)){const[r,n]=this.knownIntervals.get(e);if(r<=t&&n>=t){const r=this.getClosestChunkRight({cameraId:e,time:t});if(r)return w(r)}}return w({result:[],time:t}).pipe(M((({result:t,time:r})=>{if(t.length||r>=new Date)return c;const n=new Date(+r+36e5);return this.fetch(e,r,n).pipe(x((e=>({result:e,time:n}))))})),F(),x((()=>this.getClosestChunkRight({cameraId:e,time:t}))))}}),Object.defineProperty(this,"fetchPrevChunk",{enumerable:!0,configurable:!0,writable:!0,value:({cameraId:e,time:t})=>{if(this.knownIntervals.has(e)){const[r,n]=this.knownIntervals.get(e);if(r<=t&&n>=t){const r=this.getClosestChunkLeft({cameraId:e,time:t});if(r)return w(r)}}const r=this.camerasStore.camerasById.get(e);if(!r)return w(void 0);const n=new Date(Date.now()-3600*r.archiveDuration*1e3);return this.knownIntervals.get(e)&&this.knownIntervals.get(e)[0]<=n?w(void 0):w({result:[],time:t}).pipe(M((({result:t,time:r})=>{if(t.length||r<=n)return c;const i=new Date(Math.max(+r-36e5,+n));return this.fetch(e,i,r).pipe(x((e=>({result:e,time:i}))))})),F(),x((()=>this.getClosestChunkRight({cameraId:e,time:t}))))}}),n(this,{updates:i,add:a.bound}),this.data=G(),this.chunksByCameraId=this.data.dimension((e=>e.cameraId)),this.chunksByStart=this.data.dimension((e=>+e.startTime)),this.chunksByEnd=this.data.dimension((e=>+e.endTime)),this.pendingRequests=G(),this.pendingRequestsByStart=this.pendingRequests.dimension((e=>+e.startTime)),this.pendingRequestsByEnd=this.pendingRequests.dimension((e=>+e.endTime)),this.pendingRequestsByCameraId=this.pendingRequests.dimension((e=>e.cameraId))}fetch(e,t,r){this.pendingRequestsByCameraId.filter(e),this.pendingRequestsByStart.filter(t),this.pendingRequestsByEnd.filter(r);const n=this.pendingRequests.allFiltered()[0];if(this.pendingRequestsByCameraId.filterAll(),this.pendingRequestsByStart.filterAll(),this.pendingRequestsByEnd.filterAll(),n)return n.request;if(this.knownIntervals.has(e)){const[n,i]=this.knownIntervals.get(e);if(n<=t&&i>=r)return w(this.getChunks({cameraId:e,from:t,to:r}));n<=t&&i<r&&(t=i),n>t&&i>=r&&(r=n),r<n&&(r=n),t>i&&(t=i)}const i=this.api.archives.PopulateArchive({cameraId:e,startTime:t,endTime:r}).pipe(x((e=>e.resultItems[0].chunks.map((e=>new ne(e))))),N(this.add),N((r=>this.extendKnownInterval(e,t,r))),q());return this.pendingRequests.add([{cameraId:e,startTime:t,endTime:r,request:i}]),i.pipe(N((()=>this.pendingRequests.remove((e=>e.request===i))))).subscribe(),i}extendKnownInterval(e,t,r){t=new Date(Math.min(+t,...r.map((e=>+e.startTime))));const n=new Date(Math.max(...r.map((e=>+e.endTime))));if(this.knownIntervals.has(e)){const r=this.knownIntervals.get(e);t<r[0]&&(r[0]=t),n>r[1]&&(r[1]=n)}else this.knownIntervals.set(e,[t,n])}add(e){const t=e.filter((e=>!this.chunksById.has(e.id)));t.forEach((e=>this.chunksById.set(e.id,e))),this.data.add(t),t.length&&this.updates++}getChunks({cameraId:e,from:t,to:r}){this.chunksByStart.filter([-1/0,+r+5e-4]),this.chunksByEnd.filter([t,1/0]),e&&this.chunksByCameraId.filter(e);const n=this.chunksByStart.top(1/0);return e&&this.chunksByCameraId.filterAll(),this.chunksByStart.filterAll(),this.chunksByEnd.filterAll(),n}afterInit(){this.api.events.pipe(D((({hub:e,event:t})=>"archives"===e&&"OnArchiveChunksCreated"===t))).subscribe((({data:e})=>{this.add(e.resultItems.map((e=>new ne(e))))}))}}class ae{constructor(e){Object.defineProperty(this,"id",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"imageUrl",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"streamUrl",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"dashStreamUrl",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"address",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"archiveDuration",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"dvrWindowLength",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"stateUpdatedAt",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"raw",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"enabled",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"isMicEnabled",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"state",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"pin",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"webRtcUrl",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"isPtz",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"permissions",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"update",{enumerable:!0,configurable:!0,writable:!0,value:e=>{this.raw=e,this.id=e.id,this.name=e.name,this.isPtz=e.isPTZ,this.isMicEnabled=e.isMicEnabled,this.imageUrl=e.imageUrl,this.address=e.cameraAddress?JSON.parse(e.cameraAddress):null,this.streamUrl=e.streamUrl,this.dashStreamUrl=e.dashStreamUrl,this.enabled=e.enabled,this.state=this.raw.cameraState,this.dvrWindowLength=e.dvrWindowLength?1e3*e.dvrWindowLength:e.dvrWindowLength,this.archiveDuration=e.archiveDuration,this.pin=e.pin,this.webRtcUrl=e.webRtcUrl,this.permissions=e.permissions||0,this.stateUpdatedAt=new Date(e.cameraStateChangedTime)}}),n(this,{name:i,streamUrl:i,dashStreamUrl:i,enabled:i,isMicEnabled:i,state:i,pin:i,webRtcUrl:i,permissions:i,isOnline:t,update:a}),this.update(e)}get isOnline(){return this.enabled&&"Started"===this.state}get supportsWebRTC(){return!!this.webRtcUrl}}class se extends ee{constructor(){super(),Object.defineProperty(this,"camerasById",{enumerable:!0,configurable:!0,writable:!0,value:new Map}),Object.defineProperty(this,"data",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"loading",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"loaded",{enumerable:!0,configurable:!0,writable:!0,value:!1}),Object.defineProperty(this,"load",{enumerable:!0,configurable:!0,writable:!0,value:()=>{if(this.loaded)return;r((()=>this.loading=!0));const e=this.api.cameras.GetCameras({},null).pipe(p((e=>e.success?w(e.resultItems):(console.error(e.error),m((()=>e.error))))),A());return e.subscribe((e=>{r((()=>{this.add(e),this.loading=!1,this.loaded=!0}))})),e}}),Object.defineProperty(this,"add",{enumerable:!0,configurable:!0,writable:!0,value:e=>{e.forEach((e=>{this.camerasById.has(e.id)?this.camerasById.get(e.id).update(e):this.camerasById.set(e.id,new ae(e))})),this.data=Array.from(this.camerasById.values()).sort(((e,t)=>L(e.name,t.name,{caseInsensitive:!0})))}}),Object.defineProperty(this,"sync",{enumerable:!0,configurable:!0,writable:!0,value:()=>{const e=this.data.reduce(((e,t)=>Math.max(e,+t.stateUpdatedAt)),0);if(!e)return c;const t=this.api.cameras.GetCameras({},new Date(1e3*(Math.floor(e/1e3)+1))).pipe(p((e=>e.success?w(e.resultItems):(console.error(e.error),m((()=>e.error))))),T(1));return t.subscribe((e=>this.add(e))),t}}),n(this,{data:i.ref,loading:i,loaded:i,add:a}),this.disposables.push(s((()=>this.loaded),(()=>{this.api.connection$.pipe(C(1),B((()=>this.sync()))).subscribe()})))}afterInit(){this.disposables.push(this.api.events.pipe(f((({hub:e,event:t})=>"cameras"===e&&("OnCameraUpdated"===t||"OnSystemCameraUpdated"===t))),S((({data:e,event:t})=>e.resultItems?{data:e.resultItems[0],event:t}:{data:e,event:t}))).subscribe((({data:e,event:t})=>{const r=this.camerasById.get(e.id);if(!r)return console.warn("got update for unknown camera:",e.id);if("OnSystemCameraUpdated"===t){const t=r.raw;for(const[r,n]of Object.entries(e))null===n&&(e[r]=t[r])}r.update(e)})))}dispose(){super.dispose(),this.camerasById.clear(),this.data=[]}}const oe={amber:{50:"#fff8e1",100:"#ffecb3",200:"#ffe082",300:"#ffd54f",400:"#ffca28",500:"#ffc107",600:"#ffb300",700:"#ffa000",800:"#ff8f00",900:"#ff6f00",A100:"#ffe57f",A200:"#ffd740",A400:"#ffc400",A700:"#ffab00"},blue:{50:"#e3f2fd",100:"#bbdefb",200:"#90caf9",300:"#64b5f6",400:"#42a5f5",500:"#2196f3",600:"#1e88e5",700:"#1976d2",800:"#1565c0",900:"#0d47a1",A100:"#82b1ff",A200:"#448aff",A400:"#2979ff",A700:"#2962ff"},blueGrey:{50:"#eceff1",100:"#cfd8dc",200:"#b0bec5",300:"#90a4ae",400:"#78909c",500:"#607d8b",600:"#546e7a",700:"#455a64",800:"#37474f",900:"#263238",A100:"#cfd8dc",A200:"#b0bec5",A400:"#78909c",A700:"#455a64"},brown:{50:"#efebe9",100:"#d7ccc8",200:"#bcaaa4",300:"#a1887f",400:"#8d6e63",500:"#795548",600:"#6d4c41",700:"#5d4037",800:"#4e342e",900:"#3e2723",A100:"#d7ccc8",A200:"#bcaaa4",A400:"#8d6e63",A700:"#5d4037"},cyan:{50:"#e0f7fa",100:"#b2ebf2",200:"#80deea",300:"#4dd0e1",400:"#26c6da",500:"#00bcd4",600:"#00acc1",700:"#0097a7",800:"#00838f",900:"#006064",A100:"#84ffff",A200:"#18ffff",A400:"#00e5ff",A700:"#00b8d4"},deepOrange:{50:"#fbe9e7",100:"#ffccbc",200:"#ffab91",300:"#ff8a65",400:"#ff7043",500:"#ff5722",600:"#f4511e",700:"#e64a19",800:"#d84315",900:"#bf360c",A100:"#ff9e80",A200:"#ff6e40",A400:"#ff3d00",A700:"#dd2c00"},deepPurple:{50:"#ede7f6",100:"#d1c4e9",200:"#b39ddb",300:"#9575cd",400:"#7e57c2",500:"#673ab7",600:"#5e35b1",700:"#512da8",800:"#4527a0",900:"#311b92",A100:"#b388ff",A200:"#7c4dff",A400:"#651fff",A700:"#6200ea"},green:{50:"#e8f5e9",100:"#c8e6c9",200:"#a5d6a7",300:"#81c784",400:"#66bb6a",500:"#4caf50",600:"#43a047",700:"#388e3c",800:"#2e7d32",900:"#1b5e20",A100:"#b9f6ca",A200:"#69f0ae",A400:"#00e676",A700:"#00c853"},grey:{50:"#fafafa",100:"#f5f5f5",200:"#eeeeee",300:"#e0e0e0",400:"#bdbdbd",500:"#9e9e9e",600:"#757575",700:"#616161",800:"#424242",900:"#212121",A100:"#f5f5f5",A200:"#eeeeee",A400:"#bdbdbd",A700:"#616161"},indigo:{50:"#e8eaf6",100:"#c5cae9",200:"#9fa8da",300:"#7986cb",400:"#5c6bc0",500:"#3f51b5",600:"#3949ab",700:"#303f9f",800:"#283593",900:"#1a237e",A100:"#8c9eff",A200:"#536dfe",A400:"#3d5afe",A700:"#304ffe"},lightBlue:{50:"#e1f5fe",100:"#b3e5fc",200:"#81d4fa",300:"#4fc3f7",400:"#29b6f6",500:"#03a9f4",600:"#039be5",700:"#0288d1",800:"#0277bd",900:"#01579b",A100:"#80d8ff",A200:"#40c4ff",A400:"#00b0ff",A700:"#0091ea"},lightGreen:{50:"#f1f8e9",100:"#dcedc8",200:"#c5e1a5",300:"#aed581",400:"#9ccc65",500:"#8bc34a",600:"#7cb342",700:"#689f38",800:"#558b2f",900:"#33691e",A100:"#ccff90",A200:"#b2ff59",A400:"#76ff03",A700:"#64dd17"},lime:{50:"#f9fbe7",100:"#f0f4c3",200:"#e6ee9c",300:"#dce775",400:"#d4e157",500:"#cddc39",600:"#c0ca33",700:"#afb42b",800:"#9e9d24",900:"#827717",A100:"#f4ff81",A200:"#eeff41",A400:"#c6ff00",A700:"#aeea00"},orange:{50:"#fff3e0",100:"#ffe0b2",200:"#ffcc80",300:"#ffb74d",400:"#ffa726",500:"#ff9800",600:"#fb8c00",700:"#f57c00",800:"#ef6c00",900:"#e65100",A100:"#ffd180",A200:"#ffab40",A400:"#ff9100",A700:"#ff6d00"},pink:{50:"#fce4ec",100:"#f8bbd0",200:"#f48fb1",300:"#f06292",400:"#ec407a",500:"#e91e63",600:"#d81b60",700:"#c2185b",800:"#ad1457",900:"#880e4f",A100:"#ff80ab",A200:"#ff4081",A400:"#f50057",A700:"#c51162"},purple:{50:"#f3e5f5",100:"#e1bee7",200:"#ce93d8",300:"#ba68c8",400:"#ab47bc",500:"#9c27b0",600:"#8e24aa",700:"#7b1fa2",800:"#6a1b9a",900:"#4a148c",A100:"#ea80fc",A200:"#e040fb",A400:"#d500f9",A700:"#aa00ff"},red:{50:"#ffebee",100:"#ffcdd2",200:"#ef9a9a",300:"#e57373",400:"#ef5350",500:"#f44336",600:"#e53935",700:"#d32f2f",800:"#c62828",900:"#b71c1c",A100:"#ff8a80",A200:"#ff5252",A400:"#ff1744",A700:"#d50000"},teal:{50:"#e0f2f1",100:"#b2dfdb",200:"#80cbc4",300:"#4db6ac",400:"#26a69a",500:"#009688",600:"#00897b",700:"#00796b",800:"#00695c",900:"#004d40",A100:"#a7ffeb",A200:"#64ffda",A400:"#1de9b6",A700:"#00bfa5"},yellow:{50:"#fffde7",100:"#fff9c4",200:"#fff59d",300:"#fff176",400:"#ffee58",500:"#ffeb3b",600:"#fdd835",700:"#fbc02d",800:"#f9a825",900:"#f57f17",A100:"#ffff8d",A200:"#ffff00",A400:"#ffea00",A700:"#ffd600"}},le={Person:"red",Car:"green",Animal:"blue",LicensePlate:"cyan"},ue=["green","red","blue","purple","teal","amber","pink","cyan","lightGreen","deepOrange","deepPurple","lime","indigo","orange","lightBlue"];class ce extends ee{constructor(){super(),Object.defineProperty(this,"schemaDescription",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"fetchAnalyticEventSchema",{enumerable:!0,configurable:!0,writable:!0,value:()=>{this.api.cameras.GetSensorDataSchema("Analytic").subscribe({next:e=>{e.success?r((()=>{this.schemaDescription=e.resultItems})):console.error(e)},error:console.error})}}),n(this,{schemaDescription:i.ref,foundObjectTypes:t,foundObjectTypesForSelect:t,colorsByFoundObjectType:t})}get foundObjectTypes(){if(!this.schemaDescription.length)return[];const e=this.schemaDescription.filter((e=>"filter"===e.parameterType&&"Type"===e.fieldName&&"Analytic"===e.eventType))[0];return e?e.valueSet.includes("LicensePlate")?e.valueSet.split(", "):e.valueSet.split(", ").concat(["LicensePlate"]):[]}get foundObjectTypesForSelect(){const e=Object.entries(le).filter((([e])=>this.foundObjectTypes.includes(e))).map((([,e])=>e)),t=ue.filter((t=>!e.includes(t)));let r=0;return this.foundObjectTypes.map((e=>{const n=e in le?le[e]:t[r++],i=oe[n];return{id:e,name:e.toLowerCase(),color:i[500],highlightColor:i.A400,type:"detectedObject"}}))}get colorsByFoundObjectType(){const e=new Map;return this.foundObjectTypesForSelect.forEach((t=>{e.set(t.id,t.highlightColor)})),e}afterInit(){this.fetchAnalyticEventSchema()}dispose(){super.dispose(),this.schemaDescription=[]}}var de="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};var fe=function(e,t,r,n){for(var i=-1,a=null==e?0:e.length;++i<a;){var s=e[i];t(n,s,r(s),e)}return n};var he=function(e){return function(t,r,n){for(var i=-1,a=Object(t),s=n(t),o=s.length;o--;){var l=s[e?o:++i];if(!1===r(a[l],l,a))break}return t}}();var be=function(e,t){for(var r=-1,n=Array(e);++r<e;)n[r]=t(r);return n},pe="object"==typeof de&&de&&de.Object===Object&&de,ve=pe,me="object"==typeof self&&self&&self.Object===Object&&self,ye=ve||me||Function("return this")(),ge=ye.Symbol,we=ge,je=Object.prototype,Oe=je.hasOwnProperty,Ie=je.toString,ke=we?we.toStringTag:void 0;var Pe=function(e){var t=Oe.call(e,ke),r=e[ke];try{e[ke]=void 0;var n=!0}catch(e){}var i=Ie.call(e);return n&&(t?e[ke]=r:delete e[ke]),i},Ae=Object.prototype.toString;var Te=Pe,Ce=function(e){return Ae.call(e)},Be=ge?ge.toStringTag:void 0;var Se=function(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":Be&&Be in Object(e)?Te(e):Ce(e)};var _e=function(e){return null!=e&&"object"==typeof e},Ee=Se,Re=_e;var qe=function(e){return Re(e)&&"[object Arguments]"==Ee(e)},Ue=_e,De=Object.prototype,xe=De.hasOwnProperty,Ne=De.propertyIsEnumerable,Me=qe(function(){return arguments}())?qe:function(e){return Ue(e)&&xe.call(e,"callee")&&!Ne.call(e,"callee")},Fe=Array.isArray,ze={exports:{}};var Ge=function(){return!1};!function(e,t){var r=ye,n=Ge,i=t&&!t.nodeType&&t,a=i&&e&&!e.nodeType&&e,s=a&&a.exports===i?r.Buffer:void 0,o=(s?s.isBuffer:void 0)||n;e.exports=o}(ze,ze.exports);var Le=/^(?:0|[1-9]\d*)$/;var $e=function(e,t){var r=typeof e;return!!(t=null==t?9007199254740991:t)&&("number"==r||"symbol"!=r&&Le.test(e))&&e>-1&&e%1==0&&e<t};var We=function(e){return"number"==typeof e&&e>-1&&e%1==0&&e<=9007199254740991},Ve=Se,He=We,Je=_e,Ke={};Ke["[object Float32Array]"]=Ke["[object Float64Array]"]=Ke["[object Int8Array]"]=Ke["[object Int16Array]"]=Ke["[object Int32Array]"]=Ke["[object Uint8Array]"]=Ke["[object Uint8ClampedArray]"]=Ke["[object Uint16Array]"]=Ke["[object Uint32Array]"]=!0,Ke["[object Arguments]"]=Ke["[object Array]"]=Ke["[object ArrayBuffer]"]=Ke["[object Boolean]"]=Ke["[object DataView]"]=Ke["[object Date]"]=Ke["[object Error]"]=Ke["[object Function]"]=Ke["[object Map]"]=Ke["[object Number]"]=Ke["[object Object]"]=Ke["[object RegExp]"]=Ke["[object Set]"]=Ke["[object String]"]=Ke["[object WeakMap]"]=!1;var Ze=function(e){return Je(e)&&He(e.length)&&!!Ke[Ve(e)]};var Ye=function(e){return function(t){return e(t)}},Qe={exports:{}};!function(e,t){var r=pe,n=t&&!t.nodeType&&t,i=n&&e&&!e.nodeType&&e,a=i&&i.exports===n&&r.process,s=function(){try{var e=i&&i.require&&i.require("util").types;return e||a&&a.binding&&a.binding("util")}catch(e){}}();e.exports=s}(Qe,Qe.exports);var Xe=Ze,et=Ye,tt=Qe.exports,rt=tt&&tt.isTypedArray,nt=rt?et(rt):Xe,it=be,at=Me,st=Fe,ot=ze.exports,lt=$e,ut=nt,ct=Object.prototype.hasOwnProperty;var dt=function(e,t){var r=st(e),n=!r&&at(e),i=!r&&!n&&ot(e),a=!r&&!n&&!i&&ut(e),s=r||n||i||a,o=s?it(e.length,String):[],l=o.length;for(var u in e)!t&&!ct.call(e,u)||s&&("length"==u||i&&("offset"==u||"parent"==u)||a&&("buffer"==u||"byteLength"==u||"byteOffset"==u)||lt(u,l))||o.push(u);return o},ft=Object.prototype;var ht=function(e){var t=e&&e.constructor;return e===("function"==typeof t&&t.prototype||ft)};var bt=function(e,t){return function(r){return e(t(r))}}(Object.keys,Object),pt=ht,vt=bt,mt=Object.prototype.hasOwnProperty;var yt=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)},gt=Se,wt=yt;var jt=function(e){if(!wt(e))return!1;var t=gt(e);return"[object Function]"==t||"[object GeneratorFunction]"==t||"[object AsyncFunction]"==t||"[object Proxy]"==t},Ot=jt,It=We;var kt=function(e){return null!=e&&It(e.length)&&!Ot(e)},Pt=dt,At=function(e){if(!pt(e))return vt(e);var t=[];for(var r in Object(e))mt.call(e,r)&&"constructor"!=r&&t.push(r);return t},Tt=kt;var Ct=function(e){return Tt(e)?Pt(e):At(e)},Bt=he,St=Ct;var _t=kt;var Et=function(e,t){return function(r,n){if(null==r)return r;if(!_t(r))return e(r,n);for(var i=r.length,a=t?i:-1,s=Object(r);(t?a--:++a<i)&&!1!==n(s[a],a,s););return r}}((function(e,t){return e&&Bt(e,t,St)}));var Rt=function(e,t,r,n){return Et(e,(function(e,i,a){t(n,e,r(e),a)})),n};var qt=function(){this.__data__=[],this.size=0};var Ut=function(e,t){return e===t||e!=e&&t!=t},Dt=Ut;var xt=function(e,t){for(var r=e.length;r--;)if(Dt(e[r][0],t))return r;return-1},Nt=xt,Mt=Array.prototype.splice;var Ft=xt;var zt=xt;var Gt=xt;var Lt=qt,$t=function(e){var t=this.__data__,r=Nt(t,e);return!(r<0)&&(r==t.length-1?t.pop():Mt.call(t,r,1),--this.size,!0)},Wt=function(e){var t=this.__data__,r=Ft(t,e);return r<0?void 0:t[r][1]},Vt=function(e){return zt(this.__data__,e)>-1},Ht=function(e,t){var r=this.__data__,n=Gt(r,e);return n<0?(++this.size,r.push([e,t])):r[n][1]=t,this};function Jt(e){var t=-1,r=null==e?0:e.length;for(this.clear();++t<r;){var n=e[t];this.set(n[0],n[1])}}Jt.prototype.clear=Lt,Jt.prototype.delete=$t,Jt.prototype.get=Wt,Jt.prototype.has=Vt,Jt.prototype.set=Ht;var Kt=Jt,Zt=Kt;var Yt=function(){this.__data__=new Zt,this.size=0};var Qt=function(e){var t=this.__data__,r=t.delete(e);return this.size=t.size,r};var Xt=function(e){return this.__data__.get(e)};var er,tr=function(e){return this.__data__.has(e)},rr=ye["__core-js_shared__"],nr=(er=/[^.]+$/.exec(rr&&rr.keys&&rr.keys.IE_PROTO||""))?"Symbol(src)_1."+er:"";var ir=function(e){return!!nr&&nr in e},ar=Function.prototype.toString;var sr=function(e){if(null!=e){try{return ar.call(e)}catch(e){}try{return e+""}catch(e){}}return""},or=jt,lr=ir,ur=yt,cr=sr,dr=/^\[object .+?Constructor\]$/,fr=Function.prototype,hr=Object.prototype,br=fr.toString,pr=hr.hasOwnProperty,vr=RegExp("^"+br.call(pr).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");var mr=function(e){return!(!ur(e)||lr(e))&&(or(e)?vr:dr).test(cr(e))},yr=function(e,t){return null==e?void 0:e[t]};var gr=function(e,t){var r=yr(e,t);return mr(r)?r:void 0},wr=gr(ye,"Map"),jr=gr(Object,"create"),Or=jr;var Ir=function(){this.__data__=Or?Or(null):{},this.size=0};var kr=function(e){var t=this.has(e)&&delete this.__data__[e];return this.size-=t?1:0,t},Pr=jr,Ar=Object.prototype.hasOwnProperty;var Tr=function(e){var t=this.__data__;if(Pr){var r=t[e];return"__lodash_hash_undefined__"===r?void 0:r}return Ar.call(t,e)?t[e]:void 0},Cr=jr,Br=Object.prototype.hasOwnProperty;var Sr=jr;var _r=Ir,Er=kr,Rr=Tr,qr=function(e){var t=this.__data__;return Cr?void 0!==t[e]:Br.call(t,e)},Ur=function(e,t){var r=this.__data__;return this.size+=this.has(e)?0:1,r[e]=Sr&&void 0===t?"__lodash_hash_undefined__":t,this};function Dr(e){var t=-1,r=null==e?0:e.length;for(this.clear();++t<r;){var n=e[t];this.set(n[0],n[1])}}Dr.prototype.clear=_r,Dr.prototype.delete=Er,Dr.prototype.get=Rr,Dr.prototype.has=qr,Dr.prototype.set=Ur;var xr=Dr,Nr=Kt,Mr=wr;var Fr=function(e){var t=typeof e;return"string"==t||"number"==t||"symbol"==t||"boolean"==t?"__proto__"!==e:null===e};var zr=function(e,t){var r=e.__data__;return Fr(t)?r["string"==typeof t?"string":"hash"]:r.map},Gr=zr;var Lr=zr;var $r=zr;var Wr=zr;var Vr=function(){this.size=0,this.__data__={hash:new xr,map:new(Mr||Nr),string:new xr}},Hr=function(e){var t=Gr(this,e).delete(e);return this.size-=t?1:0,t},Jr=function(e){return Lr(this,e).get(e)},Kr=function(e){return $r(this,e).has(e)},Zr=function(e,t){var r=Wr(this,e),n=r.size;return r.set(e,t),this.size+=r.size==n?0:1,this};function Yr(e){var t=-1,r=null==e?0:e.length;for(this.clear();++t<r;){var n=e[t];this.set(n[0],n[1])}}Yr.prototype.clear=Vr,Yr.prototype.delete=Hr,Yr.prototype.get=Jr,Yr.prototype.has=Kr,Yr.prototype.set=Zr;var Qr=Yr,Xr=Kt,en=wr,tn=Qr;var rn=Kt,nn=Yt,an=Qt,sn=Xt,on=tr,ln=function(e,t){var r=this.__data__;if(r instanceof Xr){var n=r.__data__;if(!en||n.length<199)return n.push([e,t]),this.size=++r.size,this;r=this.__data__=new tn(n)}return r.set(e,t),this.size=r.size,this};function un(e){var t=this.__data__=new rn(e);this.size=t.size}un.prototype.clear=nn,un.prototype.delete=an,un.prototype.get=sn,un.prototype.has=on,un.prototype.set=ln;var cn=un;var dn=Qr,fn=function(e){return this.__data__.set(e,"__lodash_hash_undefined__"),this},hn=function(e){return this.__data__.has(e)};function bn(e){var t=-1,r=null==e?0:e.length;for(this.__data__=new dn;++t<r;)this.add(e[t])}bn.prototype.add=bn.prototype.push=fn,bn.prototype.has=hn;var pn=bn;var vn=function(e,t){return e.has(t)},mn=pn,yn=function(e,t){for(var r=-1,n=null==e?0:e.length;++r<n;)if(t(e[r],r,e))return!0;return!1},gn=vn;var wn=function(e,t,r,n,i,a){var s=1&r,o=e.length,l=t.length;if(o!=l&&!(s&&l>o))return!1;var u=a.get(e),c=a.get(t);if(u&&c)return u==t&&c==e;var d=-1,f=!0,h=2&r?new mn:void 0;for(a.set(e,t),a.set(t,e);++d<o;){var b=e[d],p=t[d];if(n)var v=s?n(p,b,d,t,e,a):n(b,p,d,e,t,a);if(void 0!==v){if(v)continue;f=!1;break}if(h){if(!yn(t,(function(e,t){if(!gn(h,t)&&(b===e||i(b,e,r,n,a)))return h.push(t)}))){f=!1;break}}else if(b!==p&&!i(b,p,r,n,a)){f=!1;break}}return a.delete(e),a.delete(t),f};var jn=function(e){var t=-1,r=Array(e.size);return e.forEach((function(e){r[++t]=e})),r},On=ye.Uint8Array,In=Ut,kn=wn,Pn=function(e){var t=-1,r=Array(e.size);return e.forEach((function(e,n){r[++t]=[n,e]})),r},An=jn,Tn=ge?ge.prototype:void 0,Cn=Tn?Tn.valueOf:void 0;var Bn=function(e,t,r,n,i,a,s){switch(r){case"[object DataView]":if(e.byteLength!=t.byteLength||e.byteOffset!=t.byteOffset)return!1;e=e.buffer,t=t.buffer;case"[object ArrayBuffer]":return!(e.byteLength!=t.byteLength||!a(new On(e),new On(t)));case"[object Boolean]":case"[object Date]":case"[object Number]":return In(+e,+t);case"[object Error]":return e.name==t.name&&e.message==t.message;case"[object RegExp]":case"[object String]":return e==t+"";case"[object Map]":var o=Pn;case"[object Set]":var l=1&n;if(o||(o=An),e.size!=t.size&&!l)return!1;var u=s.get(e);if(u)return u==t;n|=2,s.set(e,t);var c=kn(o(e),o(t),n,i,a,s);return s.delete(e),c;case"[object Symbol]":if(Cn)return Cn.call(e)==Cn.call(t)}return!1};var Sn=function(e,t){for(var r=-1,n=t.length,i=e.length;++r<n;)e[i+r]=t[r];return e},_n=Fe;var En=function(e,t,r){var n=t(e);return _n(e)?n:Sn(n,r(e))};var Rn=function(e,t){for(var r=-1,n=null==e?0:e.length,i=0,a=[];++r<n;){var s=e[r];t(s,r,e)&&(a[i++]=s)}return a},qn=function(){return[]},Un=Object.prototype.propertyIsEnumerable,Dn=Object.getOwnPropertySymbols,xn=En,Nn=Dn?function(e){return null==e?[]:(e=Object(e),Rn(Dn(e),(function(t){return Un.call(e,t)})))}:qn,Mn=Ct;var Fn=function(e){return xn(e,Mn,Nn)},zn=Object.prototype.hasOwnProperty;var Gn=function(e,t,r,n,i,a){var s=1&r,o=Fn(e),l=o.length;if(l!=Fn(t).length&&!s)return!1;for(var u=l;u--;){var c=o[u];if(!(s?c in t:zn.call(t,c)))return!1}var d=a.get(e),f=a.get(t);if(d&&f)return d==t&&f==e;var h=!0;a.set(e,t),a.set(t,e);for(var b=s;++u<l;){var p=e[c=o[u]],v=t[c];if(n)var m=s?n(v,p,c,t,e,a):n(p,v,c,e,t,a);if(!(void 0===m?p===v||i(p,v,r,n,a):m)){h=!1;break}b||(b="constructor"==c)}if(h&&!b){var y=e.constructor,g=t.constructor;y==g||!("constructor"in e)||!("constructor"in t)||"function"==typeof y&&y instanceof y&&"function"==typeof g&&g instanceof g||(h=!1)}return a.delete(e),a.delete(t),h},Ln=gr(ye,"DataView"),$n=gr(ye,"Promise"),Wn=gr(ye,"Set"),Vn=Ln,Hn=wr,Jn=$n,Kn=Wn,Zn=gr(ye,"WeakMap"),Yn=Se,Qn=sr,Xn=Qn(Vn),ei=Qn(Hn),ti=Qn(Jn),ri=Qn(Kn),ni=Qn(Zn),ii=Yn;(Vn&&"[object DataView]"!=ii(new Vn(new ArrayBuffer(1)))||Hn&&"[object Map]"!=ii(new Hn)||Jn&&"[object Promise]"!=ii(Jn.resolve())||Kn&&"[object Set]"!=ii(new Kn)||Zn&&"[object WeakMap]"!=ii(new Zn))&&(ii=function(e){var t=Yn(e),r="[object Object]"==t?e.constructor:void 0,n=r?Qn(r):"";if(n)switch(n){case Xn:return"[object DataView]";case ei:return"[object Map]";case ti:return"[object Promise]";case ri:return"[object Set]";case ni:return"[object WeakMap]"}return t});var ai=cn,si=wn,oi=Bn,li=Gn,ui=ii,ci=Fe,di=ze.exports,fi=nt,hi="[object Object]",bi=Object.prototype.hasOwnProperty;var pi=function(e,t,r,n,i,a){var s=ci(e),o=ci(t),l=s?"[object Array]":ui(e),u=o?"[object Array]":ui(t),c=(l="[object Arguments]"==l?hi:l)==hi,d=(u="[object Arguments]"==u?hi:u)==hi,f=l==u;if(f&&di(e)){if(!di(t))return!1;s=!0,c=!1}if(f&&!c)return a||(a=new ai),s||fi(e)?si(e,t,r,n,i,a):oi(e,t,l,r,n,i,a);if(!(1&r)){var h=c&&bi.call(e,"__wrapped__"),b=d&&bi.call(t,"__wrapped__");if(h||b){var p=h?e.value():e,v=b?t.value():t;return a||(a=new ai),i(p,v,r,n,a)}}return!!f&&(a||(a=new ai),li(e,t,r,n,i,a))},vi=_e;var mi=function e(t,r,n,i,a){return t===r||(null==t||null==r||!vi(t)&&!vi(r)?t!=t&&r!=r:pi(t,r,n,i,e,a))},yi=cn,gi=mi;var wi=yt;var ji=function(e){return e==e&&!wi(e)},Oi=ji,Ii=Ct;var ki=function(e,t){return function(r){return null!=r&&(r[e]===t&&(void 0!==t||e in Object(r)))}},Pi=function(e,t,r,n){var i=r.length,a=i,s=!n;if(null==e)return!a;for(e=Object(e);i--;){var o=r[i];if(s&&o[2]?o[1]!==e[o[0]]:!(o[0]in e))return!1}for(;++i<a;){var l=(o=r[i])[0],u=e[l],c=o[1];if(s&&o[2]){if(void 0===u&&!(l in e))return!1}else{var d=new yi;if(n)var f=n(u,c,l,e,t,d);if(!(void 0===f?gi(c,u,3,n,d):f))return!1}}return!0},Ai=function(e){for(var t=Ii(e),r=t.length;r--;){var n=t[r],i=e[n];t[r]=[n,i,Oi(i)]}return t},Ti=ki;var Ci=function(e){var t=Ai(e);return 1==t.length&&t[0][2]?Ti(t[0][0],t[0][1]):function(r){return r===e||Pi(r,e,t)}},Bi=Se,Si=_e;var _i=function(e){return"symbol"==typeof e||Si(e)&&"[object Symbol]"==Bi(e)},Ei=Fe,Ri=_i,qi=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,Ui=/^\w*$/;var Di=function(e,t){if(Ei(e))return!1;var r=typeof e;return!("number"!=r&&"symbol"!=r&&"boolean"!=r&&null!=e&&!Ri(e))||(Ui.test(e)||!qi.test(e)||null!=t&&e in Object(t))},xi=Qr;function Ni(e,t){if("function"!=typeof e||null!=t&&"function"!=typeof t)throw new TypeError("Expected a function");var r=function(){var n=arguments,i=t?t.apply(this,n):n[0],a=r.cache;if(a.has(i))return a.get(i);var s=e.apply(this,n);return r.cache=a.set(i,s)||a,s};return r.cache=new(Ni.Cache||xi),r}Ni.Cache=xi;var Mi=Ni;var Fi=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,zi=/\\(\\)?/g,Gi=function(e){var t=Mi(e,(function(e){return 500===r.size&&r.clear(),e})),r=t.cache;return t}((function(e){var t=[];return 46===e.charCodeAt(0)&&t.push(""),e.replace(Fi,(function(e,r,n,i){t.push(n?i.replace(zi,"$1"):r||e)})),t}));var Li=function(e,t){for(var r=-1,n=null==e?0:e.length,i=Array(n);++r<n;)i[r]=t(e[r],r,e);return i},$i=Fe,Wi=_i,Vi=ge?ge.prototype:void 0,Hi=Vi?Vi.toString:void 0;var Ji=function e(t){if("string"==typeof t)return t;if($i(t))return Li(t,e)+"";if(Wi(t))return Hi?Hi.call(t):"";var r=t+"";return"0"==r&&1/t==-Infinity?"-0":r};var Ki=Fe,Zi=Di,Yi=Gi,Qi=function(e){return null==e?"":Ji(e)};var Xi=function(e,t){return Ki(e)?e:Zi(e,t)?[e]:Yi(Qi(e))},ea=_i;var ta=function(e){if("string"==typeof e||ea(e))return e;var t=e+"";return"0"==t&&1/e==-Infinity?"-0":t},ra=Xi,na=ta;var ia=function(e,t){for(var r=0,n=(t=ra(t,e)).length;null!=e&&r<n;)e=e[na(t[r++])];return r&&r==n?e:void 0},aa=ia;var sa=Xi,oa=Me,la=Fe,ua=$e,ca=We,da=ta;var fa=function(e,t){return null!=e&&t in Object(e)},ha=function(e,t,r){for(var n=-1,i=(t=sa(t,e)).length,a=!1;++n<i;){var s=da(t[n]);if(!(a=null!=e&&r(e,s)))break;e=e[s]}return a||++n!=i?a:!!(i=null==e?0:e.length)&&ca(i)&&ua(s,i)&&(la(e)||oa(e))};var ba=mi,pa=function(e,t,r){var n=null==e?void 0:aa(e,t);return void 0===n?r:n},va=function(e,t){return null!=e&&ha(e,t,fa)},ma=Di,ya=ji,ga=ki,wa=ta;var ja=ia;var Oa=function(e){return function(t){return null==t?void 0:t[e]}},Ia=function(e){return function(t){return ja(t,e)}},ka=Di,Pa=ta;var Aa=Ci,Ta=function(e,t){return ma(e)&&ya(t)?ga(wa(e),t):function(r){var n=pa(r,e);return void 0===n&&n===t?va(r,e):ba(t,n,3)}},Ca=function(e){return e},Ba=Fe,Sa=function(e){return ka(e)?Oa(Pa(e)):Ia(e)};var _a=function(e){return"function"==typeof e?e:null==e?Ca:"object"==typeof e?Ba(e)?Ta(e[0],e[1]):Aa(e):Sa(e)},Ea=fe,Ra=Rt,qa=_a,Ua=Fe;var Da=function(e,t){return function(r,n){var i=Ua(r)?Ea:Ra,a=t?t():{};return i(r,e,qa(n),a)}}((function(e,t,r){e[r?0:1].push(t)}),(function(){return[[],[]]}));var xa=function(e,t,r,n){for(var i=e.length,a=r+(n?1:-1);n?a--:++a<i;)if(t(e[a],a,e))return a;return-1},Na=function(e){return e!=e},Ma=function(e,t,r){for(var n=r-1,i=e.length;++n<i;)if(e[n]===t)return n;return-1};var Fa=function(e,t,r){return t==t?Ma(e,t,r):xa(e,Na,r)};var za=function(e,t){return!!(null==e?0:e.length)&&Fa(e,t,0)>-1};var Ga=function(e,t,r){for(var n=-1,i=null==e?0:e.length;++n<i;)if(r(t,e[n]))return!0;return!1};var La=Wn,$a=function(){},Wa=La&&1/jn(new La([,-0]))[1]==1/0?function(e){return new La(e)}:$a,Va=pn,Ha=za,Ja=Ga,Ka=vn,Za=Wa,Ya=jn;var Qa=_a,Xa=function(e,t,r){var n=-1,i=Ha,a=e.length,s=!0,o=[],l=o;if(r)s=!1,i=Ja;else if(a>=200){var u=t?null:Za(e);if(u)return Ya(u);s=!1,i=Ka,l=new Va}else l=t?[]:o;e:for(;++n<a;){var c=e[n],d=t?t(c):c;if(c=r||0!==c?c:0,s&&d==d){for(var f=l.length;f--;)if(l[f]===d)continue e;t&&l.push(d),o.push(c)}else i(l,d,r)||(l!==o&&l.push(d),o.push(c))}return o};var es=function(e,t){return e&&e.length?Xa(e,Qa(t)):[]};const ts=new Set(["LicensePlate","FaceDetection","Analytic","SpeedDetection","Temperature","PoS","GPS","DigitalInput"]);class rs{constructor(e){if(Object.defineProperty(this,"cameraId",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"type",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"raw",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"thumbnailUrl",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"detectedObjects",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"faces",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"instant",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),n(this,{id:t,startTime:t,endTime:t,acknowledged:t,isLive:t,raw:i.ref}),this.raw=e,this.type=e.eventType,this.cameraId=e.sensorId,("Analytic"===this.type||"FaceDetection"===this.type)&&e.data)try{const t=JSON.parse(e.data);t.FoundObjects&&(this.type="Analytic",this.detectedObjects=t.FoundObjects),t.Faces&&(this.type="FaceDetection",this.faces=t.Faces),this.thumbnailUrl=t.ThumbnailUrl}catch{console.warn("invalid data",e.data),this.type="Motion"}this.instant=ts.has(this.type),this.detectedObjects||(this.detectedObjects=[])}get id(){return this.raw.id}get startTime(){return new Date(this.raw.startTime)}get endTime(){return new Date(this.raw.endTime)}get isLive(){return!ts.has(this.type)&&+this.startTime==+this.endTime}get acknowledged(){return"sensorId"in this.raw&&!!this.raw.ackEventType}}function ns(e){if(e.length<2)return e;const t=[e[0]];for(let r=1;r<e.length;r++){const n=t.length-1,i=t[n],a=e[r];a[0]>i[1]?t.push(a):t[n]=[i[0],new Date(Math.max(+i[1],+a[1]))]}return t}const is=()=>!0;class as extends ee{constructor(e){super(),Object.defineProperty(this,"camerasStore",{enumerable:!0,configurable:!0,writable:!0,value:e}),Object.defineProperty(this,"data",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"eventsByCameraId",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"eventsByStart",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"eventsByEnd",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"eventsByType",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"eventsByFoundObjects",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"eventsByColor",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"eventsByLiveliness",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"pendingRequests",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"pendingRequestsByEnd",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"pendingRequestsByStart",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"pendingRequestsByCameraId",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"knownIntervals",{enumerable:!0,configurable:!0,writable:!0,value:G()}),Object.defineProperty(this,"knownIntervalsByCameraId",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"knownIntervalsByStart",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"knownIntervalsByEnd",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"eventsById",{enumerable:!0,configurable:!0,writable:!0,value:new Map}),Object.defineProperty(this,"updates",{enumerable:!0,configurable:!0,writable:!0,value:0}),Object.defineProperty(this,"recentAdditions",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"update",{enumerable:!0,configurable:!0,writable:!0,value:e=>{e.forEach((e=>{const t=this.eventsById.get(e.id);t&&(t.raw=e.raw,this.data.remove((t=>t.id===e.id)),this.data.add([t]))}))}}),Object.defineProperty(this,"add",{enumerable:!0,configurable:!0,writable:!0,value:e=>{const t=e.filter((e=>!this.eventsById.has(e.id)));t.forEach((e=>this.eventsById.set(e.id,e))),this.data.add(t),t.length&&this.updates++}}),Object.defineProperty(this,"processNewEvents",{enumerable:!0,configurable:!0,writable:!0,value:({data:e})=>{const t=es(e.filter((e=>this.camerasStore.camerasById.has(e.sensorId))).reverse(),"id").map((e=>new rs(e))),[r,n]=Da(t,(e=>this.eventsById.has(e.id)));this.update(r),this.add(n),n.length&&(this.recentAdditions=n.map((e=>e.id)))}}),n(this,{updates:i,recentAdditions:i.ref,processNewEvents:a,update:a,add:a,dispose:a}),this.data=G(),this.eventsByCameraId=this.data.dimension((e=>e.cameraId)),this.eventsByStart=this.data.dimension((e=>+e.startTime)),this.eventsByEnd=this.data.dimension((e=>+e.endTime)),this.eventsByType=this.data.dimension((e=>e.type)),this.eventsByFoundObjects=this.data.dimension((e=>e.detectedObjects.map((e=>e.Type))),!0),this.eventsByColor=this.data.dimension((e=>e.detectedObjects.reduce(((e,t)=>{var r,n;return e.concat(...null!==(n=null===(r=t.Colors)||void 0===r?void 0:r.map((e=>e.Color)))&&void 0!==n?n:[])}),[])),!0),this.eventsByLiveliness=this.data.dimension((e=>e.isLive)),this.pendingRequests=G(),this.pendingRequestsByStart=this.pendingRequests.dimension((e=>+e.startTime)),this.pendingRequestsByEnd=this.pendingRequests.dimension((e=>+e.endTime)),this.pendingRequestsByCameraId=this.pendingRequests.dimension((e=>e.cameraId)),this.knownIntervalsByCameraId=this.knownIntervals.dimension((e=>e.cameraId)),this.knownIntervalsByStart=this.knownIntervals.dimension((e=>+e.from)),this.knownIntervalsByEnd=this.knownIntervals.dimension((e=>+e.to))}populateEvents(e,t,r){const n=null===r?new Date(Date.now()-6e5):r;-1===e?this.knownIntervalsByCameraId.filter(-1):this.knownIntervalsByCameraId.filter((t=>-1===t||t===e)),this.knownIntervalsByStart.filter([-1/0,n]),this.knownIntervalsByEnd.filter([t,1/0]);const i=this.knownIntervalsByStart.bottom(1/0),a=[];if(this.knownIntervalsByCameraId.filterAll(),this.knownIntervalsByStart.filterAll(),this.knownIntervalsByEnd.filterAll(),i.length){const s=ns(i.map((e=>[e.from,e.to])));s[0][0]>t&&a.push([t,s[0][0]]);for(let e=0;e<s.length-1;e++)a.push([s[e][1],s[e+1][0]]);s[ns.length-1][1]<n&&a.push([s[ns.length-1][1],n]),a.length&&(t=a[0][0],+a[a.length-1][1]<=+n&&(r=a[a.length-1][1]),this.knownIntervals.add([{cameraId:e,from:t,to:n}]))}else this.knownIntervals.add([{cameraId:e,from:t,to:n}]);this.pendingRequestsByCameraId.filter(e),this.pendingRequestsByStart.filter(t),this.pendingRequestsByEnd.filter(n);const s=this.pendingRequests.allFiltered()[0];if(this.pendingRequestsByCameraId.filterAll(),this.pendingRequestsByStart.filterAll(),this.pendingRequestsByEnd.filterAll(),s)return;if(i.length&&!a.length)return;const o=n=>this.api.cameras.GetSensorEventsPage({sensorIds:[e],sensorType:"camera",sensorEventTypes:[],startTime:t,endTime:r,rowsLimit:100,isDescending:!0,pageToken:n},null,[]).pipe(R((e=>e.success?w(e):(console.error(e.error),m((()=>e.error)))))),l=o().pipe(M((e=>e.pageInfo.haveMore?o(e.pageInfo.nextPageToken):c)),x((e=>e.resultItems.map((e=>new rs(e))))),z());this.pendingRequests.add([{cameraId:e,startTime:t,endTime:r||new Date,request:l}]),l.subscribe({next:this.add,error:e=>{console.error(e),this.pendingRequests.remove((e=>e.request===l))},complete:()=>{this.pendingRequests.remove((e=>e.request===l))}})}getEvents({cameraIds:e,from:t,to:r,detectedObjectTypes:n,eventTypes:i,colors:a,probability:s}){this.eventsByStart.filter([+t,r?+r+5e-4:1/0]),(null==e?void 0:e.length)&&this.eventsByCameraId.filter((t=>e.includes(t))),(null==i?void 0:i.length)&&this.eventsByType.filter((e=>i.includes(e))),(null==n?void 0:n.length)&&this.eventsByFoundObjects.filter((e=>n.includes(e))),(null==a?void 0:a.size)&&this.eventsByColor.filter((e=>a.has(e)));let o=this.eventsByStart.top(1/0);return(null==i?void 0:i.length)&&this.eventsByType.filterAll(),(null==e?void 0:e.length)&&this.eventsByCameraId.filterAll(),(null==n?void 0:n.length)&&this.eventsByFoundObjects.filterAll(),(null==a?void 0:a.size)&&this.eventsByColor.filterAll(),this.eventsByStart.filterAll(),void 0!==s&&(null==n?void 0:n.length)&&(o=o.filter((e=>e.detectedObjects.some((e=>e.Probability>=s&&n.includes(e.Type)))))),o}getOverlappedEvents({cameraId:e,from:t,to:r}){this.eventsByCameraId.filter(e),this.eventsByStart.filter([-1/0,+r+5e-4]),this.eventsByEnd.filter([+t,1/0]);const n=this.eventsByStart.top(1/0);return this.eventsByCameraId.filterAll(),this.eventsByStart.filterAll(),this.eventsByStart.filterAll(),n}getLastNonAnalyticEventBefore({cameraId:e,date:t}){this.eventsByCameraId.filter(e),this.eventsByStart.filter([-1/0,+t]),this.eventsByType.filter((e=>"Analytic"!==e));const r=this.eventsByStart.top(1);return this.eventsByType.filterAll(),this.eventsByStart.filterAll(),this.eventsByCameraId.filterAll(),r[0]}getLastObjectBefore({cameraId:e,date:t,objectFilters:r}){this.eventsByCameraId.filter(e),this.eventsByStart.filter([-1/0,+t]),this.eventsByType.filter((e=>"Analytic"===e));const{cars:n,people:i,misc:a}=r;i&&n&&a||this.eventsByFoundObjects.filter((e=>a?i||n?!(!i||!n)||(i?"Car"!==e:"Person"!==e):"Person"!==e&&"Car"!==e:i&&n?"Person"===e||"Car"===e:i?"Person"===e:"Car"===e));const s=this.eventsByStart.top(1);return this.eventsByFoundObjects.filterAll(),this.eventsByType.filterAll(),this.eventsByStart.filterAll(),this.eventsByCameraId.filterAll(),s[0]}getFirstNonAnalyticEventAfter({cameraId:e,date:t}){this.eventsByCameraId.filter(e),this.eventsByStart.filter([+t+5e-4,1/0]),this.eventsByType.filter((e=>"Analytic"!==e));const r=this.eventsByEnd.bottom(1);return this.eventsByType.filterAll(),this.eventsByCameraId.filterAll(),this.eventsByStart.filterAll(),r[0]}getFirstObjectAfter({cameraId:e,date:t,objectFilters:r}){this.eventsByCameraId.filter(e),this.eventsByStart.filter([+t+5e-4,1/0]),this.eventsByType.filter((e=>"Analytic"===e));const{cars:n,people:i,misc:a}=r;i&&n&&a||this.eventsByFoundObjects.filter((e=>a?i||n?!(!i||!n)||(i?"Car"!==e:"Person"!==e):"Person"!==e&&"Car"!==e:i&&n?"Person"===e||"Car"===e:i?"Person"===e:"Car"===e));const s=this.eventsByStart.bottom(1);return this.eventsByFoundObjects.filterAll(),this.eventsByType.filterAll(),this.eventsByStart.filterAll(),this.eventsByCameraId.filterAll(),s[0]}afterInit(){this.api.events.pipe(D((({hub:e,event:t})=>"cameras"===e&&"OnCameraMotionEvent"===t))).subscribe(this.processNewEvents)}dispose(){super.dispose(),this.data.remove(is),this.updates++}}class ss extends ee{constructor(){super(),Object.defineProperty(this,"thumbnails",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"thumbnailsByCameraId",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"thumbnailsByDate",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"pendingRequests",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"pendingRequestsByEnd",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"pendingRequestsByStart",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"pendingRequestsByCameraId",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"pendingRequestsByCount",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"toThumbnail",{enumerable:!0,configurable:!0,writable:!0,value:e=>({realtimestamp:t,url:r,width:n,height:i})=>({cameraId:e,url:r,width:n,height:i,timestamp:new Date(t)})}),this.thumbnails=G(),this.thumbnailsByCameraId=this.thumbnails.dimension((e=>e.cameraId)),this.thumbnailsByDate=this.thumbnails.dimension((e=>+e.timestamp)),this.pendingRequests=G(),this.pendingRequestsByStart=this.pendingRequests.dimension((e=>+e.from)),this.pendingRequestsByEnd=this.pendingRequests.dimension((e=>+e.to)),this.pendingRequestsByCameraId=this.pendingRequests.dimension((e=>e.cameraId)),this.pendingRequestsByCount=this.pendingRequests.dimension((e=>e.count))}fetchThumbnails(e,t,r,n){this.pendingRequestsByCameraId.filter(e),this.pendingRequestsByStart.filter(t),this.pendingRequestsByEnd.filter(r),this.pendingRequestsByCount.filter(n);const i=this.pendingRequests.allFiltered()[0];if(this.pendingRequestsByCameraId.filterAll(),this.pendingRequestsByStart.filterAll(),this.pendingRequestsByEnd.filterAll(),this.pendingRequestsByCount.filterAll(),i)return i.request;const a=this.api.thumbnails.GetThumbnailsInfo({cameraId:e,from:t,to:r,count:n}).pipe(x((t=>t.resultItems.filter((e=>e.url)).map(this.toThumbnail(e)))),q());return this.pendingRequests.add([{cameraId:e,from:t,to:r,count:n,request:a}]),a.subscribe((e=>{this.thumbnails.add(e),this.pendingRequests.remove((e=>e.request===a))})),a}getIntervalState(e,t,r){const n=this.getThumbnail({cameraId:e,from:t,to:r});if(n)return{state:"fullfilled",data:n};this.pendingRequestsByCameraId.filter(e),this.pendingRequestsByStart.filter([-1/0,+r+5e-4]),this.pendingRequestsByEnd.filter([t,1/0]);let i=this.pendingRequests.allFiltered();return this.pendingRequestsByCameraId.filterAll(),this.pendingRequestsByStart.filterAll(),this.pendingRequestsByEnd.filterAll(),i=i.filter((e=>1===e.count?+e.from==+t&&+e.to==+r:Math.abs((+e.to-+e.from)/e.count-(+r-+t))<=1)),i.length?{state:"pending",request:i[0].request}:null}fetchThumbnail(e,t,r){const n=this.getIntervalState(e,t,r);if(null!==n){if("fullfilled"===n.state)return w(n.data);if("pending"===n.state)return n.request.pipe(x((()=>this.getThumbnail({cameraId:e,from:t,to:r}))))}const i=this.api.thumbnails.GetThumbnailInfo({cameraId:e,from:t,to:r}).pipe(x((e=>e.resultItems)),q());return i.subscribe((t=>{const r=t.filter((e=>e.url)).map(this.toThumbnail(e));this.thumbnails.add(r),this.pendingRequests.remove((e=>e.request===i))})),this.pendingRequests.add([{cameraId:e,from:t,to:r,count:1,request:i}]),i.pipe(x((()=>this.getThumbnail({cameraId:e,from:t,to:r}))))}getThumbnail({cameraId:e,from:t,to:r}){this.thumbnailsByCameraId.filter(e),this.thumbnailsByDate.filter([+t,+r+(+t==+r?5e-4:0)]);const n=this.thumbnails.allFiltered()[0];return this.thumbnailsByDate.filterAll(),this.thumbnailsByCameraId.filterAll(),n}getThumbnails({cameraId:e,from:t,to:r}){this.thumbnailsByCameraId.filter(e),this.thumbnailsByDate.filter([+t,+r+5e-4]);const n=this.thumbnails.allFiltered();return this.thumbnailsByDate.filterAll(),this.thumbnailsByCameraId.filterAll(),n}}class os{constructor(e){Object.defineProperty(this,"notifier",{enumerable:!0,configurable:!0,writable:!0,value:e})}error(e){this.notifier.error(e)}success(e,t){this.notifier.success(e,t)}warn(e){this.notifier.warn(e)}}const ls=new Map;class us{constructor(t){Object.defineProperty(this,"name",{enumerable:!0,configurable:!0,writable:!0,value:t}),Object.defineProperty(this,"cameras",{enumerable:!0,configurable:!0,writable:!0,value:new se}),Object.defineProperty(this,"archives",{enumerable:!0,configurable:!0,writable:!0,value:new ie(this.cameras)}),Object.defineProperty(this,"events",{enumerable:!0,configurable:!0,writable:!0,value:new as(this.cameras)}),Object.defineProperty(this,"eventSchema",{enumerable:!0,configurable:!0,writable:!0,value:new ce}),Object.defineProperty(this,"thumbnails",{enumerable:!0,configurable:!0,writable:!0,value:new ss}),Object.defineProperty(this,"account",{enumerable:!0,configurable:!0,writable:!0,value:new re}),Object.defineProperty(this,"notification",{enumerable:!0,configurable:!0,writable:!0,value:new os({success:console.log,warn:console.warn,error:console.error})}),Object.defineProperty(this,"auth",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"api",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"disposables",{enumerable:!0,configurable:!0,writable:!0,value:[]}),Object.defineProperty(this,"tokenUpdateReactions",{enumerable:!0,configurable:!0,writable:!0,value:new Set}),Object.defineProperty(this,"dispose",{enumerable:!0,configurable:!0,writable:!0,value:()=>{this.disposables.forEach((e=>{e instanceof P?e.closed||e.unsubscribe():e()})),this.tokenUpdateReactions.forEach((e=>e())),this.tokenUpdateReactions.clear(),this.auth.signOut(),this.cameras.dispose(),this.events.dispose(),this.thumbnails.dispose(),this.eventSchema.dispose(),this.account.dispose(),ls.delete(this.name)}}),Object.defineProperty(this,"onTokenUpdate",{enumerable:!0,configurable:!0,writable:!0,value:t=>{if(!this.auth)throw new Error("app has to be inited first");const r=e((()=>this.auth.token),(e=>t((null==e?void 0:e.json)||null)));return this.tokenUpdateReactions.add(r),()=>{r(),this.tokenUpdateReactions.delete(r)}}}),this.disposables.push(s((()=>!!this.account.user),(()=>{this.cameras.load()})))}init({token:e,tokenStorage:t=new Q,tokenStorageKey:r,apiUrl:n="https://services.3deye.me/reactiveapi",tokenServiceUrl:i="https://admin.3deye.me/webapi/v3/auth/token"},a="default"){if(r||(r=`@3deye-toolkit/${a}/token`),ls.has(a))return console.warn("Can`t init two apps with the same name"),ls.get(a);if(this.auth&&a===this.name)return console.warn("Can`t init already inited app"),this;if(this.auth||"default"===this.name&&"default"!==a)return new us(a).init({token:e,tokenStorage:t,tokenStorageKey:r,apiUrl:n,tokenServiceUrl:i},a);const s=e&&"clientId"in e?e.clientId:"WebApp";return e&&t.setItem(r,JSON.stringify(e)),this.auth=new Y({tokenServiceUrl:i,tokenStorageKey:r,storage:t,clientId:s,deviceInfo:null}),this.api=K.create(W,this.auth,(e=>_(n,{qs:{access_token:e}}))),this.cameras.initWith(this.api),this.archives.initWith(this.api),this.events.initWith(this.api),this.eventSchema.initWith(this.api),this.thumbnails.initWith(this.api),this.account.initWith(this.api),this.account.setAuthStore(this.auth),ls.set(a,this),this}}const cs=new us("default"),ds=$.createContext(null);export{ds as AppContext,cs as app};
|
package/dist/tsdoc-metadata.json
CHANGED
package/package.json
CHANGED
|
@@ -1,20 +1,19 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@3deye-toolkit/core",
|
|
3
|
-
"version": "0.0.1-alpha.
|
|
3
|
+
"version": "0.0.1-alpha.23",
|
|
4
4
|
"module": "dist/core.js",
|
|
5
5
|
"types": "dist/core.d.ts",
|
|
6
6
|
"files": [
|
|
7
7
|
"dist"
|
|
8
8
|
],
|
|
9
9
|
"dependencies": {
|
|
10
|
-
"crossfilter2": "^1.5.
|
|
11
|
-
"http-status-codes": "^
|
|
10
|
+
"crossfilter2": "^1.5.4",
|
|
11
|
+
"http-status-codes": "^2.2.0",
|
|
12
12
|
"jqueryless-signalr": "1.0.0",
|
|
13
|
-
"lodash": "4.17.
|
|
14
|
-
"
|
|
15
|
-
"
|
|
16
|
-
"
|
|
17
|
-
"string-natural-compare": "^2.0.2"
|
|
13
|
+
"lodash": "4.17.21",
|
|
14
|
+
"mobx": "^6.3.13",
|
|
15
|
+
"rxjs": "^7.5.3",
|
|
16
|
+
"string-natural-compare": "^3.0.1"
|
|
18
17
|
},
|
|
19
18
|
"peerDependencies": {
|
|
20
19
|
"react": "^16.8.0 || ^17",
|