From ebdd3d568c4788a1234c7482f4c2397dcc279d6a Mon Sep 17 00:00:00 2001 From: panaaj <38519157+panaaj@users.noreply.github.com> Date: Mon, 20 May 2024 08:49:51 +0930 Subject: [PATCH] chore: docs and formatting --- CHANGELOG.md | 8 + helper/alarms/alarms.ts | 83 +++++-- package.json | 5 +- .../lib/components/build-route.component.ts | 29 ++- src/app/lib/components/dial-text.ts | 5 +- .../dialogs/common/dialogs.component.ts | 72 +++--- .../dialogs/gpx/gpxload/gpxload-dialog.html | 134 ++++++------ .../dialogs/gpx/gpxsave/gpxsave-dialog.html | 130 +++++------ src/app/lib/components/index.ts | 1 + src/app/lib/geoutils.ts | 31 +++ .../components/popover/compass.component.ts | 2 +- src/app/modules/map/mapconfig.ts | 19 ++ src/app/modules/map/ol/index.ts | 3 + .../modules/skresources/lists/chartlist.ts | 38 ++-- .../modules/skresources/resource-dialogs.ts | 206 +++++++++--------- src/assets/help/img/settings_vessels_1.png | Bin 20195 -> 19588 bytes src/assets/help/index.html | 4 + 17 files changed, 440 insertions(+), 330 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b57d7732..bb2793d5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # CHANGELOG: Freeboard +### v2.8.0 + +- **Added**: Option to display laylines when destination is active. (#149) +- **Added**: Support for Signal K server "Features" API. +- **Updated**: Measure function to display both segment and total distance. (#153) +- **Updated**: Clearing an alarm no longer sets the value to `null`, sets alarm state to normal instead. + + ### v2.7.1 - **Added**: Set a default waypoint name when adding a waypoint at vessel position. (#146) diff --git a/helper/alarms/alarms.ts b/helper/alarms/alarms.ts index 464ac47b..cd7a09f0 100644 --- a/helper/alarms/alarms.ts +++ b/helper/alarms/alarms.ts @@ -5,7 +5,8 @@ import { ALARM_STATE, Path, PathValue, - Position + Position, + SKVersion } from '@signalk/server-api'; import { FreeboardHelperApp } from '../index'; @@ -24,6 +25,7 @@ const STANDARD_ALARMS = [ let server: FreeboardHelperApp; let pluginId: string; +const ALARM_API_PATH = '/signalk/v1/api/alarms'; export const initAlarms = (app: FreeboardHelperApp, id: string) => { server = app; @@ -48,12 +50,11 @@ export const initAlarms = (app: FreeboardHelperApp, id: string) => { const initAlarmEndpoints = () => { server.debug(`** Registering Alarm Action API endpoint(s) **`); - server.put( - '/signalk/v2/api/notifications/:alarmType', + + server.post( + `${ALARM_API_PATH}/:alarmType`, (req: Request, res: Response, next: NextFunction) => { - server.debug( - `** PUT /signalk/v2/api/notifications/${req.params.alarmType}` - ); + server.debug(`** POST ${ALARM_API_PATH}/${req.params.alarmType}`); if (!STANDARD_ALARMS.includes(req.params.alarmType)) { next(); return; @@ -82,12 +83,57 @@ const initAlarmEndpoints = () => { } } ); + server.post( + `${ALARM_API_PATH}/:alarmType/silence`, + (req: Request, res: Response) => { + server.debug(`** POST ${req.path}`); + if (!STANDARD_ALARMS.includes(req.params.alarmType)) { + res.status(200).json({ + state: 'COMPLETED', + statusCode: 200, + message: `Unsupported Alarm (${req.params.alarmType}).` + }); + return; + } + try { + const al = server.getSelfPath(`notifications.${req.params.alarmType}`); + if (al && al.value) { + server.debug('Alarm value....'); + if (al.value.method && al.value.method.includes('sound')) { + server.debug('Alarm has sound... silence!!!'); + al.value.method = al.value.method.filter((i) => i !== 'sound'); + const r = handlePutAlarmState( + 'vessels.self', + `notifications.${req.params.alarmType}` as Path, + al.value + ); + res.status(200).json(r); + } else { + server.debug('Alarm has no sound... no action required.'); + res.status(200).json({ + state: 'COMPLETED', + statusCode: 200, + message: `Alarm (${req.params.alarmType}) is already silent.` + }); + } + } else { + throw new Error( + `Alarm (${req.params.alarmType}) has no value or was not found!` + ); + } + } catch (e) { + res.status(400).json({ + state: 'FAILED', + statusCode: 400, + message: (e as Error).message + }); + } + } + ); server.delete( - '/signalk/v2/api/notifications/:alarmType', + `${ALARM_API_PATH}/:alarmType`, (req: Request, res: Response, next: NextFunction) => { - server.debug( - `** DELETE /signalk/v2/api/notifications/${req.params.alarmType}` - ); + server.debug(`** DELETE ${ALARM_API_PATH}/${req.params.alarmType}`); if (!STANDARD_ALARMS.includes(req.params.alarmType)) { next(); return; @@ -96,7 +142,11 @@ const initAlarmEndpoints = () => { const r = handlePutAlarmState( 'vessels.self', `notifications.${req.params.alarmType}` as Path, - null + { + message: '', + method: [], + state: ALARM_STATE.normal + } ); res.status(200).json(r); } catch (e) { @@ -137,16 +187,16 @@ const handlePutAlarmState = ( server.debug(JSON.stringify(alarmType)); let noti: PathValue; if (value) { - const alm = buildAlarmMessage(value.message); + const alm = value.state === ALARM_STATE.normal ? null : buildAlarmData(); noti = { path: `notifications.${alarmType}` as Path, value: { state: value.state ?? null, method: value.method ?? null, - message: alm.message + message: value.message } }; - if (alm.data) { + if (alm && alm.data) { // eslint-disable-next-line @typescript-eslint/no-explicit-any (noti.value as any).data = alm.data; } @@ -171,10 +221,9 @@ const handlePutAlarmState = ( } }; -const buildAlarmMessage = (message: string) => { +const buildAlarmData = () => { const pos: { value: Position } = server.getSelfPath('navigation.position'); return { - message: message, data: { position: pos ? pos.value : null } @@ -186,5 +235,5 @@ const emitNotification = (msg: PathValue) => { const delta = { updates: [{ values: [msg] }] }; - server.handleMessage(pluginId, delta); + server.handleMessage(pluginId, delta, SKVersion.v2); }; diff --git a/package.json b/package.json index 645befc5..ddbe98b9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@signalk/freeboard-sk", - "version": "2.7.1", + "version": "2.8.0", "description": "Openlayers chart plotter implementation for Signal K", "keywords": [ "signalk-webapp", @@ -87,6 +87,7 @@ "proj4": "2.6.2", "protractor": "~7.0.0", "rxjs": "~6.6.3", + "semver": "^7.6.0", "signalk-client-angular": "^2.0.3", "signalk-worker-angular": "^1.1.4", "simplify-ts": "^1.0.2", @@ -97,4 +98,4 @@ "xml2js": "^0.6.2", "zone.js": "~0.14.4" } -} \ No newline at end of file +} diff --git a/src/app/lib/components/build-route.component.ts b/src/app/lib/components/build-route.component.ts index 23b974d9..8af13195 100644 --- a/src/app/lib/components/build-route.component.ts +++ b/src/app/lib/components/build-route.component.ts @@ -108,23 +108,19 @@ import { (cdkDropListDropped)="dropEventHandler($event)" > @for(item of rtepts; track item; let idx = $index) { -
-
- room -
-
- {{ item.name }} -
-
- -
+
+
+ room +
+
+ {{ item.name }}
+
+ +
+
}
@@ -149,6 +145,7 @@ export class BuildRouteComponent { wpts = []; rtepts = []; + // eslint-disable-next-line @typescript-eslint/no-explicit-any @Output() save: EventEmitter = new EventEmitter(); constructor( diff --git a/src/app/lib/components/dial-text.ts b/src/app/lib/components/dial-text.ts index b80c9d79..ee8f40e3 100644 --- a/src/app/lib/components/dial-text.ts +++ b/src/app/lib/components/dial-text.ts @@ -1,7 +1,7 @@ /** Text Dial Component ** ************************/ -import { Component, Input } from '@angular/core'; +import { ChangeDetectionStrategy, Component, Input } from '@angular/core'; /*********** Text Dial *************** title: "" title text, @@ -10,6 +10,7 @@ units: "" dsisplay units, ***********************************/ @Component({ standalone: true, + changeDetection: ChangeDetectionStrategy.OnPush, selector: 'ap-dial-text', imports: [], template: ` @@ -25,6 +26,4 @@ export class TextDialComponent { @Input() title: string; @Input() value: string; @Input() units: string; - - //constructor() {} } diff --git a/src/app/lib/components/dialogs/common/dialogs.component.ts b/src/app/lib/components/dialogs/common/dialogs.component.ts index 4b63f2cc..48fedd40 100644 --- a/src/app/lib/components/dialogs/common/dialogs.component.ts +++ b/src/app/lib/components/dialogs/common/dialogs.component.ts @@ -477,48 +477,48 @@ export class MessageBarComponent {
@for(c of data.content; track c; let i = $index) { - -
-

{{ c.title }}

+ +
+

{{ c.title }}

+
+
+
+ @if(i !== 0 && data.content.length > 1) { + + }
-
-
- @if(i !== 0 && data.content.length > 1) { - - } -
-
-
- @if(i !== data.content.length - 1) { - - } -
+
+
+ @if(i !== data.content.length - 1) { + + }
- +
+ }
@for(c of data.content; track c; let i = $index) { - - fiber_manual_record - + + fiber_manual_record + }
diff --git a/src/app/lib/components/dialogs/gpx/gpxload/gpxload-dialog.html b/src/app/lib/components/dialogs/gpx/gpxload/gpxload-dialog.html index 9b713fb9..e10917f5 100644 --- a/src/app/lib/components/dialogs/gpx/gpxload/gpxload-dialog.html +++ b/src/app/lib/components/dialogs/gpx/gpxload/gpxload-dialog.html @@ -86,30 +86,30 @@
@for(w of gpxData.waypoints; track w; let i=$index) { - -
-
-
- place - {{w.name}} -
-
- {{w.description}} -
-
- - -
+ +
+
+
+ place + {{w.name}} +
+
+ {{w.description}} +
+
+ +
- +
+
}
@@ -153,31 +153,31 @@
@for(r of gpxData.routes; track r; let i=$index) { - -
-
-
- directions - {{r.name}} -
-
- {{r.description}}
- {{r.length}} -
-
- - -
+ +
+
+
+ directions + {{r.name}} +
+
+ {{r.description}}
+ {{r.length}} +
+
+ +
- +
+
}
@@ -222,30 +222,30 @@
@for(t of gpxData.tracks; track t; let i=$index) { - -
-
-
- show_chart - {{t.name}} -
-
- {{t.description}} -
-
- - -
+ +
+
+
+ show_chart + {{t.name}} +
+
+ {{t.description}} +
+
+ +
- +
+
}
diff --git a/src/app/lib/components/dialogs/gpx/gpxsave/gpxsave-dialog.html b/src/app/lib/components/dialogs/gpx/gpxsave/gpxsave-dialog.html index 06cbc1c2..7effdc87 100644 --- a/src/app/lib/components/dialogs/gpx/gpxsave/gpxsave-dialog.html +++ b/src/app/lib/components/dialogs/gpx/gpxsave/gpxsave-dialog.html @@ -74,30 +74,30 @@
@for(w of resData.waypoints;track w;let i=$index) { - -
-
-
- place - {{w.name}} -
-
- -
-
- - -
+ +
+
+
+ place + {{w.name}} +
+
+ +
+
+ +
- +
+
}
@@ -141,31 +141,31 @@
@for(r of resData.routes; track r; let i=$index) { - -
-
-
- directions - {{r.name}} -
-
- {{r.description}}
- {{r.length}} -
-
- - -
+ +
+
+
+ directions + {{r.name}} +
+
+ {{r.description}}
+ {{r.length}} +
+
+ +
- +
+
}
@@ -205,28 +205,28 @@
@for(r of resData.tracks; track r; let i=$index) { - -
-
-
- directions_boat - Vessel Trail -
-
-
- - -
+ +
+
+
+ directions_boat + Vessel Trail +
+
+
+ +
- +
+
}
diff --git a/src/app/lib/components/index.ts b/src/app/lib/components/index.ts index f90a31dc..87943a79 100644 --- a/src/app/lib/components/index.ts +++ b/src/app/lib/components/index.ts @@ -6,3 +6,4 @@ export * from './pip.component'; export * from './signalk-details.component'; export * from './wakelock.component'; export * from './build-route.component'; +export * from './measurements.component'; diff --git a/src/app/lib/geoutils.ts b/src/app/lib/geoutils.ts index 0725a80b..f84e1070 100644 --- a/src/app/lib/geoutils.ts +++ b/src/app/lib/geoutils.ts @@ -102,3 +102,34 @@ export class GeoUtils { } } } + +export class Angle { + /** difference between two angles (in degrees) + * @param h: angle 1 (in degrees) + * @param b: angle 2 (in degrees) + * @returns angle (-ive = port) + */ + static difference(h: number, b: number): number { + const d = 360 - b; + const hd = h + d; + const a = Angle.normalise(hd); + return a < 180 ? 0 - a : 360 - a; + } + + /** Add two angles (in degrees) + * @param h: angle 1 (in degrees) + * @param b: angle 2 (in degrees) + * @returns sum angle + */ + static add(h: number, b: number): number { + return Angle.normalise(h + b); + } + + /** Normalises angle to a value between 0 & 360 degrees + * @param a: angle (in degrees) + * @returns value between 0-360 + */ + static normalise(a: number): number { + return a < 0 ? a + 360 : a >= 360 ? a - 360 : a; + } +} diff --git a/src/app/modules/map/components/popover/compass.component.ts b/src/app/modules/map/components/popover/compass.component.ts index de4c0990..c2dc1673 100644 --- a/src/app/modules/map/components/popover/compass.component.ts +++ b/src/app/modules/map/components/popover/compass.component.ts @@ -33,7 +33,7 @@ class SvgDialBase { this._init(); } - //** initaise: calculate scaling ** + //** initialise: calculate scaling ** private _init() { const a: number = this.minAngle > this.maxAngle diff --git a/src/app/modules/map/mapconfig.ts b/src/app/modules/map/mapconfig.ts index 38096dba..41163668 100644 --- a/src/app/modules/map/mapconfig.ts +++ b/src/app/modules/map/mapconfig.ts @@ -412,3 +412,22 @@ export const meteoStyles = { }) }) }; + +export const laylineStyles = { + port: new Style({ + fill: new Fill({ color: 'green' }), + stroke: new Stroke({ + color: 'green', + width: 1, + lineDash: [5, 5] + }) + }), + starboard: new Style({ + fill: new Fill({ color: 'red' }), + stroke: new Stroke({ + color: 'red', + width: 1, + lineDash: [5, 5] + }) + }) +}; diff --git a/src/app/modules/map/ol/index.ts b/src/app/modules/map/ol/index.ts index 5d2bd05c..76df0a59 100644 --- a/src/app/modules/map/ol/index.ts +++ b/src/app/modules/map/ol/index.ts @@ -45,6 +45,7 @@ import { CPAAlarmComponent } from './lib/alarms/layer-cpa-alarm.component'; import { ArrivalCircleComponent } from './lib/navigation/layer-arrival-circle.component'; import { XTEPathComponent } from './lib/navigation/layer-xte-path.component'; import { BearingLineComponent } from './lib/navigation/layer-bearing-line.component'; +import { LaylineComponent } from './lib/navigation/layer-layline.component'; import { DirectionOfTravelComponent } from './lib/navigation/layer-dot.component'; import { VesselComponent } from './lib/vessel/layer-vessel.component'; import { VesselTrailComponent } from './lib/vessel/layer-vessel-trail.component'; @@ -95,6 +96,7 @@ export { CPAAlarmComponent } from './lib/alarms/layer-cpa-alarm.component'; export { ArrivalCircleComponent } from './lib/navigation/layer-arrival-circle.component'; export { XTEPathComponent } from './lib/navigation/layer-xte-path.component'; export { BearingLineComponent } from './lib/navigation/layer-bearing-line.component'; +export { LaylineComponent } from './lib/navigation/layer-layline.component'; export { DirectionOfTravelComponent } from './lib/navigation/layer-dot.component'; export { VesselComponent } from './lib/vessel/layer-vessel.component'; export { VesselTrailComponent } from './lib/vessel/layer-vessel-trail.component'; @@ -130,6 +132,7 @@ const declarations = [ ArrivalCircleComponent, XTEPathComponent, BearingLineComponent, + LaylineComponent, VesselComponent, VesselTrailComponent, SKVesselsLayerComponent, diff --git a/src/app/modules/skresources/lists/chartlist.ts b/src/app/modules/skresources/lists/chartlist.ts index 056a50ff..9421e1fa 100644 --- a/src/app/modules/skresources/lists/chartlist.ts +++ b/src/app/modules/skresources/lists/chartlist.ts @@ -166,29 +166,29 @@ export class ChartListComponent { (cdkDropListDropped)="drop($event)" > @for(ch of chartList; track ch; let i = $index) { - - -
+ + +
+
+
+ {{ isLocal(ch[1].url) }} +
-
- {{ isLocal(ch[1].url) }} -
-
- {{ ch[1].name }} -
-
- drag_indicator -
+ > + {{ ch[1].name }} +
+
+ drag_indicator
- - +
+
+
}
diff --git a/src/app/modules/skresources/resource-dialogs.ts b/src/app/modules/skresources/resource-dialogs.ts index 5bcbc0b8..d00ef812 100644 --- a/src/app/modules/skresources/resource-dialogs.ts +++ b/src/app/modules/skresources/resource-dialogs.ts @@ -82,11 +82,9 @@ import { SKResourceSet } from './sets/resource-set'; Signal K Type @for(i of resourceTypeList; track i) { - - {{ i.name }} - + + {{ i.name }} + } @@ -777,60 +775,60 @@ export class AircraftPropertiesModal { (cdkDropListDropped)="drop($event)" > @for(pt of points; track pt; let i = $index) { - - -
- -
-
- @if(selIndex === i) { - flag - } + + +
+ +
+
+ @if(selIndex === i) { + flag + } +
+
+
+
Lat:
+
-
-
-
Lat:
-
-
-
-
Lon:
-
-
- @if(i < pointNames.length) { -
-
Name:
-
-
- } +
+
Lon:
+
-
- @if(data.type === 'route') { - drag_indicator - } + @if(i < pointNames.length) { +
+
Name:
+
+ }
- - +
+ @if(data.type === 'route') { + drag_indicator + } +
+
+ + }
@@ -1198,38 +1196,38 @@ export class ChartInfoDialog { @for(trk of trackList; track trk; let idx = $index) { - - -
-
- -
-
-
- {{ trk[1].feature?.properties?.name }} -
-
- {{ trk[1].feature?.properties?.description }} -
+ + +
+
+ +
+
+
+ {{ trk[1].feature?.properties?.name }}
-
- +
+ {{ trk[1].feature?.properties?.description }}
- - +
+ +
+
+ + }
`, @@ -1414,29 +1412,29 @@ export class TracksModal implements OnInit { @for(res of resList; track res; let idx = $index) { - - -
-
- + + +
+
+ +
+
+
+ {{ res.name }}
-
-
- {{ res.name }} -
-
- {{ res.description }} -
+
+ {{ res.description }}
-
- - +
+
+ + }
`, diff --git a/src/assets/help/img/settings_vessels_1.png b/src/assets/help/img/settings_vessels_1.png index 5158a0f71a17e2e9e51eeae365065de521fe19f2..a1b11e17f8c064ba0f99925335e3d93665e2507c 100644 GIT binary patch literal 19588 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 literal 20195 zcmdUX1yq*nzUPO91&DzHf`LhjqDZSC3aE5QH%NDf4GKtufP!p5N+ks8P!yyD36TaV z>F%1}>po}AoxARwb!XA)YGtgnd4ZN>jww(5G4NQX&cBA4YHUW~Lms>(P1T3>I{k~?vk z%Yb^*zRP6izwit=?o2k;Ycg)Oh!6_@G3)$3!bd$XxUqT*8(TToJ`b+y#Iv0H_DR3^ zM0PFcGVQ~Xd(+D$hnDR=QD1JJbrWRdXH1D=)qb54*ZuifmLh=@pRfOT#o z!!BxS>KvNwY)6kC)!zPJ^9Q?P%kzMMPxR*bm#<&n+EeOd{d2CyeJwB}gG=3c^!(g- zXH8YuIgZ=cs>9ERoz>e;a&&b3{N+oUaTEKumwX-(5%jY|jXGV$_qdFI>?Gy2e;aB{ zZqB%~XK-+kw6MHfpJ}W(mfb^1I(zP1*hR}ES~Hs<8fW$ijIz6SX`uC_IUWPHeFA` zgO^`Gz-N4*Dopswl?`fncE>MXd|p*`qi}Uj<+WtgHqsEy*viV(m@6nF^ z>8{Imxpt%5FX1Aj(bg>cpIKTZk7vf(m(y+IVq?2{dp~KP(%3vw$qc-HA2()hcBqzao}aC;n$5+{KckO?WI57s@%?Z;3S!u znc0lBg*|_M;Khp_-_Er;ZT#a+w8C5E(ivF~N`~LH(Hj+#gG)T9-rJ2T ze=zTSmYmE&B{1VB9aU5$WZ!NZD(rlG*bGCMf}|N85%)Yj3e=bR7f<0WNPRjbnVDlfXP@y~ZSbKt(X z?$kZZwH+o_#I2XSeNqOEN%FReewfUt&*vY}?BBn?<%4PE>zfg$SXp&zUtJDu8~^=1 z=8bY@lAL2GyV}I$TuHCRd-sDG$ zhVK{c)3!}gPd1WMT3|=Y^u1NdD(&oy!uEM@Gbl4R)?SGTwY0a7$KCIwzu=7zC9Tb6 z6-g&6uwfX#1ss>Ku(JBgX?AEQCI-9ZVnal5@E7h*7uh5M4h{~F+NovR3l@`hW{+r4 zil$S4j@m819ee1B5or9)x%OXJm;P0CV^?hbXqMIK?S|`ms(#-m?A2~&zrcKY4^bYQ z+3A%>?D)QX`LcK4zV49`Z?8&uay^Wc2y@l(z^~>Ty|7qly!!O#CGfM)mlGdlAD6v+ zA%f!4y{p8F9!Ycv=w`M0NE1)!U(uBw{YC%%ouEIz^Qjb!ziPh?yZ5@DRkQ!!uMm;^ zybmvxl`_P?|NS2cHZ}d7xwb5op&TcHUDpuxsz$&vT=#EU}~MzZ;YHCo87B^UIZR zqmqrkRnR*Z%%Zp(FR0`wQtiL+jDb&7N@~}&X9rJPGvM-*f3EUtXs9Bq(`{I)zrTOW zB{{iL5yx<8${lmh@Df`ek z`PWybMMOn+Q&WF@xNQ$=@VO8BX=tWarfc>vGTzEEYxnf>VrlI66%G0y$;C8k?O=9sFH+@s$Uzw`pIOi~-*^*^WRs4d-dST>!%>r6?NxtLs zbqR@{FZ(q%u|IxzjnNVNbE~$F&fxbLa-sDV>#*f?>w#OP&loBvx=R-4TFq&BZBFTw zJ?rcG_<*FVt9!<%;goWQ;YZXyhn2}PS|K<7ZQHhyZiI6^!Dvo5Dr#`Lueo3Xbl;qG zoNu=eVr`uGu;IfC8N$zb*CqVuFF#??yFuXl@s_Jx>mup1)WmgLy~!Rqa=s5#Q|DD zmy5WnPIJ26MLxdi7UPuep&@Yxhl@h1GqPdJ{Kh|6bM42!J)jcYTFm6j{|SY4aiPc8 zvB!rSlUPz&=_M9;qPw?O1WU(xeoU_>QXs>q@oCZe>Nqfrbc`qk=`kfk#r@4YNEY_? z+&^X<92|lYT}cK82EZ=Q;^R+tcXwBXpZ99dv#&=Tm-ulfQ+cp0=bU`9f*z2>PC72n zm}|a7D_Wb5T0d}aM;9Q+o7?Y853Fu@ju{btyi*Ikt|3{`H^+Kl>Zgt`Et6j0Ny*o^ z8&L)VH=vE8%PTt}wOu7C3 zgn7X%jnK-(Mp|0hpC%tF8Le-(kfS+$s;{qK$T4b6qO9jGGRRc6w6oKn==#X2oZ)%- z!Im_`??+oQ?g&5FLUB;^Qb1tf6iQbM@p=DxkX_>!s zZlt*cAcKKsQ9aw@9_lB(&^m1jIko@O4?1O(_a8jq$Xm^&`K4~e+vPhVzQdB^I3FK< z_Qk$wXWU^(3H|9yFL`ZKl~_xEUv;#wwq}_z5Dg+*GjXd@DQtXfV%#wu##A@K!@>y zdGD(^f`Wn#Z*B)-S5xoWrRma`AiWXj1kjPkqU&zSl?E0z@q%zazg-@KyR#R*Z#`bG ziZXqIho`yQ$8Bw85!-kBUHrrf+Z)}2;jRqRVa2@aWuwtfPk_k!Y)hTB*%Wt6fR&~B zarg2$Yb&dRKWb3|q@|=Tp?W9C#BE10(C;jCEuHI(8t>}Tq-5k*8k+Cx>$5E>Lm}0R zua%+1AcS$<+0DtxxiV_*9)nBWh~#hnDQGvML?HOOI0>gvSGlRYT{iuIM6ZoA*W;Nbu+545chvoeFeRn+=ojk`2m!F~RTmG&+BDnOM$!%rw zny4=$MX}!z;jiDm^`j&a2%S~sgLir0NrGcs($qX`-Cw1JW>Xa<6h$SpQmYm8xu(V! zXzhYo+iweUxhKh)?lF%k=u1%;iGJGA(GmB7eAA}dEOQO?zH8drNBQi>bboz*0yNpG zd)kY(X|<@dxX0WuH*!$Xg-w@^x)@D zCCY;ri{IA>?od_DUhMG|qKny&t&SSUnLky*LbN%wvU8>_TihNeS7+)RZF$ti_K{Oh_y4T-u22G*Uf^Td`Sx-36Gzjs&NJ2gJ^o0^|#It+|w6n|koBmk&) zjf}W_iKi}_ET!K>PHv4QIMr0N7L2yj;WW&qvs^+YbOYQ3fIZ%QeT~bowzzwiO*x~h zV7^0Vur7{xqD0yFvyM}`MosV3*#9gKowRi`lQy#~o%hXXlrhSgM#W$Fj-wQrRq(G_ z*9efe{WPFz|2hm{*83w{xuf>F7trAID{;==MW~)RIXR`CVz-Aunf--A#JTIvqI1%3 zXTW&vJaFdKLFZ#YS;3cqy@13hOj|N?8rzB2iodS&$@qgSpI-U%f%pIK{~>XeTS`vu zVYPltcJ_h1cJ=SoPgb;)SZTnuEG#WQHaFAO&K{Fd2+fWB?83~I0bDDsq;%cV((>vB zrYR4A)zi$(R$EWzMv7GQ&o>3$_u`Q^G(5fNB_&ev4xboNt?$BdR8P@L;B>}w*+-9Q zR>@gp1Z~)!1RYY7?3a&@zG^*ov`@Gx;QHeCSzYy9=j*`1H!epLkoQ0SBU;8I1Vp>T zbzbcokVkt88*U(B01R@VEyud}OK^`~PTyP5*5eW(6X@G&)`w`=Rlk0Zxt5a0=09b} z)FgYmHR6IPok30H<_foVvN!4l;q#sD>*4bnA53TguGnN%j>;tbO z*^RZ8V`+;5IymAI2ozaVap@eXm{PY7W+kNPej|n>KACSS7a3*P5CE^gx2f7C6tR>sQkOI|Hu7XcW1{#>EjOl-F*=69lO> z%RK(otGmB{8&hR0EXFk=86K^cZ~N z#QZ$>nkF^1^|{gOmADTjz+enKmr;W!k9EJr(#)NqA8#eF(-W05nK5{!_4Rv_8!MuP zJuoHEk-Sq=&kQxCNY0P7TiV+8Ell>rzJ5(-8+Fn0(}6f1%U_$k_H(>Ow|8)Mes4dn zu2X~+Fg;mzsHd;*>S#-5*m>iS$y|(V-CGrIlt=v?1ZiMtozd9TO2(`VvJ#H5myR4>WTt8BrI`PtLhC6raVz*%x?A^Qfz(=t9jnHhK z(499z&Gm-b!Os57PPq=mjvjRX7+X8?P(G2Fn?q0_f_VI6z;HL4 zfx~s4eraqB{`E^6w~i|kQ#dweW@2rXn?|M@QC$jHeehjGz*6_G1S#xkpa(McEp(_h zSUAM`0$0V>m6nqeQCIJvn7t~(ykGV)1l?OQGP|+pVkM&li@!+wq^B#fhOV+cWtLC6 z*!E-wZ1ffi?=Bje{#5rT0fVoAb%S%vkM671PV4&h>&oTJ_oVH*KW%2E@uIHdh{tdB z*0|;?ecUec@BpDZHE+)Q_U#+dW3%VFe|?oI5Awr2kT4OHTGvFXQtDFfoMvY~aq^^x z^}sh;jjLC$g5Oxrjod~h7q+rG3*lCD0zekM2x4lL#1=|yYGT45gJEbJlH|PrU+Are ziVCjs96R<%hg;wfx(+ALN!|adwHr<>lp1M1AP| z{rrlb>^XT|QqllhwIN00kh}Xj%MV4AtZz|5H7P}F;#f`4A#z4M<0B#>IFlg5c}GPZ zx_$dLQKC@DbOgNKzdr{EWPlYL8y{~y*2bele+iqn{Oi|O2??H%pz$V?hpg0#I>|Fk zY>?SpR%e?i-6z}K*H?+b-M_yKeG7Feo)8r^oojSp=HUcLDR;@^l{yh+kQC_1gyC^xdFS(4$kezic1NpS}fo zQVeRub0K#@$h@lA79W+k=%Emxc;TXt((K-fpx~?J+Gycppuy$m=R=g0;CaD7ojAfe z*GWNvA7T|kawyFx-6P3=`NoZ%5XcMORh*AvohsAMYE4sqi(R6frsRpb2XTcUb6L5@ zM-_X!yDgLR4u@J~=1UJ=Qx=Jx%C+d;kgV|b>}wOrNPaPlxw&nYNH3K*076AoNy&q; z_B`vUUNKw`Ga7>d&B|3dIz=8=d-NzbN>Q1^$X(CtSCeM!sUVzr-u)X-J^WX&>hzV$ zPz^URPFjKjE`rWAUnF zne}xzj~6tm?crn~?o2;;t=p==Y4#ViqTYH*p}ygiqSxqT`3t|iW=5K)73^<*w)y8c zZm?)lv$w=Q?L%gsD@T4~=-wyI)C*%b9DRkkK6>;-^q)Uo|NXcB(?6u5qo(+EO1+=H zQHRWZBhs-yOr?GE=?B{>*p{vx!R7j{{<-*nl@s=_6zBgxf5+aG+e7##shXFs&Jk$7 zH~rn|3@|i$4Pv^o?td}MYIRr9L^WtO>Fw*2M$J)a$_+PUU{&zpc zLiUOT>as8Y)K(zI!rr-u4>vKoEogxZIG)S3RwFnGXtwhgS8(f(5*!6KUtASZ)T^Ox zr?rmuH46~j(I;ZJ^2*A}R!T~Jm@c7hk$!%6Jv_*PXSrkevP2;M7BWn+&_)?qS>io#(V(OSqIB2i*^gTZt$_kf zp#n_)P%$Ti=qj{}p1u-eQwig-8WKsOd@_yuVxhhW*!pVyt4YZ<8J?gYRK=t}Vl#Mp9BToZI}? zl`Hp!7eAP`PR!08KX&Z%sR%xMc66M-Q2F_1YK8IsNiZaxOl7iD%*?-D+IJk`;PB5f;Or-xFIb*T@`$>=qSvfh~k!eC=DnA*ui;k`$##c~$ zb!m1H*ElG;RXAGvpILx6g$uuS*p2)onk?$oN2AQCZ+zo0FDdSVNqzkIu^~aa=k>u* z2s~G_6Q?;%TR-#>#TNc+!&{a8K$7p&@_x7Fyifbl1Iu^?GP3tUo&fxCgH(~5>)NER zyPu!mB?u^Zj1vL^FX5xmF;Su^yiv;w0XJ!DZ*R^rKXf6&r)Z^*18sdb9UVbp0a``f z!49874yhR)72!wi!?%EUwqkKuTh8l06IH>xP?KjU%GT?2q-UtNCi^MffpD7~FS4|`bM z^D|mk5}OA4`{`zHJU??UP9k&)Br5=q0vXP}!|^24`;D*Q0Ps&&oqMB{b|2fgXJq6C ziUuw8V2Bm~Z?Nb=SvS&OFv-?c;bzKE6)VqK=na$P_o?NGK9Fpz&dCYQgoXr)N;;<{dPcC zw_)qHZP6%)$Vb50)Fnjil5FQwf`XAKP*6o+e;+w@%5!aXIWQtZg5abe-ld;Z6%`dB z;uto)V*vEyY}rmp*$+u!)0QoCqxhFqt7#U&n*zUm?E{+kO_EQx0vqzMmd>*?g-)@f z7)p%81tlI^G%gGLyX9I>Xk7lctc%d8s2`VvatK{K7lUdF`2 zS)8etq`hcyn1YTAyeJqDk!V3MP4P4Y4kf|{a3W>om;k+}h=2H0L|N&FZHJV{9R z4Yh+eX}Jt{5#+=yi?A8(>@G-zupVJ%eu{-J3+Eqw33!i#kO3fRn{?#UVo~VaOKCLf zgI&cT;51{AEw7B;cEhZ^zKuvY;31`qg5o|4QwfNm&0y~x1)qe?M)(Evl2x8X5; zM2p5|D{~Bh<`60f_Ya}p#!ABPtDYBR{X+#8i`&M=y<4f`J>}m4gPVqltc0it>+UZQj##QL(=-g?^IE|Q6+=rW}lw=#X1m)bMre3r@<7ybT z;2>etsgS8UY-4Ln7@n*eg)i2Zi`I4UUjEqzS;}Q^MuG6u)Kn|eEdHyaqL3-Cn3=tk zo&y~U3=J(q`}9r+2%x5;dzzQWN0?FAYS4fR+Lr5KcA&%|RAhOI1BhaIyoe*TmIwo2 z3%i!gqJZ}44%JT06}5cNa&}#FQoNq?!x$l_wrox$cnDz%PTqSs%1GUqkDNo5L#0r8 zHyRQT&jZSg@FmEJCm|y&EI7ola&r1(Pm^^G4wgUX)Im~=ZGH`E5;X%ubww}>Lj|{K zi-^9ye%ygOi>rp=o}O~-(74RklNtQG*G8_356sT*X32O9A+Gklfg~ozC}`DA9P5>^ zfc}b!0jutUAAX#TjpA;8K0jh1gb9e?5jg^L-n8c)L&mB6fOG*b(Ip@q|89OCKPg&d z-YJOJUcYtg!rV)6X9##K@*aS;c*0{R)cLv50kAP2fG~za4WVBKyZ1^+I7NbEDl8@C z_dQEd!!?+Q7ohysBacV$aLoR}mPG^_a#rVB@3ekkGtZwa-PgH5zVkpaQ5x0NBc(rB z^@$VpZ|hc47wQ&~6vNi4MZ@ZF9ANO^g_wVUQ+pGxX}|E2e`TVCm~LHteIl*Wl4g zmEGu-BG(4`lZ##*Bm^IbSF-`Fg=zug2vMayT$3b#UN_{ZBG0LHGw_(&qXMbvCqs+elM5yUr~059#!bJ2RdYt!%4 zpMWo20{Ht8umLFcD0%^8GYl|?a~qrw0rY*sctlM;2dvE0VA7oa2qH)rI_g>HITK)1 z9^0V?z2Twyc&ZB#)d$j;+1d3004QTvk=pD*Mojodu@5V4AA6xKkXUKyVT0h z7zM<|#VgKxguqJJeej@nXy|?b(4(B3)G)*$`Z_fCm;oWe1c=Au^Dp)WqTbVWj{>{L zLh>LO1fhK6=^`P#seNFF0>^9fThsfXDaIIq$hsnT_dk9Kb|VpHxf#xNgqJrQcGaH! z`^hh%!$E~3;xDgW9VS8>8tY4n*aQzyRv_X)!##oKk37t0bU=scYHn=E!)UMQ(&@V8 zyOH%Xn;9-#9s^)tEOoptCPwsLU>-o-YA}?W*pcji529Rdt<3U=q*CSJ&OG^hn-2>J zFqoTwIt0%4Ny~kID2q@EQmAYHpdJculrBTDhhqb3fRc)|%1M6y7q|@k7yV7% zK|y;#@SX+Mudg-34)I?`peexg_{oz!-QAZB4HKkkfJo57FCvy8t+3lpoPX}8PF18p zg!5RA2N58G#-D35X!WIMHxe0&g9vkG3uT&5YyRqCW4K@Wb|))|obuq|Q>T6hv?ASb z8>S$7d+*BPbQ_jf{$hVb=-cGf)Lq%xH2w2v5e`%3CmrF!6K)Sw&xNHWy4DBx@5A9E zdW_-=y8B+T${-(beYQqaiy}8dV&JvW1PMVgSWb%W6KAE7NaS8gCNf?C643F3!to|D zZ6uLOo3Mn-P!%_;<|kKbr>R=2V0}=Mk+Vlm!$x@Xqf!Xcd6eJ^w$10yp9xY2HI?CY zFJWOP*hK5~wdlN2wfC02v){YRDtTiiYK_mAw9qMV6C#}hxbqQ zTXuz+0A3fGzifz`1fH#nmpp_F8Wf$l4oz|jIs%|YaGMuu8>T6-qRysje%yem_Tip@ zEbt!jAsxEdHyAp=+bH4YxcfiN7nhdmupo#u0G6(5PW0?%K8M5@>Lu zbj%hD&WD&uLTb;~M`%R!)q?9QB*l&Z3&Mt_)B9V-P_@e~10_a~F#xa}92s=|2ofKd z2W0AO;l;`^0Jf)Vz`N3z>SinX&^33I4uZHWaqwHqld76IqESXjlOZR>~h?!m-0; zu`l!m((Fko^k+2xEI*H`l&t6}UQ=No6UwwRo??CF*c z9w*a;$`czK8>He&BsX&!kK^RW3A}V>SUt)u)Zx_&?4PZ2bt;jByz3_UFEShd2_h2x z=}?cxzYC(^-r0T;DQd4Buod^oxIcRK&j5-*Mp*5iv0_ki|EV?2rQNEQ( z&aCkKF`-l*HK;{LU%iJL?5&Cat7DyoE5lG65tG0FW;>4=@qGTTQZ`p$mcYc$NAG}X zR~qettP|_)^jKB%#Bd0OINw1|)Pp}i8b7Cj(*lUb#4Wu*o*KbA35Fh@pP9z{k$5~N zBvjNkl)pQ#eau1?U5ki5amSg0aZD#PME5BW)+IlG{wGG^6{2vrxh;>vz?FAU*{6pr z)gKSa?9cN)a-XZMCQv52IFIujD*#LkG+ZceU`Qf>Pta6LAyg6QM_BltSIkCwZnIuU zsd3<^$ehF!;%@x>{V(GT09<>MmW(IxaV@)w$&wUPz5yg^J@h8Rou~*PvH-#-d3eGQ zkN7n<=62IHtJ&lruZ<^!xUT;GQUKS&ernXXiQ#oVigN2m;NnmMevQ zGt8?9&7!wgclYkygu4s#mk1;R{iK7&pdmEpJDx)$u^Im11As>I1BC*Bg^V480@*t- zKzL(Bg+!iZ^XAP}5!}AGp$$?}QpMPz7oBEK!BNjJ?_^X|Y#JU)#xR-7FZmO0x0{>b zeslYGR6$m+K2bt*|Qhj zRxaA*wL46=V^RrylHZ~Bxo8D2`;Rw7*cU-^BwBP3JZw7uR`-1~@K*GzSH#IA;NLI- z=L_fyh$QTxr#HUAfLPBY#JRduEnxs1LSVybj}_aOH3%aYE)B7OA7QY1ApL$a$_&7e zK&erJIDu$nKM;S_OTMP(b3}w15bFeRPeX&;k9TSkNCII=FtM_FV+iXDob8#O6Eg<9 z56$v6)CzRQrbbEF3!Q{NO$-X8HdJ?7J%evAq7hgj!Rz)94ZVhT2~7sWzXt&$7}0>H zA90WeG7lC8Ue^bBho_l_p8Or87Uz_V8XS3`*XknV4vwjnsoYGQBtZ{^6YGJg#95sQ zoI#lU^@ZD|3j8<@jTMQqG>C$Lun&|!+`SU?Uz8MBpxLo)=w2c1NyoYeJiLn`%#$&h7tGV&il zxB!*}Hqi)0)P92dC(lI3VKd-(%1*%h7?Zw=;L>@FN;i~bjQ4(MQ|a&D!;Rg-{_Np@ zPl1rUr5}O(0?7C{CCMdPeGv?LV~+IDc~K|i3M7G80DlzU_Ba9ZZCGFS9LEqM)qqq2 z5&0w*(Z#|5odO!vF-+4xvJj-dLkG0caRAq)X+bW(<9&<(AH~Dat|#e){xjYO@Iua|YyOy8e%FhmP(MkO}NYVC}8jw`(IT@q*9(872(p ziR{`wuT^4bJcdzlVM35E8PF6|D6W4*m_DMSp+04s8vIyCHgglSwpdD7h<|+dkTZDKC z-865=rYw%gn88RoivtP>MF58sBQ?`&Gsyb<`SY*fpWaa_nMStN!_wG305IBEU8w75 za5r$7gRisQSP=9Bu%dTOR7_zc7%2mvoh}|#lmVNHYb+sGrWI!fbbT5p_JkDc4}&>A|*b!0fw7*CMyJf zO~?p9dt)^7Nh^H=1N8MqAZ0{-h0XJ8V8A{(57aBz&%>k4wy598u>=JpO9p~4njD50 z<}DA3FEUx#jqORh5UPZ9v4d!$_1hbF ztcVF$!j2@)T|k8-&J|?k@?jvk8~g4{=uxt2-mjekZ`wmcBdVly05;7l#T4}$VQ1rR zMD5$OKWaf`>T?Txk-O+hAqMt~gYi*YckJjvdF)e8AqyTA9_O016H@91gk;)9bsp{JCxWw`|~?QA;JLwX>5|!y($u0w_tkx z&xh?+hRc-G^Ni0sY8>9{Sk3@rr2Cp9T1WD5(lB-hsdRuDa==Ph*pW9u2}nzX5~n=Z z*5-@e;{+{w-)O2S)*x}*4q$;07jXE;(8PK8Z5H94l7IqEpp78qNkX-9#Bn3yYMxJ@ zYQr9KSzn!}v=y5Cyr&H-l~OOtWonzWv~=jGF-n>vZkWvT*)x5}<$6LEgq6*S_}SeH zrY$5ePt71U2Å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 diff --git a/src/assets/help/index.html b/src/assets/help/index.html index 56a77e28..9beac7a2 100644 --- a/src/assets/help/index.html +++ b/src/assets/help/index.html @@ -1892,6 +1892,10 @@

settings Settings

Display Wind Vectors: Select to display wind vectors for the vessel on the map. +
  • + Display Laylines: Select to display laylines when + navigating to a destination. +
  • Heading Line Length: Select length of heading line displayed on the map.