@serve.zone/dcrouter 16.2.1 → 16.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/deno.json +1 -1
  2. package/dist_serve/bundle.js +1190 -1100
  3. package/dist_ts/00_commitinfo_data.js +1 -1
  4. package/dist_ts/config/helpers.http-redirects.d.ts +1 -1
  5. package/dist_ts/config/helpers.http-redirects.js +4 -3
  6. package/dist_ts_interfaces/data/route-management.d.ts +2 -0
  7. package/dist_ts_interfaces/data/route-management.js +6 -1
  8. package/dist_ts_web/00_commitinfo_data.js +1 -1
  9. package/dist_ts_web/elements/access/ops-view-apitokens.js +3 -3
  10. package/dist_ts_web/elements/access/ops-view-gatewayclients.js +3 -3
  11. package/dist_ts_web/elements/network/ops-view-network-activity.js +6 -6
  12. package/dist_ts_web/elements/network/ops-view-redirects.d.ts +3 -0
  13. package/dist_ts_web/elements/network/ops-view-redirects.js +38 -21
  14. package/dist_ts_web/elements/network/ops-view-remoteingress.js +3 -3
  15. package/dist_ts_web/elements/network/ops-view-routes.d.ts +8 -7
  16. package/dist_ts_web/elements/network/ops-view-routes.js +331 -161
  17. package/dist_ts_web/elements/network/ops-view-special-forwards.d.ts +4 -1
  18. package/dist_ts_web/elements/network/ops-view-special-forwards.js +118 -168
  19. package/dist_ts_web/elements/network/ops-view-vpn.js +3 -3
  20. package/dist_ts_web/elements/network/route-view-filters.d.ts +6 -0
  21. package/dist_ts_web/elements/network/route-view-filters.js +29 -0
  22. package/dist_ts_web/elements/network/special-forward-dialog.d.ts +11 -0
  23. package/dist_ts_web/elements/network/special-forward-dialog.js +154 -0
  24. package/dist_ts_web/elements/security/ops-view-security-blocked.js +6 -6
  25. package/package.json +2 -2
  26. package/readme.md +1 -1
  27. package/ts/00_commitinfo_data.ts +1 -1
  28. package/ts/config/helpers.http-redirects.ts +6 -3
  29. package/ts_web/00_commitinfo_data.ts +1 -1
  30. package/ts_web/elements/access/ops-view-apitokens.ts +2 -2
  31. package/ts_web/elements/access/ops-view-gatewayclients.ts +2 -2
  32. package/ts_web/elements/network/ops-view-network-activity.ts +5 -5
  33. package/ts_web/elements/network/ops-view-redirects.ts +34 -19
  34. package/ts_web/elements/network/ops-view-remoteingress.ts +2 -2
  35. package/ts_web/elements/network/ops-view-routes.ts +371 -171
  36. package/ts_web/elements/network/ops-view-special-forwards.ts +115 -178
  37. package/ts_web/elements/network/ops-view-vpn.ts +2 -2
  38. package/ts_web/elements/network/route-view-filters.ts +43 -0
  39. package/ts_web/elements/network/special-forward-dialog.ts +174 -0
  40. package/ts_web/elements/security/ops-view-security-blocked.ts +5 -5
  41. package/ts_web/readme.md +4 -4
@@ -0,0 +1,6 @@
1
+ import { type IHttpRedirectInfo, type IMergedRoute } from '../../../dist_ts_interfaces/data/route-management.js';
2
+ export type TRouteOwnerFilter = 'all' | 'operator' | 'gatewayClient' | 'system';
3
+ export type TResolvedRouteOwner = Exclude<TRouteOwnerFilter, 'all'>;
4
+ export declare function getRouteOwner(route: IMergedRoute): TResolvedRouteOwner;
5
+ export declare function routeMatchesOwner(route: IMergedRoute, ownerFilter: TRouteOwnerFilter): boolean;
6
+ export declare function redirectMatchesOwner(redirect: IHttpRedirectInfo, mergedRoutes: IMergedRoute[], ownerFilter: TRouteOwnerFilter): boolean;
@@ -0,0 +1,29 @@
1
+ import { canonicalizeSourceRouteId, } from '../../../dist_ts_interfaces/data/route-management.js';
2
+ export function getRouteOwner(route) {
3
+ if (route.metadata?.ownerType === 'gatewayClient')
4
+ return 'gatewayClient';
5
+ if (route.metadata?.ownerType === 'system')
6
+ return 'system';
7
+ if (route.metadata?.ownerType === 'operator')
8
+ return 'operator';
9
+ return route.origin === 'api' ? 'operator' : 'system';
10
+ }
11
+ export function routeMatchesOwner(route, ownerFilter) {
12
+ return ownerFilter === 'all' || getRouteOwner(route) === ownerFilter;
13
+ }
14
+ function getCanonicalRouteIds(route) {
15
+ const configuredRouteId = route.route.id;
16
+ return [route.id, configuredRouteId]
17
+ .filter((routeId) => Boolean(routeId))
18
+ .map(canonicalizeSourceRouteId);
19
+ }
20
+ export function redirectMatchesOwner(redirect, mergedRoutes, ownerFilter) {
21
+ if (ownerFilter === 'all')
22
+ return true;
23
+ const sourceRouteIds = new Set(redirect.sourceRouteIds.map(canonicalizeSourceRouteId));
24
+ return mergedRoutes.some((route) => {
25
+ return getCanonicalRouteIds(route).some((routeId) => sourceRouteIds.has(routeId))
26
+ && getRouteOwner(route) === ownerFilter;
27
+ });
28
+ }
29
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUtdmlldy1maWx0ZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdHNfd2ViL2VsZW1lbnRzL25ldHdvcmsvcm91dGUtdmlldy1maWx0ZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx5QkFBeUIsR0FHMUIsTUFBTSxzREFBc0QsQ0FBQztBQUs5RCxNQUFNLFVBQVUsYUFBYSxDQUFDLEtBQW1CO0lBQy9DLElBQUksS0FBSyxDQUFDLFFBQVEsRUFBRSxTQUFTLEtBQUssZUFBZTtRQUFFLE9BQU8sZUFBZSxDQUFDO0lBQzFFLElBQUksS0FBSyxDQUFDLFFBQVEsRUFBRSxTQUFTLEtBQUssUUFBUTtRQUFFLE9BQU8sUUFBUSxDQUFDO0lBQzVELElBQUksS0FBSyxDQUFDLFFBQVEsRUFBRSxTQUFTLEtBQUssVUFBVTtRQUFFLE9BQU8sVUFBVSxDQUFDO0lBQ2hFLE9BQU8sS0FBSyxDQUFDLE1BQU0sS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO0FBQ3hELENBQUM7QUFFRCxNQUFNLFVBQVUsaUJBQWlCLENBQy9CLEtBQW1CLEVBQ25CLFdBQThCO0lBRTlCLE9BQU8sV0FBVyxLQUFLLEtBQUssSUFBSSxhQUFhLENBQUMsS0FBSyxDQUFDLEtBQUssV0FBVyxDQUFDO0FBQ3ZFLENBQUM7QUFFRCxTQUFTLG9CQUFvQixDQUFDLEtBQW1CO0lBQy9DLE1BQU0saUJBQWlCLEdBQUksS0FBSyxDQUFDLEtBQXlCLENBQUMsRUFBRSxDQUFDO0lBQzlELE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLGlCQUFpQixDQUFDO1NBQ2pDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sRUFBcUIsRUFBRSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUN4RCxHQUFHLENBQUMseUJBQXlCLENBQUMsQ0FBQztBQUNwQyxDQUFDO0FBRUQsTUFBTSxVQUFVLG9CQUFvQixDQUNsQyxRQUEyQixFQUMzQixZQUE0QixFQUM1QixXQUE4QjtJQUU5QixJQUFJLFdBQVcsS0FBSyxLQUFLO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFFdkMsTUFBTSxjQUFjLEdBQUcsSUFBSSxHQUFHLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMseUJBQXlCLENBQUMsQ0FBQyxDQUFDO0lBQ3ZGLE9BQU8sWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1FBQ2pDLE9BQU8sb0JBQW9CLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2VBQzVFLGFBQWEsQ0FBQyxLQUFLLENBQUMsS0FBSyxXQUFXLENBQUM7SUFDNUMsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDIn0=
@@ -0,0 +1,11 @@
1
+ import * as interfaces from '../../../dist_ts_interfaces/index.js';
2
+ export declare const letsEncryptHttp01ManagedRouteKind: "letsencrypt-http01-forward";
3
+ export declare function getSpecialForwardDomains(route: interfaces.data.IMergedRoute): string[];
4
+ export declare function getSpecialForwardTarget(route: interfaces.data.IMergedRoute): {
5
+ host: string;
6
+ port: number;
7
+ } | undefined;
8
+ export declare function showLetsEncryptHttp01ForwardDialog(options: {
9
+ existing?: interfaces.data.IMergedRoute;
10
+ targets: interfaces.data.INetworkTarget[];
11
+ }): Promise<void>;
@@ -0,0 +1,154 @@
1
+ import { html } from '@design.estate/dees-element';
2
+ import * as appstate from '../../appstate.js';
3
+ import * as interfaces from '../../../dist_ts_interfaces/index.js';
4
+ export const letsEncryptHttp01ManagedRouteKind = 'letsencrypt-http01-forward';
5
+ export function getSpecialForwardDomains(route) {
6
+ const domains = route.route.match.domains;
7
+ if (!domains)
8
+ return [];
9
+ return Array.isArray(domains) ? domains : [domains];
10
+ }
11
+ export function getSpecialForwardTarget(route) {
12
+ const target = route.route.action.targets?.[0];
13
+ if (!target || typeof target.port !== 'number')
14
+ return undefined;
15
+ const host = typeof target.host === 'string'
16
+ ? target.host
17
+ : Array.isArray(target.host)
18
+ ? target.host[0]
19
+ : undefined;
20
+ return host ? { host, port: target.port } : undefined;
21
+ }
22
+ function getDropdownKey(value) {
23
+ return typeof value === 'string'
24
+ ? value
25
+ : value && typeof value === 'object' && 'key' in value
26
+ ? String(value.key)
27
+ : '';
28
+ }
29
+ export async function showLetsEncryptHttp01ForwardDialog(options) {
30
+ const { DeesModal } = await import('@design.estate/dees-catalog');
31
+ const { existing, targets } = options;
32
+ const target = existing ? getSpecialForwardTarget(existing) : undefined;
33
+ const targetOptions = [
34
+ { key: '', option: '(none — inline target)' },
35
+ ...targets.map((networkTarget) => ({
36
+ key: networkTarget.id,
37
+ option: `${networkTarget.name} (${Array.isArray(networkTarget.host) ? networkTarget.host.join(', ') : networkTarget.host}:${networkTarget.port})`,
38
+ })),
39
+ ];
40
+ const selectedTarget = targetOptions.find((option) => {
41
+ return option.key === (existing?.metadata?.networkTargetRef || '');
42
+ }) || targetOptions[0];
43
+ await DeesModal.createAndShow({
44
+ heading: existing
45
+ ? `Edit User HTTP-01 Forward: ${existing.route.name || existing.id}`
46
+ : 'Add User Let\'s Encrypt HTTP-01 Forward',
47
+ content: html `
48
+ <dees-form>
49
+ <dees-input-text
50
+ .key=${'name'}
51
+ .label=${'Name'}
52
+ .value=${existing?.route.name || ''}
53
+ .required=${true}
54
+ ></dees-input-text>
55
+ <dees-input-list
56
+ .key=${'domains'}
57
+ .label=${'Domains'}
58
+ .description=${'Exact public hostnames; HTTP-01 does not support wildcards'}
59
+ .placeholder=${'Add domain...'}
60
+ .value=${existing ? getSpecialForwardDomains(existing) : []}
61
+ ></dees-input-list>
62
+ <dees-input-dropdown
63
+ .key=${'networkTargetRef'}
64
+ .label=${'Network Target'}
65
+ .options=${targetOptions}
66
+ .selectedOption=${selectedTarget}
67
+ ></dees-input-dropdown>
68
+ <dees-input-text
69
+ .key=${'targetHost'}
70
+ .label=${'Inline Target Host'}
71
+ .description=${'Used only when no Network Target is selected'}
72
+ .value=${target?.host || ''}
73
+ ></dees-input-text>
74
+ <dees-input-text
75
+ .key=${'targetPort'}
76
+ .label=${'Inline Target Port'}
77
+ .description=${'Usually port 80 on the ACME responder'}
78
+ .value=${target ? String(target.port) : '80'}
79
+ ></dees-input-text>
80
+ <dees-input-checkbox
81
+ .key=${'remoteIngressEnabled'}
82
+ .label=${'Enable Remote Ingress'}
83
+ .value=${existing?.route.remoteIngress?.enabled === true}
84
+ ></dees-input-checkbox>
85
+ <dees-input-list
86
+ .key=${'remoteIngressEdgeFilter'}
87
+ .label=${'Remote Ingress Edge Filter'}
88
+ .description=${'Optional edge IDs or tags; leave empty for all edges'}
89
+ .placeholder=${'Add edge ID or tag...'}
90
+ .value=${existing?.route.remoteIngress?.edgeFilter || []}
91
+ ></dees-input-list>
92
+ </dees-form>
93
+ `,
94
+ menuOptions: [
95
+ {
96
+ name: 'Cancel',
97
+ iconName: 'lucide:x',
98
+ action: async (modalArg) => modalArg.destroy(),
99
+ },
100
+ {
101
+ name: existing ? 'Save' : 'Create',
102
+ iconName: existing ? 'lucide:check' : 'lucide:plus',
103
+ action: async (modalArg) => {
104
+ const form = modalArg.shadowRoot?.querySelector('.content')?.querySelector('dees-form');
105
+ if (!form)
106
+ return;
107
+ const data = await form.collectFormData();
108
+ const name = String(data.name || '').trim();
109
+ const domains = Array.isArray(data.domains)
110
+ ? data.domains.map((domain) => String(domain).trim()).filter(Boolean)
111
+ : [];
112
+ const networkTargetRef = getDropdownKey(data.networkTargetRef).trim();
113
+ const targetHost = String(data.targetHost || '').trim();
114
+ const targetPort = Number.parseInt(String(data.targetPort || ''), 10);
115
+ if (!name || domains.length === 0) {
116
+ alert('Name and at least one domain are required.');
117
+ return;
118
+ }
119
+ if (!networkTargetRef
120
+ && (!targetHost || !Number.isInteger(targetPort) || targetPort < 1 || targetPort > 65535)) {
121
+ alert('A valid inline target host and port are required.');
122
+ return;
123
+ }
124
+ const edgeFilter = Array.isArray(data.remoteIngressEdgeFilter)
125
+ ? data.remoteIngressEdgeFilter.map((entry) => String(entry).trim()).filter(Boolean)
126
+ : [];
127
+ const config = {
128
+ name,
129
+ domains,
130
+ ...(networkTargetRef
131
+ ? { networkTargetRef }
132
+ : { target: { host: targetHost, port: targetPort } }),
133
+ ...(data.remoteIngressEnabled
134
+ ? {
135
+ remoteIngress: {
136
+ enabled: true,
137
+ ...(edgeFilter.length ? { edgeFilter } : {}),
138
+ },
139
+ }
140
+ : {}),
141
+ };
142
+ if (existing) {
143
+ await appstate.routeManagementStatePart.dispatchAction(appstate.updateLetsEncryptHttp01ForwardAction, { id: existing.id, config, enabled: existing.enabled });
144
+ }
145
+ else {
146
+ await appstate.routeManagementStatePart.dispatchAction(appstate.createLetsEncryptHttp01ForwardAction, { config });
147
+ }
148
+ await modalArg.destroy();
149
+ },
150
+ },
151
+ ],
152
+ });
153
+ }
154
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BlY2lhbC1mb3J3YXJkLWRpYWxvZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3RzX3dlYi9lbGVtZW50cy9uZXR3b3JrL3NwZWNpYWwtZm9yd2FyZC1kaWFsb2cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ25ELE9BQU8sS0FBSyxRQUFRLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxLQUFLLFVBQVUsTUFBTSxzQ0FBc0MsQ0FBQztBQUVuRSxNQUFNLENBQUMsTUFBTSxpQ0FBaUMsR0FBRyw0QkFBcUMsQ0FBQztBQUV2RixNQUFNLFVBQVUsd0JBQXdCLENBQ3RDLEtBQW1DO0lBRW5DLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQztJQUMxQyxJQUFJLENBQUMsT0FBTztRQUFFLE9BQU8sRUFBRSxDQUFDO0lBQ3hCLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ3RELENBQUM7QUFFRCxNQUFNLFVBQVUsdUJBQXVCLENBQ3JDLEtBQW1DO0lBRW5DLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQy9DLElBQUksQ0FBQyxNQUFNLElBQUksT0FBTyxNQUFNLENBQUMsSUFBSSxLQUFLLFFBQVE7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUNqRSxNQUFNLElBQUksR0FBRyxPQUFPLE1BQU0sQ0FBQyxJQUFJLEtBQUssUUFBUTtRQUMxQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUk7UUFDYixDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO1lB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
@@ -293,7 +293,7 @@ let OpsViewSecurityBlocked = (() => {
293
293
  name: 'Enable',
294
294
  iconName: 'lucide:play',
295
295
  type: ['contextmenu'],
296
- actionRelevancyCheckFunc: (actionData) => !actionData.item.enabled,
296
+ actionRelevancyCheckFunc: (entry) => !entry.enabled,
297
297
  actionFunc: async (actionData) => {
298
298
  const rule = actionData.item;
299
299
  await appstate.securityPolicyStatePart.dispatchAction(appstate.updateSecurityBlockRuleAction, {
@@ -306,7 +306,7 @@ let OpsViewSecurityBlocked = (() => {
306
306
  name: 'Disable',
307
307
  iconName: 'lucide:pause',
308
308
  type: ['contextmenu'],
309
- actionRelevancyCheckFunc: (actionData) => actionData.item.enabled,
309
+ actionRelevancyCheckFunc: (entry) => entry.enabled,
310
310
  actionFunc: async (actionData) => {
311
311
  const rule = actionData.item;
312
312
  await appstate.securityPolicyStatePart.dispatchAction(appstate.updateSecurityBlockRuleAction, {
@@ -356,7 +356,7 @@ let OpsViewSecurityBlocked = (() => {
356
356
  name: 'Block Network Range',
357
357
  iconName: 'lucide:network',
358
358
  type: ['contextmenu'],
359
- actionRelevancyCheckFunc: (actionData) => Boolean(actionData.item.networkRange),
359
+ actionRelevancyCheckFunc: (entry) => Boolean(entry.networkRange),
360
360
  actionFunc: async (actionData) => {
361
361
  const record = actionData.item;
362
362
  await this.showRuleDialog(undefined, {
@@ -370,7 +370,7 @@ let OpsViewSecurityBlocked = (() => {
370
370
  name: 'Block ASN',
371
371
  iconName: 'lucide:radio-tower',
372
372
  type: ['contextmenu'],
373
- actionRelevancyCheckFunc: (actionData) => Boolean(actionData.item.asn),
373
+ actionRelevancyCheckFunc: (entry) => Boolean(entry.asn),
374
374
  actionFunc: async (actionData) => {
375
375
  const record = actionData.item;
376
376
  await this.showRuleDialog(undefined, {
@@ -384,7 +384,7 @@ let OpsViewSecurityBlocked = (() => {
384
384
  name: 'Block Organization',
385
385
  iconName: 'lucide:building-2',
386
386
  type: ['contextmenu'],
387
- actionRelevancyCheckFunc: (actionData) => Boolean(actionData.item.asnOrg || actionData.item.registrantOrg),
387
+ actionRelevancyCheckFunc: (entry) => Boolean(entry.asnOrg || entry.registrantOrg),
388
388
  actionFunc: async (actionData) => {
389
389
  const record = actionData.item;
390
390
  await this.showRuleDialog(undefined, {
@@ -505,4 +505,4 @@ let OpsViewSecurityBlocked = (() => {
505
505
  return OpsViewSecurityBlocked = _classThis;
506
506
  })();
507
507
  export { OpsViewSecurityBlocked };
508
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BzLXZpZXctc2VjdXJpdHktYmxvY2tlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3RzX3dlYi9lbGVtZW50cy9zZWN1cml0eS9vcHMtdmlldy1zZWN1cml0eS1ibG9ja2VkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEtBQUssUUFBUSxNQUFNLG1CQUFtQixDQUFDO0FBQzlDLE9BQU8sS0FBSyxVQUFVLE1BQU0sc0NBQXNDLENBQUM7QUFDbkUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRS9DLE9BQU8sRUFDTCxXQUFXLEVBQ1gsYUFBYSxFQUNiLElBQUksRUFDSixLQUFLLEVBQ0wsR0FBRyxFQUNILFVBQVUsR0FFWCxNQUFNLDZCQUE2QixDQUFDO0FBQ3JDLE9BQU8sRUFBbUIsTUFBTSw2QkFBNkIsQ0FBQztJQVNqRCxzQkFBc0I7NEJBRGxDLGFBQWEsQ0FBQywyQkFBMkIsQ0FBQzs7OztzQkFDQyxXQUFXOzs7O3NDQUFuQixTQUFRLFdBQVc7Ozs7K0NBQ3BELEtBQUssRUFBRTtZQUNSLDhNQUFTLG1CQUFtQiw2QkFBbkIsbUJBQW1CLGlIQUErRTtZQUY3Ryw2S0EwY0M7Ozs7UUF4Y0MsbUdBQThELFFBQVEsQ0FBQyx1QkFBdUIsQ0FBQyxRQUFRLEVBQUcsRUFBQztRQUEzRyxJQUFTLG1CQUFtQix5REFBK0U7UUFBM0csSUFBUyxtQkFBbUIsK0RBQStFO1FBRTNHO1lBQ0UsS0FBSyxFQUFFLENBQUM7O1lBQ1IsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLHVCQUF1QjtpQkFDekMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7aUJBQ2hCLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO2dCQUNmLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxDQUFDLENBQUM7WUFDL0IsQ0FBQyxDQUFDLENBQUM7WUFDTCxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNoQztRQUVNLEtBQUssQ0FBQyxpQkFBaUI7WUFDNUIsTUFBTSxLQUFLLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztZQUNoQyxNQUFNLFFBQVEsQ0FBQyx1QkFBdUIsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLHlCQUF5QixFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2xHLENBQUM7UUFFTSxNQUFNLENBQUMsTUFBTSxHQUFHO1lBQ3JCLFVBQVUsQ0FBQyxhQUFhO1lBQ3hCLFdBQVc7WUFDWCxHQUFHLENBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztzQkFxQmUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDO2lCQUM3QyxVQUFVLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUM7Ozs7c0JBSW5DLFVBQVUsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQztpQkFDN0MsVUFBVSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDOzs7Ozs7Ozs7O3NCQVVoQyxVQUFVLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUM7aUJBQzdDLFVBQVUsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQzs7Ozs7O3NCQU1uQyxVQUFVLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUM7aUJBQzdDLFVBQVUsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQzs7S0FFcEQ7U0FDRixDQUFDO1FBRUssTUFBTTtZQUNYLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztZQUN2QyxNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQy9ELE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUM7WUFDOUQsTUFBTSxjQUFjLEdBQUcsS0FBSyxDQUFDLGNBQWMsSUFBSSxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsWUFBWSxFQUFFLEVBQUUsRUFBRSxDQUFDO1lBRXBGLE1BQU0sS0FBSyxHQUFpQjtnQkFDMUI7b0JBQ0UsRUFBRSxFQUFFLGFBQWE7b0JBQ2pCLEtBQUssRUFBRSxjQUFjO29CQUNyQixLQUFLLEVBQUUsV0FBVyxDQUFDLE1BQU07b0JBQ3pCLElBQUksRUFBRSxRQUFRO29CQUNkLElBQUksRUFBRSxxQkFBcUI7b0JBQzNCLEtBQUssRUFBRSxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTO29CQUNyRCxXQUFXLEVBQUUsR0FBRyxhQUFhLFdBQVc7aUJBQ3pDO2dCQUNEO29CQUNFLEVBQUUsRUFBRSxhQUFhO29CQUNqQixLQUFLLEVBQUUsY0FBYztvQkFDckIsS0FBSyxFQUFFLGNBQWMsQ0FBQyxVQUFVLENBQUMsTUFBTTtvQkFDdkMsSUFBSSxFQUFFLFFBQVE7b0JBQ2QsSUFBSSxFQUFFLG1CQUFtQjtvQkFDekIsS0FBSyxFQUFFLFNBQVM7b0JBQ2hCLFdBQVcsRUFBRSx5Q0FBeUM7aUJBQ3ZEO2dCQUNEO29CQUNFLEVBQUUsRUFBRSxlQUFlO29CQUNuQixLQUFLLEVBQUUsZ0JBQWdCO29CQUN2QixLQUFLLEVBQUUsY0FBYyxDQUFDLFlBQVksQ0FBQyxNQUFNO29CQUN6QyxJQUFJLEVBQUUsUUFBUTtvQkFDZCxJQUFJLEVBQUUsZ0JBQWdCO29CQUN0QixLQUFLLEVBQUUsU0FBUztvQkFDaEIsV0FBVyxFQUFFLDZDQUE2QztpQkFDM0Q7Z0JBQ0Q7b0JBQ0UsRUFBRSxFQUFFLHFCQUFxQjtvQkFDekIsS0FBSyxFQUFFLGlCQUFpQjtvQkFDeEIsS0FBSyxFQUFFLEtBQUssQ0FBQyxjQUFjLENBQUMsTUFBTTtvQkFDbEMsSUFBSSxFQUFFLFFBQVE7b0JBQ2QsSUFBSSxFQUFFLGNBQWM7b0JBQ3BCLEtBQUssRUFBRSxTQUFTO29CQUNoQixXQUFXLEVBQUUscUNBQXFDO2lCQUNuRDthQUNGLENBQUM7WUFFRixPQUFPLElBQUksQ0FBQTs7O1FBR1AsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFBLDZCQUE2QixLQUFLLENBQUMsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQSxFQUFFOzs7aUJBR2xFLEtBQUs7d0JBQ0UsR0FBRzs7OztVQUlqQixJQUFJLENBQUMsZ0JBQWdCLEVBQUU7VUFDdkIsSUFBSSxDQUFDLHlCQUF5QixFQUFFO1VBQ2hDLElBQUksQ0FBQyx5QkFBeUIsRUFBRTtVQUNoQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7O0tBRTVCLENBQUM7UUFDSixDQUFDO1FBRU8sZ0JBQWdCO1lBQ3RCLE9BQU8sSUFBSSxDQUFBOztvQkFFSyxxQkFBcUI7b0JBQ3JCLGtGQUFrRjtnQkFDdEYsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUs7a0JBQzVCLElBQUk7MkJBQ0ssQ0FBQyxJQUF3QyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUNoRSxNQUFNLEVBQUUsSUFBSSxDQUFBLDJCQUEyQixJQUFJLENBQUMsSUFBSSxTQUFTO2dCQUN6RCxPQUFPLEVBQUUsSUFBSSxDQUFDLEtBQUs7Z0JBQ25CLE9BQU8sRUFBRSxJQUFJLENBQUMsSUFBSSxLQUFLLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHO2dCQUM1RSxRQUFRLEVBQUUsSUFBSSxDQUFDLE1BQU0sSUFBSSxHQUFHO2dCQUM1QixRQUFRLEVBQUUsSUFBSSxDQUFBLDRCQUE0QixJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsS0FBSyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsU0FBUztnQkFDbEksU0FBUyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztnQkFDOUMsU0FBUyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQzthQUMvQyxDQUFDO3VCQUNhLElBQUksQ0FBQyxjQUFjLEVBQUU7OzZCQUVmLElBQUk7OztLQUc1QixDQUFDO1FBQ0osQ0FBQztRQUVPLHlCQUF5QjtZQUMvQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsY0FBYyxJQUFJLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBRSxZQUFZLEVBQUUsRUFBRSxFQUFFLENBQUM7WUFDL0YsTUFBTSxJQUFJLEdBQUc7Z0JBQ1gsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztnQkFDNUQsR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQzthQUNqRSxDQUFDO1lBRUYsT0FBTyxJQUFJLENBQUE7O29CQUVLLDZCQUE2QjtvQkFDN0Isd0VBQXdFO2dCQUM1RSxJQUFJO2tCQUNGLE9BQU87MkJBQ0UsQ0FBQyxHQUFvQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUM1RCxrQkFBa0IsRUFBRSxJQUFJLENBQUEsMkJBQTJCLEdBQUcsQ0FBQyxJQUFJLFNBQVM7Z0JBQ3BFLE9BQU8sRUFBRSxHQUFHLENBQUMsS0FBSzthQUNuQixDQUFDOzs2QkFFbUIsSUFBSTs7O0tBRzVCLENBQUM7UUFDSixDQUFDO1FBRU8seUJBQXlCO1lBQy9CLE9BQU8sSUFBSSxDQUFBOztvQkFFSywwQkFBMEI7b0JBQzFCLHFGQUFxRjtnQkFDekYsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGNBQWM7a0JBQ3JDLFdBQVc7MkJBQ0YsQ0FBQyxNQUE2QyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUNyRSxZQUFZLEVBQUUsTUFBTSxDQUFDLFNBQVM7Z0JBQzlCLEtBQUssRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRztnQkFDM0MsU0FBUyxFQUFFLE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRztnQkFDL0IsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDLGFBQWEsSUFBSSxHQUFHO2dCQUM3QyxTQUFTLEVBQUUsTUFBTSxDQUFDLFdBQVcsSUFBSSxNQUFNLENBQUMsT0FBTyxJQUFJLEdBQUc7Z0JBQ3RELGVBQWUsRUFBRSxNQUFNLENBQUMsWUFBWSxJQUFJLEdBQUc7Z0JBQzNDLGVBQWUsRUFBRSxNQUFNLENBQUMsWUFBWSxJQUFJLEdBQUc7Z0JBQzNDLE1BQU0sRUFBRSxNQUFNLENBQUMsU0FBUztnQkFDeEIsV0FBVyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQzthQUNwRCxDQUFDO3VCQUNhLElBQUksQ0FBQyx3QkFBd0IsRUFBRTs7NkJBRXpCLElBQUk7OztLQUc1QixDQUFDO1FBQ0osQ0FBQztRQUVPLGdCQUFnQjtZQUN0QixPQUFPLElBQUksQ0FBQTs7b0JBRUssY0FBYztvQkFDZCxnQ0FBZ0M7Z0JBQ3BDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXO2tCQUNsQyxJQUFJOzJCQUNLLENBQUMsS0FBZ0QsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDeEUsTUFBTSxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQztnQkFDNUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxNQUFNO2dCQUN0QixPQUFPLEVBQUUsS0FBSyxDQUFDLEtBQUs7Z0JBQ3BCLFNBQVMsRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQzthQUNsRCxDQUFDOzs2QkFFbUIsSUFBSTs7O0tBRzVCLENBQUM7UUFDSixDQUFDO1FBRU8sY0FBYztZQUNwQixPQUFPO2dCQUNMO29CQUNFLElBQUksRUFBRSxhQUFhO29CQUNuQixRQUFRLEVBQUUsYUFBYTtvQkFDdkIsSUFBSSxFQUFFLENBQUMsUUFBUSxDQUFRO29CQUN2QixVQUFVLEVBQUUsS0FBSyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFO2lCQUM5QztnQkFDRDtvQkFDRSxJQUFJLEVBQUUsTUFBTTtvQkFDWixRQUFRLEVBQUUsZUFBZTtvQkFDekIsSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFLGFBQWEsQ0FBUTtvQkFDckMsVUFBVSxFQUFFLEtBQUssRUFBRSxVQUFlLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQztpQkFDNUU7Z0JBQ0Q7b0JBQ0UsSUFBSSxFQUFFLFFBQVE7b0JBQ2QsUUFBUSxFQUFFLGFBQWE7b0JBQ3ZCLElBQUksRUFBRSxDQUFDLGFBQWEsQ0FBUTtvQkFDNUIsd0JBQXdCLEVBQUUsQ0FBQyxVQUFlLEVBQUUsRUFBRSxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPO29CQUN2RSxVQUFVLEVBQUUsS0FBSyxFQUFFLFVBQWUsRUFBRSxFQUFFO3dCQUNwQyxNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsSUFBMEMsQ0FBQzt3QkFDbkUsTUFBTSxRQUFRLENBQUMsdUJBQXVCLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyw2QkFBNkIsRUFBRTs0QkFDNUYsRUFBRSxFQUFFLElBQUksQ0FBQyxFQUFFOzRCQUNYLE9BQU8sRUFBRSxJQUFJO3lCQUNkLENBQUMsQ0FBQztvQkFDTCxDQUFDO2lCQUNGO2dCQUNEO29CQUNFLElBQUksRUFBRSxTQUFTO29CQUNmLFFBQVEsRUFBRSxjQUFjO29CQUN4QixJQUFJLEVBQUUsQ0FBQyxhQUFhLENBQVE7b0JBQzVCLHdCQUF3QixFQUFFLENBQUMsVUFBZSxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU87b0JBQ3RFLFVBQVUsRUFBRSxLQUFLLEVBQUUsVUFBZSxFQUFFLEVBQUU7d0JBQ3BDLE1BQU0sSUFBSSxHQUFHLFVBQVUsQ0FBQyxJQUEwQyxDQUFDO3dCQUNuRSxNQUFNLFFBQVEsQ0FBQyx1QkFBdUIsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLDZCQUE2QixFQUFFOzRCQUM1RixFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUU7NEJBQ1gsT0FBTyxFQUFFLEtBQUs7eUJBQ2YsQ0FBQyxDQUFDO29CQUNMLENBQUM7aUJBQ0Y7Z0JBQ0Q7b0JBQ0UsSUFBSSxFQUFFLFFBQVE7b0JBQ2QsUUFBUSxFQUFFLGdCQUFnQjtvQkFDMUIsSUFBSSxFQUFFLENBQUMsYUFBYSxDQUFRO29CQUM1QixVQUFVLEVBQUUsS0FBSyxFQUFFLFVBQWUsRUFBRSxFQUFFO3dCQUNwQyxNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsSUFBMEMsQ0FBQzt3QkFDbkUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMscUJBQXFCLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDOzRCQUFFLE9BQU87d0JBQzdFLE1BQU0sUUFBUSxDQUFDLHVCQUF1QixDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsNkJBQTZCLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUN6RyxDQUFDO2lCQUNGO2FBQ0YsQ0FBQztRQUNKLENBQUM7UUFFTyx3QkFBd0I7WUFDOUIsT0FBTztnQkFDTDtvQkFDRSxJQUFJLEVBQUUsc0JBQXNCO29CQUM1QixRQUFRLEVBQUUsbUJBQW1CO29CQUM3QixJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsYUFBYSxDQUFRO29CQUNyQyxVQUFVLEVBQUUsS0FBSyxFQUFFLFVBQWUsRUFBRSxFQUFFO3dCQUNwQyxNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsSUFBNkMsQ0FBQzt3QkFDeEUsTUFBTSxRQUFRLENBQUMsdUJBQXVCLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQywyQkFBMkIsRUFBRSxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7b0JBQ2hILENBQUM7aUJBQ0Y7Z0JBQ0Q7b0JBQ0UsSUFBSSxFQUFFLFVBQVU7b0JBQ2hCLFFBQVEsRUFBRSxtQkFBbUI7b0JBQzdCLElBQUksRUFBRSxDQUFDLGFBQWEsQ0FBUTtvQkFDNUIsVUFBVSxFQUFFLEtBQUssRUFBRSxVQUFlLEVBQUUsRUFBRTt3QkFDcEMsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLElBQTZDLENBQUM7d0JBQ3hFLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLEVBQUU7NEJBQ25DLElBQUksRUFBRSxJQUFJOzRCQUNWLEtBQUssRUFBRSxNQUFNLENBQUMsU0FBUzs0QkFDdkIsTUFBTSxFQUFFLG9DQUFvQzt5QkFDN0MsQ0FBQyxDQUFDO29CQUNMLENBQUM7aUJBQ0Y7Z0JBQ0Q7b0JBQ0UsSUFBSSxFQUFFLHFCQUFxQjtvQkFDM0IsUUFBUSxFQUFFLGdCQUFnQjtvQkFDMUIsSUFBSSxFQUFFLENBQUMsYUFBYSxDQUFRO29CQUM1Qix3QkFBd0IsRUFBRSxDQUFDLFVBQWUsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDO29CQUNwRixVQUFVLEVBQUUsS0FBSyxFQUFFLFVBQWUsRUFBRSxFQUFFO3dCQUNwQyxNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsSUFBNkMsQ0FBQzt3QkFDeEUsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsRUFBRTs0QkFDbkMsSUFBSSxFQUFFLE1BQU07NEJBQ1osS0FBSyxFQUFFLE1BQU0sQ0FBQyxZQUFZLElBQUksRUFBRTs0QkFDaEMsTUFBTSxFQUFFLGtEQUFrRDt5QkFDM0QsQ0FBQyxDQUFDO29CQUNMLENBQUM7aUJBQ0Y7Z0JBQ0Q7b0JBQ0UsSUFBSSxFQUFFLFdBQVc7b0JBQ2pCLFFBQVEsRUFBRSxvQkFBb0I7b0JBQzlCLElBQUksRUFBRSxDQUFDLGFBQWEsQ0FBUTtvQkFDNUIsd0JBQXdCLEVBQUUsQ0FBQyxVQUFlLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztvQkFDM0UsVUFBVSxFQUFFLEtBQUssRUFBRSxVQUFlLEVBQUUsRUFBRTt3QkFDcEMsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLElBQTZDLENBQUM7d0JBQ3hFLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLEVBQUU7NEJBQ25DLElBQUksRUFBRSxLQUFLOzRCQUNYLEtBQUssRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQzs0QkFDekIsTUFBTSxFQUFFLHdDQUF3Qzt5QkFDakQsQ0FBQyxDQUFDO29CQUNMLENBQUM7aUJBQ0Y7Z0JBQ0Q7b0JBQ0UsSUFBSSxFQUFFLG9CQUFvQjtvQkFDMUIsUUFBUSxFQUFFLG1CQUFtQjtvQkFDN0IsSUFBSSxFQUFFLENBQUMsYUFBYSxDQUFRO29CQUM1Qix3QkFBd0IsRUFBRSxDQUFDLFVBQWUsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDO29CQUMvRyxVQUFVLEVBQUUsS0FBSyxFQUFFLFVBQWUsRUFBRSxFQUFFO3dCQUNwQyxNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsSUFBNkMsQ0FBQzt3QkFDeEUsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsRUFBRTs0QkFDbkMsSUFBSSxFQUFFLGNBQWM7NEJBQ3BCLEtBQUssRUFBRSxNQUFNLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxhQUFhLElBQUksRUFBRTs0QkFDbEQsTUFBTSxFQUFFLGlEQUFpRDt5QkFDMUQsQ0FBQyxDQUFDO29CQUNMLENBQUM7aUJBQ0Y7YUFDRixDQUFDO1FBQ0osQ0FBQztRQUVPLEtBQUssQ0FBQyxjQUFjLENBQzFCLElBQXlDLEVBQ3pDLFdBQXdELEVBQUU7WUFFMUQsTUFBTSxFQUFFLFNBQVMsRUFBRSxHQUFHLE1BQU0sTUFBTSxDQUFDLDZCQUE2QixDQUFDLENBQUM7WUFDbEUsTUFBTSxXQUFXLEdBQUc7Z0JBQ2xCLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFO2dCQUNuQyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLHNCQUFzQixFQUFFO2dCQUMvQyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFDN0IsRUFBRSxHQUFHLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUU7YUFDaEQsQ0FBQztZQUNGLE1BQU0sZ0JBQWdCLEdBQUc7Z0JBQ3ZCLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsNkJBQTZCLEVBQUU7Z0JBQzFELEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsb0NBQW9DLEVBQUU7YUFDL0QsQ0FBQztZQUNGLE1BQU0sWUFBWSxHQUFHLElBQUksRUFBRSxJQUFJLElBQUksUUFBUSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUM7WUFDekQsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLEVBQUUsU0FBUyxJQUFJLFFBQVEsQ0FBQyxTQUFTLElBQUksVUFBVSxDQUFDO1lBRTlFLE1BQU0sU0FBUyxDQUFDLGFBQWEsQ0FBQztnQkFDNUIsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsb0JBQW9CLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxtQkFBbUI7Z0JBQ25GLE9BQU8sRUFBRSxJQUFJLENBQUE7O1lBRVAsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUEsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUE7O3FCQUVYLE1BQU07dUJBQ0osV0FBVzt5QkFDVCxXQUFXO2dDQUNKLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEtBQUssWUFBWSxDQUFDOztXQUU5RTs7bUJBRVEsT0FBTztxQkFDTCxPQUFPO3FCQUNQLElBQUksRUFBRSxLQUFLLElBQUksUUFBUSxDQUFDLEtBQUssSUFBSSxFQUFFO3dCQUNoQyxJQUFJOzs7bUJBR1QsV0FBVztxQkFDVCx5QkFBeUI7MkJBQ25CLGtDQUFrQzt1QkFDdEMsZ0JBQWdCOzhCQUNULGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsS0FBSyxpQkFBaUIsQ0FBQzs7O21CQUc5RSxRQUFRO3FCQUNOLFFBQVE7cUJBQ1IsSUFBSSxFQUFFLE1BQU0sSUFBSSxRQUFRLENBQUMsTUFBTSxJQUFJLEVBQUU7OzttQkFHdkMsU0FBUztxQkFDUCxTQUFTO3FCQUNULElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sS0FBSyxLQUFLOzs7T0FHOUQ7Z0JBQ0QsV0FBVyxFQUFFO29CQUNYLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsUUFBYSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLEVBQUU7b0JBQzdGO3dCQUNFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsUUFBUTt3QkFDOUIsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxhQUFhO3dCQUMvQyxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQWEsRUFBRSxFQUFFOzRCQUM5QixNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsVUFBVSxFQUFFLGFBQWEsQ0FBQyxVQUFVLENBQUMsRUFBRSxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUM7NEJBQ3hGLElBQUksQ0FBQyxJQUFJO2dDQUFFLE9BQU87NEJBQ2xCLE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDOzRCQUMxQyxNQUFNLElBQUksR0FBRyxDQUFDLElBQUksRUFBRSxJQUFJLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQTJDLENBQUM7NEJBQ3RHLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDOzRCQUM5QyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSztnQ0FBRSxPQUFPOzRCQUM1QixNQUFNLFNBQVMsR0FBRyxJQUFJLEtBQUssY0FBYztnQ0FDdkMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBZ0Q7Z0NBQ3BGLENBQUMsQ0FBQyxTQUFTLENBQUM7NEJBQ2QsTUFBTSxPQUFPLEdBQUc7Z0NBQ2QsS0FBSztnQ0FDTCxTQUFTO2dDQUNULE1BQU0sRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxTQUFTO2dDQUNyRCxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sS0FBSyxLQUFLOzZCQUNoQyxDQUFDOzRCQUNGLElBQUksSUFBSSxFQUFFLENBQUM7Z0NBQ1QsTUFBTSxRQUFRLENBQUMsdUJBQXVCLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyw2QkFBNkIsRUFBRTtvQ0FDNUYsRUFBRSxFQUFFLElBQUksQ0FBQyxFQUFFO29DQUNYLEdBQUcsT0FBTztpQ0FDWCxDQUFDLENBQUM7NEJBQ0wsQ0FBQztpQ0FBTSxDQUFDO2dDQUNOLE1BQU0sUUFBUSxDQUFDLHVCQUF1QixDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsNkJBQTZCLEVBQUU7b0NBQzVGLElBQUk7b0NBQ0osR0FBRyxPQUFPO2lDQUNYLENBQUMsQ0FBQzs0QkFDTCxDQUFDOzRCQUNELE1BQU0sUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDO3dCQUMzQixDQUFDO3FCQUNGO2lCQUNGO2FBQ0YsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVPLGNBQWMsQ0FBQyxLQUFVO1lBQy9CLE9BQU8sT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxHQUFHLElBQUksRUFBRSxDQUFDO1FBQzlELENBQUM7UUFFTyxjQUFjLENBQUMsU0FBa0I7WUFDdkMsT0FBTyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7UUFDaEUsQ0FBQztRQUVPLGtCQUFrQixDQUFDLE9BQWdDO1lBQ3pELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDckMsT0FBTyxJQUFJLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDL0QsQ0FBQzs7WUF6Y1UsdURBQXNCOzs7OztTQUF0QixzQkFBc0IifQ==
508
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BzLXZpZXctc2VjdXJpdHktYmxvY2tlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3RzX3dlYi9lbGVtZW50cy9zZWN1cml0eS9vcHMtdmlldy1zZWN1cml0eS1ibG9ja2VkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEtBQUssUUFBUSxNQUFNLG1CQUFtQixDQUFDO0FBQzlDLE9BQU8sS0FBSyxVQUFVLE1BQU0sc0NBQXNDLENBQUM7QUFDbkUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRS9DLE9BQU8sRUFDTCxXQUFXLEVBQ1gsYUFBYSxFQUNiLElBQUksRUFDSixLQUFLLEVBQ0wsR0FBRyxFQUNILFVBQVUsR0FFWCxNQUFNLDZCQUE2QixDQUFDO0FBQ3JDLE9BQU8sRUFBbUIsTUFBTSw2QkFBNkIsQ0FBQztJQVNqRCxzQkFBc0I7NEJBRGxDLGFBQWEsQ0FBQywyQkFBMkIsQ0FBQzs7OztzQkFDQyxXQUFXOzs7O3NDQUFuQixTQUFRLFdBQVc7Ozs7K0NBQ3BELEtBQUssRUFBRTtZQUNSLDhNQUFTLG1CQUFtQiw2QkFBbkIsbUJBQW1CLGlIQUErRTtZQUY3Ryw2S0EwY0M7Ozs7UUF4Y0MsbUdBQThELFFBQVEsQ0FBQyx1QkFBdUIsQ0FBQyxRQUFRLEVBQUcsRUFBQztRQUEzRyxJQUFTLG1CQUFtQix5REFBK0U7UUFBM0csSUFBUyxtQkFBbUIsK0RBQStFO1FBRTNHO1lBQ0UsS0FBSyxFQUFFLENBQUM7O1lBQ1IsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLHVCQUF1QjtpQkFDekMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7aUJBQ2hCLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO2dCQUNmLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxDQUFDLENBQUM7WUFDL0IsQ0FB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
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@serve.zone/dcrouter",
3
3
  "private": false,
4
- "version": "16.2.1",
4
+ "version": "16.4.0",
5
5
  "description": "A multifaceted routing service handling mail and SMS delivery functions.",
6
6
  "type": "module",
7
7
  "bin": {
@@ -30,7 +30,7 @@
30
30
  "@api.global/typedserver": "^8.5.3",
31
31
  "@api.global/typedsocket": "^4.1.4",
32
32
  "@apiclient.xyz/cloudflare": "^7.1.0",
33
- "@design.estate/dees-catalog": "^3.96.0",
33
+ "@design.estate/dees-catalog": "^3.96.3",
34
34
  "@design.estate/dees-element": "^2.2.4",
35
35
  "@idp.global/sdk": "^1.4.0",
36
36
  "@push.rocks/lik": "^6.4.1",
package/readme.md CHANGED
@@ -277,7 +277,7 @@ SmartAcme is configured with DNS-01 priority for managed domains. If SmartAcme i
277
277
 
278
278
  Operators can also create a managed **Special Forward** for an external Let's Encrypt HTTP-01 responder. The workflow accepts exact domains plus either an inline backend or a reusable Network Target. dcrouter compiles that intent into a public port `80` route matching only `/.well-known/acme-challenge/*`, assigns priority `1000`, binds the `PUBLIC` source profile, and can optionally expose the route through RemoteIngress. The high-priority path route coexists with the normal HTTP-to-HTTPS redirect for the same domain.
279
279
 
280
- Use the Routes view's **Special Forwards** tab or the raw TypedRequest methods `createLetsEncryptHttp01Forward`, `updateLetsEncryptHttp01Forward`, and `deleteLetsEncryptHttp01Forward`. Generic route update/delete methods intentionally reject these managed routes.
280
+ Use the Routes view's Type multitoggle and select **Special**, or use the raw TypedRequest methods `createLetsEncryptHttp01Forward`, `updateLetsEncryptHttp01Forward`, and `deleteLetsEncryptHttp01Forward`. Generic route update/delete methods intentionally reject these managed routes.
281
281
 
282
282
  ### Security Policy And IP Intelligence
283
283
 
@@ -3,6 +3,6 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@serve.zone/dcrouter',
6
- version: '16.2.1',
6
+ version: '16.4.0',
7
7
  description: 'A multifaceted routing service handling mail and SMS delivery functions.'
8
8
  }
@@ -1,5 +1,8 @@
1
1
  import * as plugins from '../plugins.js';
2
- import type { IHttpRedirectInfo } from '../../ts_interfaces/data/route-management.js';
2
+ import {
3
+ canonicalizeSourceRouteId,
4
+ type IHttpRedirectInfo,
5
+ } from '../../ts_interfaces/data/route-management.js';
3
6
  import type { IDcRouterRouteConfig, IRouteRemoteIngress } from '../../ts_interfaces/data/remoteingress.js';
4
7
 
5
8
  const AUTO_REDIRECT_ROUTE_PREFIX = 'dcrouter-auto-http-redirect';
@@ -93,7 +96,7 @@ function collectRedirectCandidates(routes: plugins.smartproxy.IRouteConfig[]): I
93
96
  const existing = candidates.get(key);
94
97
  if (existing) {
95
98
  existing.sourceRouteNames.add(getRouteDisplayName(route));
96
- if (route.id) existing.sourceRouteIds.add(route.id);
99
+ if (route.id) existing.sourceRouteIds.add(canonicalizeSourceRouteId(route.id));
97
100
  existing.remoteIngress = mergeRemoteIngress(existing.remoteIngress, (route as IDcRouterRouteConfig).remoteIngress);
98
101
  continue;
99
102
  }
@@ -105,7 +108,7 @@ function collectRedirectCandidates(routes: plugins.smartproxy.IRouteConfig[]): I
105
108
  domainPattern,
106
109
  pathPattern: route.match.path,
107
110
  sourceRouteNames: new Set([getRouteDisplayName(route)]),
108
- sourceRouteIds: new Set(route.id ? [route.id] : []),
111
+ sourceRouteIds: new Set(route.id ? [canonicalizeSourceRouteId(route.id)] : []),
109
112
  remoteIngress: mergeRemoteIngress(undefined, (route as IDcRouterRouteConfig).remoteIngress),
110
113
  });
111
114
  }
@@ -3,6 +3,6 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@serve.zone/dcrouter',
6
- version: '16.2.1',
6
+ version: '16.4.0',
7
7
  description: 'A multifaceted routing service handling mail and SMS delivery functions.'
8
8
  }
@@ -133,7 +133,7 @@ export class OpsViewApiTokens extends DeesElement {
133
133
  name: 'Enable',
134
134
  iconName: 'lucide:play',
135
135
  type: ['inRow', 'contextmenu'] as any,
136
- actionRelevancyCheckFunc: (actionData: any) => !actionData.item.enabled,
136
+ actionRelevancyCheckFunc: (token: any) => !token.enabled,
137
137
  actionFunc: async (actionData: any) => {
138
138
  const token = actionData.item as interfaces.data.IApiTokenInfo;
139
139
  await appstate.routeManagementStatePart.dispatchAction(
@@ -146,7 +146,7 @@ export class OpsViewApiTokens extends DeesElement {
146
146
  name: 'Disable',
147
147
  iconName: 'lucide:pause',
148
148
  type: ['inRow', 'contextmenu'] as any,
149
- actionRelevancyCheckFunc: (actionData: any) => actionData.item.enabled,
149
+ actionRelevancyCheckFunc: (token: any) => token.enabled,
150
150
  actionFunc: async (actionData: any) => {
151
151
  const token = actionData.item as interfaces.data.IApiTokenInfo;
152
152
  await appstate.routeManagementStatePart.dispatchAction(
@@ -97,7 +97,7 @@ export class OpsViewGatewayClients extends DeesElement {
97
97
  name: 'Enable',
98
98
  iconName: 'lucide:play',
99
99
  type: ['inRow', 'contextmenu'] as any,
100
- actionRelevancyCheckFunc: (actionData: any) => !actionData.item.enabled,
100
+ actionRelevancyCheckFunc: (client: any) => !client.enabled,
101
101
  actionFunc: async (actionData: any) => {
102
102
  await appstate.routeManagementStatePart.dispatchAction(appstate.updateGatewayClientAction, {
103
103
  id: actionData.item.id,
@@ -109,7 +109,7 @@ export class OpsViewGatewayClients extends DeesElement {
109
109
  name: 'Disable',
110
110
  iconName: 'lucide:pause',
111
111
  type: ['inRow', 'contextmenu'] as any,
112
- actionRelevancyCheckFunc: (actionData: any) => actionData.item.enabled,
112
+ actionRelevancyCheckFunc: (client: any) => client.enabled,
113
113
  actionFunc: async (actionData: any) => {
114
114
  await appstate.routeManagementStatePart.dispatchAction(appstate.updateGatewayClientAction, {
115
115
  id: actionData.item.id,
@@ -415,7 +415,7 @@ export class OpsViewNetworkActivity extends DeesElement {
415
415
  name: 'Block Network Range',
416
416
  iconName: 'lucide:network',
417
417
  type: ['contextmenu'] as any,
418
- actionRelevancyCheckFunc: (actionData: any) => Boolean(this.getIpIntelligence(actionData.item.ip)?.networkRange),
418
+ actionRelevancyCheckFunc: (entry: any) => Boolean(this.getIpIntelligence(entry.ip)?.networkRange),
419
419
  actionFunc: async (actionData: any) => {
420
420
  const record = this.getIpIntelligence(actionData.item.ip);
421
421
  await this.createBlockRuleDialog('cidr', record!.networkRange!, 'Blocked network range from Network Activity');
@@ -425,7 +425,7 @@ export class OpsViewNetworkActivity extends DeesElement {
425
425
  name: 'Block ASN',
426
426
  iconName: 'lucide:radio-tower',
427
427
  type: ['contextmenu'] as any,
428
- actionRelevancyCheckFunc: (actionData: any) => Boolean(this.getIpIntelligence(actionData.item.ip)?.asn),
428
+ actionRelevancyCheckFunc: (entry: any) => Boolean(this.getIpIntelligence(entry.ip)?.asn),
429
429
  actionFunc: async (actionData: any) => {
430
430
  const record = this.getIpIntelligence(actionData.item.ip);
431
431
  await this.createBlockRuleDialog('asn', String(record!.asn), 'Blocked ASN from Network Activity');
@@ -435,7 +435,7 @@ export class OpsViewNetworkActivity extends DeesElement {
435
435
  name: 'Block Organization',
436
436
  iconName: 'lucide:building-2',
437
437
  type: ['contextmenu'] as any,
438
- actionRelevancyCheckFunc: (actionData: any) => Boolean(this.getIpOrganization(this.getIpIntelligence(actionData.item.ip))),
438
+ actionRelevancyCheckFunc: (entry: any) => Boolean(this.getIpOrganization(this.getIpIntelligence(entry.ip))),
439
439
  actionFunc: async (actionData: any) => {
440
440
  const record = this.getIpIntelligence(actionData.item.ip);
441
441
  await this.createBlockRuleDialog('organization', this.getIpOrganization(record), 'Blocked organization from Network Activity');
@@ -445,7 +445,7 @@ export class OpsViewNetworkActivity extends DeesElement {
445
445
  name: 'View Intelligence',
446
446
  iconName: 'lucide:info',
447
447
  type: ['doubleClick', 'contextmenu'] as any,
448
- actionRelevancyCheckFunc: (actionData: any) => Boolean(this.getIpIntelligence(actionData.item.ip)),
448
+ actionRelevancyCheckFunc: (entry: any) => Boolean(this.getIpIntelligence(entry.ip)),
449
449
  actionFunc: async (actionData: any) => {
450
450
  await this.showIpIntelligenceDetails(actionData.item.ip);
451
451
  },
@@ -467,7 +467,7 @@ export class OpsViewNetworkActivity extends DeesElement {
467
467
  name: 'Block Organization',
468
468
  iconName: 'lucide:building-2',
469
469
  type: ['contextmenu'] as any,
470
- actionRelevancyCheckFunc: (actionData: any) => Boolean(actionData.item.organization),
470
+ actionRelevancyCheckFunc: (entry: any) => Boolean(entry.organization),
471
471
  actionFunc: async (actionData: any) => {
472
472
  await this.createBlockRuleDialog('organization', actionData.item.organization, 'Blocked organization from Network Activity');
473
473
  },
@@ -12,6 +12,10 @@ import { type IStatsTile } from '@design.estate/dees-catalog';
12
12
  import * as appstate from '../../appstate.js';
13
13
  import * as interfaces from '../../../dist_ts_interfaces/index.js';
14
14
  import { viewHostCss } from '../shared/css.js';
15
+ import {
16
+ redirectMatchesOwner,
17
+ type TRouteOwnerFilter,
18
+ } from './route-view-filters.js';
15
19
 
16
20
  declare global {
17
21
  interface HTMLElementTagNameMap {
@@ -21,8 +25,10 @@ declare global {
21
25
 
22
26
  @customElement('ops-view-redirects')
23
27
  export class OpsViewRedirects extends DeesElement {
24
- @property({ type: Boolean })
28
+ @property({ type: Boolean, reflect: true })
25
29
  accessor embedded = false;
30
+ @property({ type: String })
31
+ accessor ownerFilter: TRouteOwnerFilter = 'all';
26
32
 
27
33
  @state()
28
34
  accessor routeState: appstate.IRouteManagementState = appstate.routeManagementStatePart.getState()!;
@@ -53,6 +59,12 @@ export class OpsViewRedirects extends DeesElement {
53
59
  cssManager.defaultStyles,
54
60
  viewHostCss,
55
61
  css`
62
+ :host([embedded]) {
63
+ margin: 0;
64
+ max-width: none;
65
+ padding: 0;
66
+ }
67
+
56
68
  .redirectsContainer {
57
69
  display: flex;
58
70
  flex-direction: column;
@@ -72,7 +84,9 @@ export class OpsViewRedirects extends DeesElement {
72
84
  ];
73
85
 
74
86
  public render(): TemplateResult {
75
- const redirects = this.routeState.httpRedirects || [];
87
+ const redirects = (this.routeState.httpRedirects || []).filter((redirect) => {
88
+ return redirectMatchesOwner(redirect, this.routeState.mergedRoutes, this.ownerFilter);
89
+ });
76
90
  const activeCount = redirects.filter((redirect) => redirect.status === 'active').length;
77
91
  const coveredCount = redirects.filter((redirect) => redirect.status === 'covered').length;
78
92
  const skippedCount = redirects.filter((redirect) => redirect.status === 'skipped').length;
@@ -129,7 +143,9 @@ export class OpsViewRedirects extends DeesElement {
129
143
  return html`
130
144
  ${this.embedded ? '' : html`<dees-heading level="3">Redirects</dees-heading>`}
131
145
  <div class="redirectsContainer">
132
- <dees-statsgrid .tiles=${statsTiles}></dees-statsgrid>
146
+ ${this.embedded
147
+ ? ''
148
+ : html`<dees-statsgrid .tiles=${statsTiles}></dees-statsgrid>`}
133
149
 
134
150
  ${redirects.length > 0
135
151
  ? html`
@@ -150,14 +166,7 @@ export class OpsViewRedirects extends DeesElement {
150
166
  'Covered By': redirect.coveredByRouteNames.join(', ') || '-',
151
167
  Notes: this.formatNotes(redirect),
152
168
  })}
153
- .dataActions=${[
154
- {
155
- name: 'Refresh',
156
- iconName: 'lucide:RefreshCw',
157
- type: ['header' as const],
158
- actionFunc: async () => this.refreshData(),
159
- },
160
- ]}
169
+ .dataActions=${this.getTableActions()}
161
170
  ></dees-table>
162
171
  `
163
172
  : html`
@@ -166,14 +175,7 @@ export class OpsViewRedirects extends DeesElement {
166
175
  .heading2=${'Runtime redirects derived from enabled HTTPS routes'}
167
176
  .data=${[]}
168
177
  .displayFunction=${() => ({})}
169
- .dataActions=${[
170
- {
171
- name: 'Refresh',
172
- iconName: 'lucide:RefreshCw',
173
- type: ['header' as const],
174
- actionFunc: async () => this.refreshData(),
175
- },
176
- ]}
178
+ .dataActions=${this.getTableActions()}
177
179
  ></dees-table>
178
180
  <div class="empty-state">
179
181
  <p>No derived redirects</p>
@@ -188,6 +190,19 @@ export class OpsViewRedirects extends DeesElement {
188
190
  await appstate.routeManagementStatePart.dispatchAction(appstate.fetchHttpRedirectsAction, null);
189
191
  }
190
192
 
193
+ private getTableActions() {
194
+ return this.embedded
195
+ ? []
196
+ : [
197
+ {
198
+ name: 'Refresh',
199
+ iconName: 'lucide:refreshCw',
200
+ type: ['header' as const],
201
+ actionFunc: async () => this.refreshData(),
202
+ },
203
+ ];
204
+ }
205
+
191
206
  private formatStatus(status: interfaces.data.THttpRedirectStatus): string {
192
207
  return status.charAt(0).toUpperCase() + status.slice(1);
193
208
  }
@@ -344,7 +344,7 @@ export class OpsViewRemoteIngress extends DeesElement {
344
344
  name: 'Enable',
345
345
  iconName: 'lucide:play',
346
346
  type: ['inRow', 'contextmenu'] as any,
347
- actionRelevancyCheckFunc: (actionData: any) => !actionData.item.enabled,
347
+ actionRelevancyCheckFunc: (endpoint: any) => !endpoint.enabled,
348
348
  actionFunc: async (actionData: any) => {
349
349
  const edge = actionData.item as interfaces.data.IRemoteIngress;
350
350
  await appstate.remoteIngressStatePart.dispatchAction(
@@ -357,7 +357,7 @@ export class OpsViewRemoteIngress extends DeesElement {
357
357
  name: 'Disable',
358
358
  iconName: 'lucide:pause',
359
359
  type: ['inRow', 'contextmenu'] as any,
360
- actionRelevancyCheckFunc: (actionData: any) => actionData.item.enabled,
360
+ actionRelevancyCheckFunc: (endpoint: any) => endpoint.enabled,
361
361
  actionFunc: async (actionData: any) => {
362
362
  const edge = actionData.item as interfaces.data.IRemoteIngress;
363
363
  await appstate.remoteIngressStatePart.dispatchAction(