@archont561/qgis-sdk 0.0.0 → 0.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.
- package/LICENSE +21 -0
- package/README.md +40 -30
- package/dist/bridge.d.ts +2 -0
- package/dist/bridge.js +31 -0
- package/dist/host.d.ts +2 -0
- package/dist/host.js +51 -0
- package/dist/index.d.ts +67 -0
- package/dist/index.js +732 -0
- package/dist/react.d.ts +137 -0
- package/dist/react.js +214 -0
- package/dist/shared/chunk-2hwva3a3.js +14 -0
- package/dist/shared/chunk-8gawbn19.js +433 -0
- package/dist/shared/chunk-jjx14tgd.d.ts +55 -0
- package/dist/shared/chunk-khemhx86.d.ts +158 -0
- package/dist/shared/chunk-pdj2fxjb.d.ts +17 -0
- package/dist/shared/chunk-tmca1ynt.d.ts +87 -0
- package/dist/shared/chunk-vqyymknv.js +414 -0
- package/dist/shared/chunk-wtv4vt4q.d.ts +280 -0
- package/dist/testing.d.ts +131 -0
- package/dist/testing.js +366 -0
- package/package.json +62 -8
package/dist/react.d.ts
ADDED
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { WireTransport2, BridgeClientOptions2, BridgeClient2 } from "./shared/chunk-wtv4vt4q.js";
|
|
2
|
+
import "./shared/chunk-khemhx86.js";
|
|
3
|
+
import { OperationMap2, StreamMap2 } from "./shared/chunk-jjx14tgd.js";
|
|
4
|
+
import { QgisSdkCore2, QgisSdk2 } from "./shared/chunk-tmca1ynt.js";
|
|
5
|
+
import { QgisSdkError2 } from "./shared/chunk-pdj2fxjb.js";
|
|
6
|
+
import { ReactElement, ReactNode } from "react";
|
|
7
|
+
/** A hook or provider was used outside the shape it needs. */
|
|
8
|
+
declare class QgisSdkBridgeReactError extends QgisSdkError2 {
|
|
9
|
+
constructor(message: string);
|
|
10
|
+
}
|
|
11
|
+
/** Props for {@link BridgeProvider}: exactly one of `qgis`, `client` or `transport`. */
|
|
12
|
+
interface BridgeProviderProps {
|
|
13
|
+
/**
|
|
14
|
+
* A `QgisSdk` the page built, whatever its schema; the provider shares it
|
|
15
|
+
* and never closes it. `useQgisSdk` hands it back under the page's types.
|
|
16
|
+
*/
|
|
17
|
+
readonly qgis?: QgisSdkCore2<unknown, unknown>;
|
|
18
|
+
/** A client the caller owns; the provider never closes it. */
|
|
19
|
+
readonly client?: BridgeClient2;
|
|
20
|
+
/** A transport the provider builds and owns a client for. */
|
|
21
|
+
readonly transport?: WireTransport2;
|
|
22
|
+
/** Options for the owned client; ignored when `client` is given. */
|
|
23
|
+
readonly options?: BridgeClientOptions2;
|
|
24
|
+
readonly children?: ReactNode;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Share one client with a subtree.
|
|
28
|
+
*
|
|
29
|
+
* An owned client is created in an effect, never during render, because
|
|
30
|
+
* StrictMode renders twice and a client made in render would leave a second
|
|
31
|
+
* listener on the transport. Until that effect has run the subtree is not
|
|
32
|
+
* rendered, which is one tick. StrictMode's simulated unmount closes the
|
|
33
|
+
* owned client and the effect that follows makes a new one, so the subtree
|
|
34
|
+
* never holds a dead client. The transport must be stable across renders; to
|
|
35
|
+
* swap it, change the provider's `key`.
|
|
36
|
+
*/
|
|
37
|
+
declare function BridgeProvider(props: BridgeProviderProps): ReactElement;
|
|
38
|
+
/** The client of the nearest {@link BridgeProvider}. */
|
|
39
|
+
declare function useBridgeClient(): BridgeClient2;
|
|
40
|
+
/**
|
|
41
|
+
* The `QgisSdk` of the nearest {@link BridgeProvider}.
|
|
42
|
+
*
|
|
43
|
+
* The type parameters name the generated `Operations` and `Streams`; they are
|
|
44
|
+
* the caller's claim, the same way the provider's `qgis` prop was the page's.
|
|
45
|
+
*/
|
|
46
|
+
declare function useQgisSdk<
|
|
47
|
+
O = OperationMap2,
|
|
48
|
+
S = StreamMap2
|
|
49
|
+
>(): QgisSdk2<O, S>;
|
|
50
|
+
/**
|
|
51
|
+
* Build a generated operation map once per client: `useOperations(createOperations)`.
|
|
52
|
+
*/
|
|
53
|
+
declare function useOperations<T>(create: (client: BridgeClient2) => T): T;
|
|
54
|
+
/** Where one invocation stands. */
|
|
55
|
+
type OperationState<R> = {
|
|
56
|
+
readonly status: "idle";
|
|
57
|
+
} | {
|
|
58
|
+
readonly status: "pending";
|
|
59
|
+
} | {
|
|
60
|
+
readonly status: "ok";
|
|
61
|
+
readonly value: R;
|
|
62
|
+
} | {
|
|
63
|
+
readonly status: "error";
|
|
64
|
+
readonly error: Error;
|
|
65
|
+
};
|
|
66
|
+
/** Controls beyond running: abort what is in flight, or forget the outcome. */
|
|
67
|
+
interface OperationControls {
|
|
68
|
+
/** Abort the in-flight call locally; the host may still run it. */
|
|
69
|
+
abort(): void;
|
|
70
|
+
/** Back to `idle`, aborting anything in flight. */
|
|
71
|
+
reset(): void;
|
|
72
|
+
}
|
|
73
|
+
/** An operation member of a generated map: input, optional signal, promise. */
|
|
74
|
+
type Operation<
|
|
75
|
+
I,
|
|
76
|
+
R
|
|
77
|
+
> = (input: I, options?: {
|
|
78
|
+
readonly signal?: AbortSignal;
|
|
79
|
+
}) => Promise<R>;
|
|
80
|
+
/**
|
|
81
|
+
* Run a generated operation from a component.
|
|
82
|
+
*
|
|
83
|
+
* `run` resolves with the value, or with `undefined` when the call failed, was
|
|
84
|
+
* aborted or was superseded by a later run - the state carries the error, so
|
|
85
|
+
* the promise never rejects into an event handler. Only the latest run can
|
|
86
|
+
* change the state; unmounting aborts whatever is in flight.
|
|
87
|
+
*/
|
|
88
|
+
declare function useOperation<
|
|
89
|
+
I,
|
|
90
|
+
R
|
|
91
|
+
>(operation: Operation<I, R>): readonly [OperationState<R>, (input: I) => Promise<R | undefined>, OperationControls];
|
|
92
|
+
/** How a stream ended, as the generated module reports it. */
|
|
93
|
+
interface StreamTerminalLike {
|
|
94
|
+
readonly kind: string;
|
|
95
|
+
readonly message?: string;
|
|
96
|
+
readonly dropped?: number;
|
|
97
|
+
}
|
|
98
|
+
/** The handle a generated stream member resolves with. */
|
|
99
|
+
interface StreamHandleLike {
|
|
100
|
+
readonly id: string;
|
|
101
|
+
readonly closed: boolean;
|
|
102
|
+
close(): void;
|
|
103
|
+
}
|
|
104
|
+
/** Handlers for a stream, as a generated module types them. */
|
|
105
|
+
interface StreamHandlersLike<E> {
|
|
106
|
+
readonly onEvent?: (event: E) => void;
|
|
107
|
+
readonly onTerminal?: (terminal: StreamTerminalLike) => void;
|
|
108
|
+
}
|
|
109
|
+
/** A stream member of a generated map. */
|
|
110
|
+
type Stream<
|
|
111
|
+
I,
|
|
112
|
+
E
|
|
113
|
+
> = (input: I, handlers: StreamHandlersLike<E>, options?: {
|
|
114
|
+
readonly signal?: AbortSignal;
|
|
115
|
+
}) => Promise<StreamHandleLike>;
|
|
116
|
+
/** Where one subscription stands. */
|
|
117
|
+
interface StreamState<E> {
|
|
118
|
+
/** `idle` with a null input, `failed` when the host refused to open it. */
|
|
119
|
+
readonly status: "idle" | "opening" | "open" | "ended" | "failed";
|
|
120
|
+
readonly lastEvent: E | null;
|
|
121
|
+
readonly terminal: StreamTerminalLike | null;
|
|
122
|
+
readonly error: Error | null;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Hold a generated stream open while a component is mounted.
|
|
126
|
+
*
|
|
127
|
+
* The subscription follows `open` and the *content* of `input`: a new object
|
|
128
|
+
* with the same fields does not reopen it, a different one closes the old
|
|
129
|
+
* stream and opens a new one, and `null` closes it. Handlers are read fresh
|
|
130
|
+
* on every frame, so a new closure does not reopen anything either. Unmount
|
|
131
|
+
* closes the stream, even if the host has not yet acknowledged it.
|
|
132
|
+
*/
|
|
133
|
+
declare function useStream<
|
|
134
|
+
I,
|
|
135
|
+
E
|
|
136
|
+
>(open: Stream<I, E>, input: I | null, handlers?: StreamHandlersLike<E>): StreamState<E>;
|
|
137
|
+
export { BridgeProvider, BridgeProviderProps, Operation, OperationControls, OperationState, QgisSdkBridgeReactError, Stream, StreamHandleLike, StreamHandlersLike, StreamState, StreamTerminalLike, useBridgeClient, useOperation, useOperations, useQgisSdk, useStream };
|
package/dist/react.js
ADDED
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
import {
|
|
2
|
+
isPlainRecord,
|
|
3
|
+
QgisSdkBridgeAbortedError2,
|
|
4
|
+
BridgeClient2
|
|
5
|
+
} from "./shared/chunk-8gawbn19.js";
|
|
6
|
+
import {
|
|
7
|
+
QgisSdkError2
|
|
8
|
+
} from "./shared/chunk-2hwva3a3.js";
|
|
9
|
+
|
|
10
|
+
// src/react.ts
|
|
11
|
+
import {
|
|
12
|
+
createContext,
|
|
13
|
+
createElement,
|
|
14
|
+
useCallback,
|
|
15
|
+
useContext,
|
|
16
|
+
useEffect,
|
|
17
|
+
useMemo,
|
|
18
|
+
useRef,
|
|
19
|
+
useState
|
|
20
|
+
} from "react";
|
|
21
|
+
class QgisSdkBridgeReactError extends QgisSdkError2 {
|
|
22
|
+
constructor(message) {
|
|
23
|
+
super(message, "react_binding");
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
var ClientContext = createContext(null);
|
|
27
|
+
function BridgeProvider(props) {
|
|
28
|
+
const { qgis, client, transport, options, children } = props;
|
|
29
|
+
const given = [qgis, client, transport].filter((source) => source !== undefined).length;
|
|
30
|
+
if (given !== 1) {
|
|
31
|
+
throw new QgisSdkBridgeReactError("BridgeProvider needs exactly one of qgis, client or transport");
|
|
32
|
+
}
|
|
33
|
+
const timeoutMs = options?.timeoutMs;
|
|
34
|
+
const [owned, setOwned] = useState(null);
|
|
35
|
+
useEffect(() => {
|
|
36
|
+
if (transport === undefined) {
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
const live = new BridgeClient2(transport, timeoutMs === undefined ? {} : { timeoutMs });
|
|
40
|
+
setOwned(live);
|
|
41
|
+
return () => {
|
|
42
|
+
live.close();
|
|
43
|
+
setOwned((current) => current === live ? null : current);
|
|
44
|
+
};
|
|
45
|
+
}, [transport, timeoutMs]);
|
|
46
|
+
const value = useMemo(() => {
|
|
47
|
+
if (qgis !== undefined) {
|
|
48
|
+
return { client: qgis.client, qgis };
|
|
49
|
+
}
|
|
50
|
+
const live = client ?? owned;
|
|
51
|
+
return live === null ? null : { client: live, qgis: null };
|
|
52
|
+
}, [qgis, client, owned]);
|
|
53
|
+
return createElement(ClientContext.Provider, { value }, value === null ? null : children);
|
|
54
|
+
}
|
|
55
|
+
function useShared(hook) {
|
|
56
|
+
const shared = useContext(ClientContext);
|
|
57
|
+
if (shared === null) {
|
|
58
|
+
throw new QgisSdkBridgeReactError(`${hook} needs a BridgeProvider above it`);
|
|
59
|
+
}
|
|
60
|
+
return shared;
|
|
61
|
+
}
|
|
62
|
+
function useBridgeClient() {
|
|
63
|
+
return useShared("useBridgeClient").client;
|
|
64
|
+
}
|
|
65
|
+
function useQgisSdk() {
|
|
66
|
+
const shared = useShared("useQgisSdk");
|
|
67
|
+
if (shared.qgis === null) {
|
|
68
|
+
throw new QgisSdkBridgeReactError("useQgisSdk needs a BridgeProvider given a qgis instance");
|
|
69
|
+
}
|
|
70
|
+
return shared.qgis;
|
|
71
|
+
}
|
|
72
|
+
function useOperations(create) {
|
|
73
|
+
const client = useBridgeClient();
|
|
74
|
+
return useMemo(() => create(client), [create, client]);
|
|
75
|
+
}
|
|
76
|
+
var IDLE = Object.freeze({ status: "idle" });
|
|
77
|
+
var PENDING = Object.freeze({ status: "pending" });
|
|
78
|
+
function useOperation(operation) {
|
|
79
|
+
const [state, setState] = useState(IDLE);
|
|
80
|
+
const generation = useRef(0);
|
|
81
|
+
const controller = useRef(null);
|
|
82
|
+
const mounted = useRef(true);
|
|
83
|
+
const abort = useCallback(() => {
|
|
84
|
+
generation.current += 1;
|
|
85
|
+
controller.current?.abort();
|
|
86
|
+
controller.current = null;
|
|
87
|
+
}, []);
|
|
88
|
+
useEffect(() => {
|
|
89
|
+
mounted.current = true;
|
|
90
|
+
return () => {
|
|
91
|
+
mounted.current = false;
|
|
92
|
+
abort();
|
|
93
|
+
};
|
|
94
|
+
}, [abort]);
|
|
95
|
+
const run = useCallback(async (input) => {
|
|
96
|
+
abort();
|
|
97
|
+
const mine = generation.current;
|
|
98
|
+
const signal = new AbortController;
|
|
99
|
+
controller.current = signal;
|
|
100
|
+
setState(PENDING);
|
|
101
|
+
try {
|
|
102
|
+
const value = await operation(input, { signal: signal.signal });
|
|
103
|
+
if (generation.current !== mine || !mounted.current) {
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
setState({ status: "ok", value });
|
|
107
|
+
return value;
|
|
108
|
+
} catch (error) {
|
|
109
|
+
if (generation.current !== mine || !mounted.current) {
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
if (error instanceof QgisSdkBridgeAbortedError2) {
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
setState({
|
|
116
|
+
status: "error",
|
|
117
|
+
error: error instanceof Error ? error : new Error(String(error))
|
|
118
|
+
});
|
|
119
|
+
return;
|
|
120
|
+
} finally {
|
|
121
|
+
if (controller.current === signal) {
|
|
122
|
+
controller.current = null;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}, [operation, abort]);
|
|
126
|
+
const reset = useCallback(() => {
|
|
127
|
+
abort();
|
|
128
|
+
setState(IDLE);
|
|
129
|
+
}, [abort]);
|
|
130
|
+
const controls = useMemo(() => ({ abort, reset }), [abort, reset]);
|
|
131
|
+
return [state, run, controls];
|
|
132
|
+
}
|
|
133
|
+
var IDLE_STREAM = Object.freeze({
|
|
134
|
+
status: "idle",
|
|
135
|
+
lastEvent: null,
|
|
136
|
+
terminal: null,
|
|
137
|
+
error: null
|
|
138
|
+
});
|
|
139
|
+
function stableKey(value) {
|
|
140
|
+
return JSON.stringify(value, (_key, item) => isPlainRecord(item) ? Object.fromEntries(Object.entries(item).sort(([a], [b]) => a < b ? -1 : a > b ? 1 : 0)) : item);
|
|
141
|
+
}
|
|
142
|
+
function useStream(open, input, handlers = {}) {
|
|
143
|
+
const [state, setState] = useState(IDLE_STREAM);
|
|
144
|
+
const latest = useRef(handlers);
|
|
145
|
+
latest.current = handlers;
|
|
146
|
+
const key = input === null ? null : stableKey(input);
|
|
147
|
+
const inputRef = useRef(input);
|
|
148
|
+
inputRef.current = input;
|
|
149
|
+
useEffect(() => {
|
|
150
|
+
if (key === null) {
|
|
151
|
+
setState(IDLE_STREAM);
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
const current = inputRef.current;
|
|
155
|
+
let cancelled = false;
|
|
156
|
+
let handle = null;
|
|
157
|
+
setState({
|
|
158
|
+
status: "opening",
|
|
159
|
+
lastEvent: null,
|
|
160
|
+
terminal: null,
|
|
161
|
+
error: null
|
|
162
|
+
});
|
|
163
|
+
open(current, {
|
|
164
|
+
onEvent: (event) => {
|
|
165
|
+
if (cancelled) {
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
latest.current.onEvent?.(event);
|
|
169
|
+
setState((previous) => ({ ...previous, lastEvent: event }));
|
|
170
|
+
},
|
|
171
|
+
onTerminal: (terminal) => {
|
|
172
|
+
if (cancelled) {
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
latest.current.onTerminal?.(terminal);
|
|
176
|
+
setState((previous) => ({ ...previous, status: "ended", terminal }));
|
|
177
|
+
}
|
|
178
|
+
}).then((opened) => {
|
|
179
|
+
if (cancelled) {
|
|
180
|
+
opened.close();
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
handle = opened;
|
|
184
|
+
setState((previous) => previous.status === "ended" ? previous : { ...previous, status: "open" });
|
|
185
|
+
}, (error) => {
|
|
186
|
+
if (cancelled) {
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
setState({
|
|
190
|
+
status: "failed",
|
|
191
|
+
lastEvent: null,
|
|
192
|
+
terminal: null,
|
|
193
|
+
error: error instanceof Error ? error : new Error(String(error))
|
|
194
|
+
});
|
|
195
|
+
});
|
|
196
|
+
return () => {
|
|
197
|
+
cancelled = true;
|
|
198
|
+
handle?.close();
|
|
199
|
+
};
|
|
200
|
+
}, [open, key]);
|
|
201
|
+
return state;
|
|
202
|
+
}
|
|
203
|
+
export {
|
|
204
|
+
BridgeProvider,
|
|
205
|
+
QgisSdkBridgeReactError,
|
|
206
|
+
useBridgeClient,
|
|
207
|
+
useOperation,
|
|
208
|
+
useOperations,
|
|
209
|
+
useQgisSdk,
|
|
210
|
+
useStream
|
|
211
|
+
};
|
|
212
|
+
|
|
213
|
+
//# debugId=0FA8371D474034FF64756E2164756E21
|
|
214
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL3JlYWN0LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgIi8qKlxuICogVGhpbiBSZWFjdCBiaW5kaW5ncyBvdmVyIHRoZSBicmlkZ2UgY2xpZW50IChUQVNLLTE4LCBkZWNpc2lvbi0xOCkuXG4gKlxuICogVGhpcyBlbnRyeSBwb2ludCBpcyBvcHRpb25hbCBhbmQgaXMgdGhlIG9ubHkgb25lIHRoYXQgaW1wb3J0cyBSZWFjdC4gSXQgYWRkc1xuICogbm8gc2Vjb25kIGNsaWVudDogYSBjb21wb25lbnQgcmVhY2hlcyB0aGUgc2FtZSBgUWdpc1Nka2Agb3IgYEJyaWRnZUNsaWVudGAgYVxuICogdmFuaWxsYSBwYWdlIHdvdWxkIGJ1aWxkLCB0aHJvdWdoIGEgcHJvdmlkZXIgdGhhdCBpcyBoYW5kZWQgYSBgUWdpc1Nka2BcbiAqIChhbmQgbGVhdmVzIGl0IGFsb25lKSwgaXMgaGFuZGVkIGEgY2xpZW50IChzYW1lKSwgb3Igb3ducyBhIGNsaWVudCBidWlsdCBvblxuICogYSB0cmFuc3BvcnQgKGFuZCBjbG9zZXMgaXQgb24gdW5tb3VudCkuIFRoZSBob29rcyB0YWtlIHRoZSBtZXRob2RzIGFcbiAqIGBRZ2lzU2RrYCBhbHJlYWR5IGhhcyAtIGBxZ2lzLnNpdGVzLnN1bW1hcnlgLCBgcWdpcy5zaXRlcy53YXRjaGAgLSBzb1xuICogdGhlIHR5cGVkIGNvbnRyYWN0IGlzIHRoZSBnZW5lcmF0ZWQgb25lLCBub3QgYSBSZWFjdCBjb3B5IG9mIGl0LlxuICpcbiAqIFdoYXQgdGhlIGhvb2tzIGFkZCBpcyBsaWZldGltZTogYSBjYWxsIGFib3J0ZWQgd2hlbiBpdHMgY29tcG9uZW50IHVubW91bnRzLFxuICogYSBzdGFsZSByZXBseSBpZ25vcmVkLCBhIHN0cmVhbSBjbG9zZWQgb24gdW5tb3VudCBvciB3aGVuIGl0cyBpbnB1dCBjaGFuZ2VzLFxuICogYW5kIGEgc2ltdWxhdGVkIFN0cmljdE1vZGUgcmVtb3VudCB0aGF0IGxlYXZlcyBleGFjdGx5IG9uZSBvZiBlYWNoLlxuICovXG5cbmltcG9ydCB7XG5cdGNyZWF0ZUNvbnRleHQsXG5cdGNyZWF0ZUVsZW1lbnQsXG5cdHR5cGUgUmVhY3RFbGVtZW50LFxuXHR0eXBlIFJlYWN0Tm9kZSxcblx0dXNlQ2FsbGJhY2ssXG5cdHVzZUNvbnRleHQsXG5cdHVzZUVmZmVjdCxcblx0dXNlTWVtbyxcblx0dXNlUmVmLFxuXHR1c2VTdGF0ZSxcbn0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQge1xuXHRCcmlkZ2VDbGllbnQsXG5cdHR5cGUgQnJpZGdlQ2xpZW50T3B0aW9ucyxcblx0UWdpc1Nka0JyaWRnZUFib3J0ZWRFcnJvcixcblx0dHlwZSBXaXJlVHJhbnNwb3J0LFxufSBmcm9tIFwiLi9icmlkZ2VcIjtcbmltcG9ydCB7IFFnaXNTZGtFcnJvciB9IGZyb20gXCIuL2Vycm9yc1wiO1xuaW1wb3J0IHsgaXNQbGFpblJlY29yZCB9IGZyb20gXCIuL2ludGVybmFsXCI7XG5pbXBvcnQgdHlwZSB7IFFnaXNTZGssIFFnaXNTZGtDb3JlIH0gZnJvbSBcIi4vcWdpcy1zZGtcIjtcbmltcG9ydCB0eXBlIHsgT3BlcmF0aW9uTWFwLCBTdHJlYW1NYXAgfSBmcm9tIFwiLi9zY2hlbWFcIjtcblxuLyoqIEEgaG9vayBvciBwcm92aWRlciB3YXMgdXNlZCBvdXRzaWRlIHRoZSBzaGFwZSBpdCBuZWVkcy4gKi9cbmV4cG9ydCBjbGFzcyBRZ2lzU2RrQnJpZGdlUmVhY3RFcnJvciBleHRlbmRzIFFnaXNTZGtFcnJvciB7XG5cdHB1YmxpYyBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcblx0XHRzdXBlcihtZXNzYWdlLCBcInJlYWN0X2JpbmRpbmdcIik7XG5cdH1cbn1cblxuaW50ZXJmYWNlIFNoYXJlZCB7XG5cdHJlYWRvbmx5IGNsaWVudDogQnJpZGdlQ2xpZW50O1xuXHRyZWFkb25seSBxZ2lzOiBRZ2lzU2RrQ29yZTx1bmtub3duLCB1bmtub3duPiB8IG51bGw7XG59XG5cbmNvbnN0IENsaWVudENvbnRleHQgPSBjcmVhdGVDb250ZXh0PFNoYXJlZCB8IG51bGw+KG51bGwpO1xuXG4vKiogUHJvcHMgZm9yIHtAbGluayBCcmlkZ2VQcm92aWRlcn06IGV4YWN0bHkgb25lIG9mIGBxZ2lzYCwgYGNsaWVudGAgb3IgYHRyYW5zcG9ydGAuICovXG5leHBvcnQgaW50ZXJmYWNlIEJyaWRnZVByb3ZpZGVyUHJvcHMge1xuXHQvKipcblx0ICogQSBgUWdpc1Nka2AgdGhlIHBhZ2UgYnVpbHQsIHdoYXRldmVyIGl0cyBzY2hlbWE7IHRoZSBwcm92aWRlciBzaGFyZXMgaXRcblx0ICogYW5kIG5ldmVyIGNsb3NlcyBpdC4gYHVzZVFnaXNTZGtgIGhhbmRzIGl0IGJhY2sgdW5kZXIgdGhlIHBhZ2UncyB0eXBlcy5cblx0ICovXG5cdHJlYWRvbmx5IHFnaXM/OiBRZ2lzU2RrQ29yZTx1bmtub3duLCB1bmtub3duPjtcblx0LyoqIEEgY2xpZW50IHRoZSBjYWxsZXIgb3duczsgdGhlIHByb3ZpZGVyIG5ldmVyIGNsb3NlcyBpdC4gKi9cblx0cmVhZG9ubHkgY2xpZW50PzogQnJpZGdlQ2xpZW50O1xuXHQvKiogQSB0cmFuc3BvcnQgdGhlIHByb3ZpZGVyIGJ1aWxkcyBhbmQgb3ducyBhIGNsaWVudCBmb3IuICovXG5cdHJlYWRvbmx5IHRyYW5zcG9ydD86IFdpcmVUcmFuc3BvcnQ7XG5cdC8qKiBPcHRpb25zIGZvciB0aGUgb3duZWQgY2xpZW50OyBpZ25vcmVkIHdoZW4gYGNsaWVudGAgaXMgZ2l2ZW4uICovXG5cdHJlYWRvbmx5IG9wdGlvbnM/OiBCcmlkZ2VDbGllbnRPcHRpb25zO1xuXHRyZWFkb25seSBjaGlsZHJlbj86IFJlYWN0Tm9kZTtcbn1cblxuLyoqXG4gKiBTaGFyZSBvbmUgY2xpZW50IHdpdGggYSBzdWJ0cmVlLlxuICpcbiAqIEFuIG93bmVkIGNsaWVudCBpcyBjcmVhdGVkIGluIGFuIGVmZmVjdCwgbmV2ZXIgZHVyaW5nIHJlbmRlciwgYmVjYXVzZVxuICogU3RyaWN0TW9kZSByZW5kZXJzIHR3aWNlIGFuZCBhIGNsaWVudCBtYWRlIGluIHJlbmRlciB3b3VsZCBsZWF2ZSBhIHNlY29uZFxuICogbGlzdGVuZXIgb24gdGhlIHRyYW5zcG9ydC4gVW50aWwgdGhhdCBlZmZlY3QgaGFzIHJ1biB0aGUgc3VidHJlZSBpcyBub3RcbiAqIHJlbmRlcmVkLCB3aGljaCBpcyBvbmUgdGljay4gU3RyaWN0TW9kZSdzIHNpbXVsYXRlZCB1bm1vdW50IGNsb3NlcyB0aGVcbiAqIG93bmVkIGNsaWVudCBhbmQgdGhlIGVmZmVjdCB0aGF0IGZvbGxvd3MgbWFrZXMgYSBuZXcgb25lLCBzbyB0aGUgc3VidHJlZVxuICogbmV2ZXIgaG9sZHMgYSBkZWFkIGNsaWVudC4gVGhlIHRyYW5zcG9ydCBtdXN0IGJlIHN0YWJsZSBhY3Jvc3MgcmVuZGVyczsgdG9cbiAqIHN3YXAgaXQsIGNoYW5nZSB0aGUgcHJvdmlkZXIncyBga2V5YC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEJyaWRnZVByb3ZpZGVyKHByb3BzOiBCcmlkZ2VQcm92aWRlclByb3BzKTogUmVhY3RFbGVtZW50IHtcblx0Y29uc3QgeyBxZ2lzLCBjbGllbnQsIHRyYW5zcG9ydCwgb3B0aW9ucywgY2hpbGRyZW4gfSA9IHByb3BzO1xuXHRjb25zdCBnaXZlbiA9IFtxZ2lzLCBjbGllbnQsIHRyYW5zcG9ydF0uZmlsdGVyKFxuXHRcdChzb3VyY2UpID0+IHNvdXJjZSAhPT0gdW5kZWZpbmVkLFxuXHQpLmxlbmd0aDtcblx0aWYgKGdpdmVuICE9PSAxKSB7XG5cdFx0dGhyb3cgbmV3IFFnaXNTZGtCcmlkZ2VSZWFjdEVycm9yKFxuXHRcdFx0XCJCcmlkZ2VQcm92aWRlciBuZWVkcyBleGFjdGx5IG9uZSBvZiBxZ2lzLCBjbGllbnQgb3IgdHJhbnNwb3J0XCIsXG5cdFx0KTtcblx0fVxuXHRjb25zdCB0aW1lb3V0TXMgPSBvcHRpb25zPy50aW1lb3V0TXM7XG5cdGNvbnN0IFtvd25lZCwgc2V0T3duZWRdID0gdXNlU3RhdGU8QnJpZGdlQ2xpZW50IHwgbnVsbD4obnVsbCk7XG5cdHVzZUVmZmVjdCgoKSA9PiB7XG5cdFx0aWYgKHRyYW5zcG9ydCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRjb25zdCBsaXZlID0gbmV3IEJyaWRnZUNsaWVudChcblx0XHRcdHRyYW5zcG9ydCxcblx0XHRcdHRpbWVvdXRNcyA9PT0gdW5kZWZpbmVkID8ge30gOiB7IHRpbWVvdXRNcyB9LFxuXHRcdCk7XG5cdFx0c2V0T3duZWQobGl2ZSk7XG5cdFx0cmV0dXJuICgpID0+IHtcblx0XHRcdGxpdmUuY2xvc2UoKTtcblx0XHRcdHNldE93bmVkKChjdXJyZW50KSA9PiAoY3VycmVudCA9PT0gbGl2ZSA/IG51bGwgOiBjdXJyZW50KSk7XG5cdFx0fTtcblx0fSwgW3RyYW5zcG9ydCwgdGltZW91dE1zXSk7XG5cdGNvbnN0IHZhbHVlID0gdXNlTWVtbygoKTogU2hhcmVkIHwgbnVsbCA9PiB7XG5cdFx0aWYgKHFnaXMgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHsgY2xpZW50OiBxZ2lzLmNsaWVudCwgcWdpcyB9O1xuXHRcdH1cblx0XHRjb25zdCBsaXZlID0gY2xpZW50ID8/IG93bmVkO1xuXHRcdHJldHVybiBsaXZlID09PSBudWxsID8gbnVsbCA6IHsgY2xpZW50OiBsaXZlLCBxZ2lzOiBudWxsIH07XG5cdH0sIFtxZ2lzLCBjbGllbnQsIG93bmVkXSk7XG5cdHJldHVybiBjcmVhdGVFbGVtZW50KFxuXHRcdENsaWVudENvbnRleHQuUHJvdmlkZXIsXG5cdFx0eyB2YWx1ZSB9LFxuXHRcdHZhbHVlID09PSBudWxsID8gbnVsbCA6IGNoaWxkcmVuLFxuXHQpO1xufVxuXG5mdW5jdGlvbiB1c2VTaGFyZWQoaG9vazogc3RyaW5nKTogU2hhcmVkIHtcblx0Y29uc3Qgc2hhcmVkID0gdXNlQ29udGV4dChDbGllbnRDb250ZXh0KTtcblx0aWYgKHNoYXJlZCA9PT0gbnVsbCkge1xuXHRcdHRocm93IG5ldyBRZ2lzU2RrQnJpZGdlUmVhY3RFcnJvcihcblx0XHRcdGAke2hvb2t9IG5lZWRzIGEgQnJpZGdlUHJvdmlkZXIgYWJvdmUgaXRgLFxuXHRcdCk7XG5cdH1cblx0cmV0dXJuIHNoYXJlZDtcbn1cblxuLyoqIFRoZSBjbGllbnQgb2YgdGhlIG5lYXJlc3Qge0BsaW5rIEJyaWRnZVByb3ZpZGVyfS4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VCcmlkZ2VDbGllbnQoKTogQnJpZGdlQ2xpZW50IHtcblx0cmV0dXJuIHVzZVNoYXJlZChcInVzZUJyaWRnZUNsaWVudFwiKS5jbGllbnQ7XG59XG5cbi8qKlxuICogVGhlIGBRZ2lzU2RrYCBvZiB0aGUgbmVhcmVzdCB7QGxpbmsgQnJpZGdlUHJvdmlkZXJ9LlxuICpcbiAqIFRoZSB0eXBlIHBhcmFtZXRlcnMgbmFtZSB0aGUgZ2VuZXJhdGVkIGBPcGVyYXRpb25zYCBhbmQgYFN0cmVhbXNgOyB0aGV5IGFyZVxuICogdGhlIGNhbGxlcidzIGNsYWltLCB0aGUgc2FtZSB3YXkgdGhlIHByb3ZpZGVyJ3MgYHFnaXNgIHByb3Agd2FzIHRoZSBwYWdlJ3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VRZ2lzU2RrPE8gPSBPcGVyYXRpb25NYXAsIFMgPSBTdHJlYW1NYXA+KCk6IFFnaXNTZGs8TywgUz4ge1xuXHRjb25zdCBzaGFyZWQgPSB1c2VTaGFyZWQoXCJ1c2VRZ2lzU2RrXCIpO1xuXHRpZiAoc2hhcmVkLnFnaXMgPT09IG51bGwpIHtcblx0XHR0aHJvdyBuZXcgUWdpc1Nka0JyaWRnZVJlYWN0RXJyb3IoXG5cdFx0XHRcInVzZVFnaXNTZGsgbmVlZHMgYSBCcmlkZ2VQcm92aWRlciBnaXZlbiBhIHFnaXMgaW5zdGFuY2VcIixcblx0XHQpO1xuXHR9XG5cdHJldHVybiBzaGFyZWQucWdpcyBhcyB1bmtub3duIGFzIFFnaXNTZGs8TywgUz47XG59XG5cbi8qKlxuICogQnVpbGQgYSBnZW5lcmF0ZWQgb3BlcmF0aW9uIG1hcCBvbmNlIHBlciBjbGllbnQ6IGB1c2VPcGVyYXRpb25zKGNyZWF0ZU9wZXJhdGlvbnMpYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZU9wZXJhdGlvbnM8VD4oY3JlYXRlOiAoY2xpZW50OiBCcmlkZ2VDbGllbnQpID0+IFQpOiBUIHtcblx0Y29uc3QgY2xpZW50ID0gdXNlQnJpZGdlQ2xpZW50KCk7XG5cdHJldHVybiB1c2VNZW1vKCgpID0+IGNyZWF0ZShjbGllbnQpLCBbY3JlYXRlLCBjbGllbnRdKTtcbn1cblxuLyoqIFdoZXJlIG9uZSBpbnZvY2F0aW9uIHN0YW5kcy4gKi9cbmV4cG9ydCB0eXBlIE9wZXJhdGlvblN0YXRlPFI+ID1cblx0fCB7IHJlYWRvbmx5IHN0YXR1czogXCJpZGxlXCIgfVxuXHR8IHsgcmVhZG9ubHkgc3RhdHVzOiBcInBlbmRpbmdcIiB9XG5cdHwgeyByZWFkb25seSBzdGF0dXM6IFwib2tcIjsgcmVhZG9ubHkgdmFsdWU6IFIgfVxuXHR8IHsgcmVhZG9ubHkgc3RhdHVzOiBcImVycm9yXCI7IHJlYWRvbmx5IGVycm9yOiBFcnJvciB9O1xuXG4vKiogQ29udHJvbHMgYmV5b25kIHJ1bm5pbmc6IGFib3J0IHdoYXQgaXMgaW4gZmxpZ2h0LCBvciBmb3JnZXQgdGhlIG91dGNvbWUuICovXG5leHBvcnQgaW50ZXJmYWNlIE9wZXJhdGlvbkNvbnRyb2xzIHtcblx0LyoqIEFib3J0IHRoZSBpbi1mbGlnaHQgY2FsbCBsb2NhbGx5OyB0aGUgaG9zdCBtYXkgc3RpbGwgcnVuIGl0LiAqL1xuXHRhYm9ydCgpOiB2b2lkO1xuXHQvKiogQmFjayB0byBgaWRsZWAsIGFib3J0aW5nIGFueXRoaW5nIGluIGZsaWdodC4gKi9cblx0cmVzZXQoKTogdm9pZDtcbn1cblxuLyoqIEFuIG9wZXJhdGlvbiBtZW1iZXIgb2YgYSBnZW5lcmF0ZWQgbWFwOiBpbnB1dCwgb3B0aW9uYWwgc2lnbmFsLCBwcm9taXNlLiAqL1xuZXhwb3J0IHR5cGUgT3BlcmF0aW9uPEksIFI+ID0gKFxuXHRpbnB1dDogSSxcblx0b3B0aW9ucz86IHsgcmVhZG9ubHkgc2lnbmFsPzogQWJvcnRTaWduYWwgfSxcbikgPT4gUHJvbWlzZTxSPjtcblxuY29uc3QgSURMRTogT3BlcmF0aW9uU3RhdGU8bmV2ZXI+ID0gT2JqZWN0LmZyZWV6ZSh7IHN0YXR1czogXCJpZGxlXCIgfSk7XG5jb25zdCBQRU5ESU5HOiBPcGVyYXRpb25TdGF0ZTxuZXZlcj4gPSBPYmplY3QuZnJlZXplKHsgc3RhdHVzOiBcInBlbmRpbmdcIiB9KTtcblxuLyoqXG4gKiBSdW4gYSBnZW5lcmF0ZWQgb3BlcmF0aW9uIGZyb20gYSBjb21wb25lbnQuXG4gKlxuICogYHJ1bmAgcmVzb2x2ZXMgd2l0aCB0aGUgdmFsdWUsIG9yIHdpdGggYHVuZGVmaW5lZGAgd2hlbiB0aGUgY2FsbCBmYWlsZWQsIHdhc1xuICogYWJvcnRlZCBvciB3YXMgc3VwZXJzZWRlZCBieSBhIGxhdGVyIHJ1biAtIHRoZSBzdGF0ZSBjYXJyaWVzIHRoZSBlcnJvciwgc29cbiAqIHRoZSBwcm9taXNlIG5ldmVyIHJlamVjdHMgaW50byBhbiBldmVudCBoYW5kbGVyLiBPbmx5IHRoZSBsYXRlc3QgcnVuIGNhblxuICogY2hhbmdlIHRoZSBzdGF0ZTsgdW5tb3VudGluZyBhYm9ydHMgd2hhdGV2ZXIgaXMgaW4gZmxpZ2h0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlT3BlcmF0aW9uPEksIFI+KFxuXHRvcGVyYXRpb246IE9wZXJhdGlvbjxJLCBSPixcbik6IHJlYWRvbmx5IFtcblx0T3BlcmF0aW9uU3RhdGU8Uj4sXG5cdChpbnB1dDogSSkgPT4gUHJvbWlzZTxSIHwgdW5kZWZpbmVkPixcblx0T3BlcmF0aW9uQ29udHJvbHMsXG5dIHtcblx0Y29uc3QgW3N0YXRlLCBzZXRTdGF0ZV0gPSB1c2VTdGF0ZTxPcGVyYXRpb25TdGF0ZTxSPj4oSURMRSk7XG5cdGNvbnN0IGdlbmVyYXRpb24gPSB1c2VSZWYoMCk7XG5cdGNvbnN0IGNvbnRyb2xsZXIgPSB1c2VSZWY8QWJvcnRDb250cm9sbGVyIHwgbnVsbD4obnVsbCk7XG5cdGNvbnN0IG1vdW50ZWQgPSB1c2VSZWYodHJ1ZSk7XG5cblx0Y29uc3QgYWJvcnQgPSB1c2VDYWxsYmFjaygoKTogdm9pZCA9PiB7XG5cdFx0Z2VuZXJhdGlvbi5jdXJyZW50ICs9IDE7XG5cdFx0Y29udHJvbGxlci5jdXJyZW50Py5hYm9ydCgpO1xuXHRcdGNvbnRyb2xsZXIuY3VycmVudCA9IG51bGw7XG5cdH0sIFtdKTtcblxuXHR1c2VFZmZlY3QoKCkgPT4ge1xuXHRcdG1vdW50ZWQuY3VycmVudCA9IHRydWU7XG5cdFx0cmV0dXJuICgpID0+IHtcblx0XHRcdG1vdW50ZWQuY3VycmVudCA9IGZhbHNlO1xuXHRcdFx0YWJvcnQoKTtcblx0XHR9O1xuXHR9LCBbYWJvcnRdKTtcblxuXHRjb25zdCBydW4gPSB1c2VDYWxsYmFjayhcblx0XHRhc3luYyAoaW5wdXQ6IEkpOiBQcm9taXNlPFIgfCB1bmRlZmluZWQ+ID0+IHtcblx0XHRcdGFib3J0KCk7XG5cdFx0XHRjb25zdCBtaW5lID0gZ2VuZXJhdGlvbi5jdXJyZW50O1xuXHRcdFx0Y29uc3Qgc2lnbmFsID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXHRcdFx0Y29udHJvbGxlci5jdXJyZW50ID0gc2lnbmFsO1xuXHRcdFx0c2V0U3RhdGUoUEVORElORyk7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRjb25zdCB2YWx1ZSA9IGF3YWl0IG9wZXJhdGlvbihpbnB1dCwgeyBzaWduYWw6IHNpZ25hbC5zaWduYWwgfSk7XG5cdFx0XHRcdGlmIChnZW5lcmF0aW9uLmN1cnJlbnQgIT09IG1pbmUgfHwgIW1vdW50ZWQuY3VycmVudCkge1xuXHRcdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0c2V0U3RhdGUoeyBzdGF0dXM6IFwib2tcIiwgdmFsdWUgfSk7XG5cdFx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdGlmIChnZW5lcmF0aW9uLmN1cnJlbnQgIT09IG1pbmUgfHwgIW1vdW50ZWQuY3VycmVudCkge1xuXHRcdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKGVycm9yIGluc3RhbmNlb2YgUWdpc1Nka0JyaWRnZUFib3J0ZWRFcnJvcikge1xuXHRcdFx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0c2V0U3RhdGUoe1xuXHRcdFx0XHRcdHN0YXR1czogXCJlcnJvclwiLFxuXHRcdFx0XHRcdGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoU3RyaW5nKGVycm9yKSksXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0fSBmaW5hbGx5IHtcblx0XHRcdFx0aWYgKGNvbnRyb2xsZXIuY3VycmVudCA9PT0gc2lnbmFsKSB7XG5cdFx0XHRcdFx0Y29udHJvbGxlci5jdXJyZW50ID0gbnVsbDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0W29wZXJhdGlvbiwgYWJvcnRdLFxuXHQpO1xuXG5cdGNvbnN0IHJlc2V0ID0gdXNlQ2FsbGJhY2soKCk6IHZvaWQgPT4ge1xuXHRcdGFib3J0KCk7XG5cdFx0c2V0U3RhdGUoSURMRSk7XG5cdH0sIFthYm9ydF0pO1xuXG5cdGNvbnN0IGNvbnRyb2xzID0gdXNlTWVtbygoKSA9PiAoeyBhYm9ydCwgcmVzZXQgfSksIFthYm9ydCwgcmVzZXRdKTtcblx0cmV0dXJuIFtzdGF0ZSwgcnVuLCBjb250cm9sc107XG59XG5cbi8qKiBIb3cgYSBzdHJlYW0gZW5kZWQsIGFzIHRoZSBnZW5lcmF0ZWQgbW9kdWxlIHJlcG9ydHMgaXQuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0cmVhbVRlcm1pbmFsTGlrZSB7XG5cdHJlYWRvbmx5IGtpbmQ6IHN0cmluZztcblx0cmVhZG9ubHkgbWVzc2FnZT86IHN0cmluZztcblx0cmVhZG9ubHkgZHJvcHBlZD86IG51bWJlcjtcbn1cblxuLyoqIFRoZSBoYW5kbGUgYSBnZW5lcmF0ZWQgc3RyZWFtIG1lbWJlciByZXNvbHZlcyB3aXRoLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdHJlYW1IYW5kbGVMaWtlIHtcblx0cmVhZG9ubHkgaWQ6IHN0cmluZztcblx0cmVhZG9ubHkgY2xvc2VkOiBib29sZWFuO1xuXHRjbG9zZSgpOiB2b2lkO1xufVxuXG4vKiogSGFuZGxlcnMgZm9yIGEgc3RyZWFtLCBhcyBhIGdlbmVyYXRlZCBtb2R1bGUgdHlwZXMgdGhlbS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RyZWFtSGFuZGxlcnNMaWtlPEU+IHtcblx0cmVhZG9ubHkgb25FdmVudD86IChldmVudDogRSkgPT4gdm9pZDtcblx0cmVhZG9ubHkgb25UZXJtaW5hbD86ICh0ZXJtaW5hbDogU3RyZWFtVGVybWluYWxMaWtlKSA9PiB2b2lkO1xufVxuXG4vKiogQSBzdHJlYW0gbWVtYmVyIG9mIGEgZ2VuZXJhdGVkIG1hcC4gKi9cbmV4cG9ydCB0eXBlIFN0cmVhbTxJLCBFPiA9IChcblx0aW5wdXQ6IEksXG5cdGhhbmRsZXJzOiBTdHJlYW1IYW5kbGVyc0xpa2U8RT4sXG5cdG9wdGlvbnM/OiB7IHJlYWRvbmx5IHNpZ25hbD86IEFib3J0U2lnbmFsIH0sXG4pID0+IFByb21pc2U8U3RyZWFtSGFuZGxlTGlrZT47XG5cbi8qKiBXaGVyZSBvbmUgc3Vic2NyaXB0aW9uIHN0YW5kcy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RyZWFtU3RhdGU8RT4ge1xuXHQvKiogYGlkbGVgIHdpdGggYSBudWxsIGlucHV0LCBgZmFpbGVkYCB3aGVuIHRoZSBob3N0IHJlZnVzZWQgdG8gb3BlbiBpdC4gKi9cblx0cmVhZG9ubHkgc3RhdHVzOiBcImlkbGVcIiB8IFwib3BlbmluZ1wiIHwgXCJvcGVuXCIgfCBcImVuZGVkXCIgfCBcImZhaWxlZFwiO1xuXHRyZWFkb25seSBsYXN0RXZlbnQ6IEUgfCBudWxsO1xuXHRyZWFkb25seSB0ZXJtaW5hbDogU3RyZWFtVGVybWluYWxMaWtlIHwgbnVsbDtcblx0cmVhZG9ubHkgZXJyb3I6IEVycm9yIHwgbnVsbDtcbn1cblxuY29uc3QgSURMRV9TVFJFQU06IFN0cmVhbVN0YXRlPG5ldmVyPiA9IE9iamVjdC5mcmVlemUoe1xuXHRzdGF0dXM6IFwiaWRsZVwiLFxuXHRsYXN0RXZlbnQ6IG51bGwsXG5cdHRlcm1pbmFsOiBudWxsLFxuXHRlcnJvcjogbnVsbCxcbn0pO1xuXG5mdW5jdGlvbiBzdGFibGVLZXkodmFsdWU6IHVua25vd24pOiBzdHJpbmcge1xuXHRyZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUsIChfa2V5LCBpdGVtOiB1bmtub3duKSA9PlxuXHRcdGlzUGxhaW5SZWNvcmQoaXRlbSlcblx0XHRcdD8gT2JqZWN0LmZyb21FbnRyaWVzKFxuXHRcdFx0XHRcdE9iamVjdC5lbnRyaWVzKGl0ZW0pLnNvcnQoKFthXSwgW2JdKSA9PiAoYSA8IGIgPyAtMSA6IGEgPiBiID8gMSA6IDApKSxcblx0XHRcdFx0KVxuXHRcdFx0OiBpdGVtLFxuXHQpO1xufVxuXG4vKipcbiAqIEhvbGQgYSBnZW5lcmF0ZWQgc3RyZWFtIG9wZW4gd2hpbGUgYSBjb21wb25lbnQgaXMgbW91bnRlZC5cbiAqXG4gKiBUaGUgc3Vic2NyaXB0aW9uIGZvbGxvd3MgYG9wZW5gIGFuZCB0aGUgKmNvbnRlbnQqIG9mIGBpbnB1dGA6IGEgbmV3IG9iamVjdFxuICogd2l0aCB0aGUgc2FtZSBmaWVsZHMgZG9lcyBub3QgcmVvcGVuIGl0LCBhIGRpZmZlcmVudCBvbmUgY2xvc2VzIHRoZSBvbGRcbiAqIHN0cmVhbSBhbmQgb3BlbnMgYSBuZXcgb25lLCBhbmQgYG51bGxgIGNsb3NlcyBpdC4gSGFuZGxlcnMgYXJlIHJlYWQgZnJlc2hcbiAqIG9uIGV2ZXJ5IGZyYW1lLCBzbyBhIG5ldyBjbG9zdXJlIGRvZXMgbm90IHJlb3BlbiBhbnl0aGluZyBlaXRoZXIuIFVubW91bnRcbiAqIGNsb3NlcyB0aGUgc3RyZWFtLCBldmVuIGlmIHRoZSBob3N0IGhhcyBub3QgeWV0IGFja25vd2xlZGdlZCBpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVN0cmVhbTxJLCBFPihcblx0b3BlbjogU3RyZWFtPEksIEU+LFxuXHRpbnB1dDogSSB8IG51bGwsXG5cdGhhbmRsZXJzOiBTdHJlYW1IYW5kbGVyc0xpa2U8RT4gPSB7fSxcbik6IFN0cmVhbVN0YXRlPEU+IHtcblx0Y29uc3QgW3N0YXRlLCBzZXRTdGF0ZV0gPSB1c2VTdGF0ZTxTdHJlYW1TdGF0ZTxFPj4oSURMRV9TVFJFQU0pO1xuXHRjb25zdCBsYXRlc3QgPSB1c2VSZWYoaGFuZGxlcnMpO1xuXHRsYXRlc3QuY3VycmVudCA9IGhhbmRsZXJzO1xuXHRjb25zdCBrZXkgPSBpbnB1dCA9PT0gbnVsbCA/IG51bGwgOiBzdGFibGVLZXkoaW5wdXQpO1xuXHQvLyBgaW5wdXRgIGlzIGRlbGliZXJhdGVseSByZWFkIHRocm91Z2ggYGtleWA6IHR3byBvYmplY3RzIHdpdGggdGhlIHNhbWVcblx0Ly8gZmllbGRzIGFyZSB0aGUgc2FtZSBzdWJzY3JpcHRpb24uXG5cdGNvbnN0IGlucHV0UmVmID0gdXNlUmVmKGlucHV0KTtcblx0aW5wdXRSZWYuY3VycmVudCA9IGlucHV0O1xuXG5cdHVzZUVmZmVjdCgoKSA9PiB7XG5cdFx0aWYgKGtleSA9PT0gbnVsbCkge1xuXHRcdFx0c2V0U3RhdGUoSURMRV9TVFJFQU0pO1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0Y29uc3QgY3VycmVudCA9IGlucHV0UmVmLmN1cnJlbnQgYXMgSTtcblx0XHRsZXQgY2FuY2VsbGVkID0gZmFsc2U7XG5cdFx0bGV0IGhhbmRsZTogU3RyZWFtSGFuZGxlTGlrZSB8IG51bGwgPSBudWxsO1xuXHRcdHNldFN0YXRlKHtcblx0XHRcdHN0YXR1czogXCJvcGVuaW5nXCIsXG5cdFx0XHRsYXN0RXZlbnQ6IG51bGwsXG5cdFx0XHR0ZXJtaW5hbDogbnVsbCxcblx0XHRcdGVycm9yOiBudWxsLFxuXHRcdH0pO1xuXHRcdG9wZW4oY3VycmVudCwge1xuXHRcdFx0b25FdmVudDogKGV2ZW50KSA9PiB7XG5cdFx0XHRcdGlmIChjYW5jZWxsZWQpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0bGF0ZXN0LmN1cnJlbnQub25FdmVudD8uKGV2ZW50KTtcblx0XHRcdFx0c2V0U3RhdGUoKHByZXZpb3VzKSA9PiAoeyAuLi5wcmV2aW91cywgbGFzdEV2ZW50OiBldmVudCB9KSk7XG5cdFx0XHR9LFxuXHRcdFx0b25UZXJtaW5hbDogKHRlcm1pbmFsKSA9PiB7XG5cdFx0XHRcdGlmIChjYW5jZWxsZWQpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0bGF0ZXN0LmN1cnJlbnQub25UZXJtaW5hbD8uKHRlcm1pbmFsKTtcblx0XHRcdFx0c2V0U3RhdGUoKHByZXZpb3VzKSA9PiAoeyAuLi5wcmV2aW91cywgc3RhdHVzOiBcImVuZGVkXCIsIHRlcm1pbmFsIH0pKTtcblx0XHRcdH0sXG5cdFx0fSkudGhlbihcblx0XHRcdChvcGVuZWQpID0+IHtcblx0XHRcdFx0aWYgKGNhbmNlbGxlZCkge1xuXHRcdFx0XHRcdG9wZW5lZC5jbG9zZSgpO1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHRoYW5kbGUgPSBvcGVuZWQ7XG5cdFx0XHRcdHNldFN0YXRlKChwcmV2aW91cykgPT5cblx0XHRcdFx0XHRwcmV2aW91cy5zdGF0dXMgPT09IFwiZW5kZWRcIlxuXHRcdFx0XHRcdFx0PyBwcmV2aW91c1xuXHRcdFx0XHRcdFx0OiB7IC4uLnByZXZpb3VzLCBzdGF0dXM6IFwib3BlblwiIH0sXG5cdFx0XHRcdCk7XG5cdFx0XHR9LFxuXHRcdFx0KGVycm9yOiB1bmtub3duKSA9PiB7XG5cdFx0XHRcdGlmIChjYW5jZWxsZWQpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0c2V0U3RhdGUoe1xuXHRcdFx0XHRcdHN0YXR1czogXCJmYWlsZWRcIixcblx0XHRcdFx0XHRsYXN0RXZlbnQ6IG51bGwsXG5cdFx0XHRcdFx0dGVybWluYWw6IG51bGwsXG5cdFx0XHRcdFx0ZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyb3IpKSxcblx0XHRcdFx0fSk7XG5cdFx0XHR9LFxuXHRcdCk7XG5cdFx0cmV0dXJuICgpID0+IHtcblx0XHRcdGNhbmNlbGxlZCA9IHRydWU7XG5cdFx0XHRoYW5kbGU/LmNsb3NlKCk7XG5cdFx0fTtcblx0fSwgW29wZW4sIGtleV0pO1xuXG5cdHJldHVybiBzdGF0ZTtcbn1cbiIKICBdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7QUFnQkE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUF3Qk8sTUFBTSxnQ0FBZ0MsY0FBYTtBQUFBLEVBQ2xELFdBQVcsQ0FBQyxTQUFpQjtBQUFBLElBQ25DLE1BQU0sU0FBUyxlQUFlO0FBQUE7QUFFaEM7QUFPQSxJQUFNLGdCQUFnQixjQUE2QixJQUFJO0FBNkJoRCxTQUFTLGNBQWMsQ0FBQyxPQUEwQztBQUFBLEVBQ3hFLFFBQVEsTUFBTSxRQUFRLFdBQVcsU0FBUyxhQUFhO0FBQUEsRUFDdkQsTUFBTSxRQUFRLENBQUMsTUFBTSxRQUFRLFNBQVMsRUFBRSxPQUN2QyxDQUFDLFdBQVcsV0FBVyxTQUN4QixFQUFFO0FBQUEsRUFDRixJQUFJLFVBQVUsR0FBRztBQUFBLElBQ2hCLE1BQU0sSUFBSSx3QkFDVCwrREFDRDtBQUFBLEVBQ0Q7QUFBQSxFQUNBLE1BQU0sWUFBWSxTQUFTO0FBQUEsRUFDM0IsT0FBTyxPQUFPLFlBQVksU0FBOEIsSUFBSTtBQUFBLEVBQzVELFVBQVUsTUFBTTtBQUFBLElBQ2YsSUFBSSxjQUFjLFdBQVc7QUFBQSxNQUM1QjtBQUFBLElBQ0Q7QUFBQSxJQUNBLE1BQU0sT0FBTyxJQUFJLGNBQ2hCLFdBQ0EsY0FBYyxZQUFZLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FDNUM7QUFBQSxJQUNBLFNBQVMsSUFBSTtB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U0FBUyxPQUFPLFFBQVE7QUFBQSxFQUM5QixPQUFPLFVBQVU7QUFBQSxFQUNqQixNQUFNLE1BQU0sVUFBVSxPQUFPLE9BQU8sVUFBVSxLQUFLO0FBQUEsRUFHbkQsTUFBTSxXQUFXLE9BQU8sS0FBSztBQUFBLEVBQzdCLFNBQVMsVUFBVTtBQUFBLEVBRW5CLFVBQVUsTUFBTTtBQUFBLElBQ2YsSUFBSSxRQUFRLE1BQU07QUFBQSxNQUNqQixTQUFTLFdBQVc7QUFBQSxNQUNwQjtBQUFBLElBQ0Q7QUFBQSxJQUNBLE1BQU0sVUFBVSxTQUFTO0FBQUEsSUFDekIsSUFBSSxZQUFZO0FBQUEsSUFDaEIsSUFBSSxTQUFrQztBQUFBLElBQ3RDLFNBQVM7QUFBQSxNQUNSLFFBQVE7QUFBQSxNQUNSLFdBQVc7QUFBQSxNQUNYLFVBQVU7QUFBQSxNQUNWLE9BQU87QUFBQSxJQUNSLENBQUM7QUFBQSxJQUNELEtBQUssU0FBUztBQUFBLE1BQ2IsU0FBUyxDQUFDLFVBQVU7QUFBQSxRQUNuQixJQUFJLFdBQVc7QUFBQSxVQUNkO0FBQUEsUUFDRDtBQUFBLFFBQ0EsT0FBTyxRQUFRLFVBQVUsS0FBSztBQUFBLFFBQzlCLFNBQVMsQ0FBQyxjQUFjLEtBQUssVUFBVSxXQUFXLE1BQU0sRUFBRTtBQUFBO0FBQUEsTUFFM0QsWUFBWSxDQUFDLGFBQWE7QUFBQSxRQUN6QixJQUFJLFdBQVc7QUFBQSxVQUNkO0FBQUEsUUFDRDtBQUFBLFFBQ0EsT0FBTyxRQUFRLGFBQWEsUUFBUTtBQUFBLFFBQ3BDLFNBQVMsQ0FBQyxjQUFjLEtBQUssVUFBVSxRQUFRLFNBQVMsU0FBUyxFQUFFO0FBQUE7QUFBQSxJQUVyRSxDQUFDLEVBQUUsS0FDRixDQUFDLFdBQVc7QUFBQSxNQUNYLElBQUksV0FBVztBQUFBLFFBQ2QsT0FBTyxNQUFNO0FBQUEsUUFDYjtBQUFBLE1BQ0Q7QUFBQSxNQUNBLFNBQVM7QUFBQSxNQUNULFNBQVMsQ0FBQyxhQUNULFNBQVMsV0FBVyxVQUNqQixXQUNBLEtBQUssVUFBVSxRQUFRLE9BQU8sQ0FDbEM7QUFBQSxPQUVELENBQUMsVUFBbUI7QUFBQSxNQUNuQixJQUFJLFdBQVc7QUFBQSxRQUNkO0FBQUEsTUFDRDtBQUFBLE1BQ0EsU0FBUztBQUFBLFFBQ1IsUUFBUTtBQUFBLFFBQ1IsV0FBVztBQUFBLFFBQ1gsVUFBVTtBQUFBLFFBQ1YsT0FBTyxpQkFBaUIsUUFBUSxRQUFRLElBQUksTUFBTSxPQUFPLEtBQUssQ0FBQztBQUFBLE1BQ2hFLENBQUM7QUFBQSxLQUVIO0FBQUEsSUFDQSxPQUFPLE1BQU07QUFBQSxNQUNaLFlBQVk7QUFBQSxNQUNaLFFBQVEsTUFBTTtBQUFBO0FBQUEsS0FFYixDQUFDLE1BQU0sR0FBRyxDQUFDO0FBQUEsRUFFZCxPQUFPO0FBQUE7IiwKICAiZGVidWdJZCI6ICIwRkE4MzcxRDQ3NDAzNEZGNjQ3NTZFMjE2NDc1NkUyMSIsCiAgIm5hbWVzIjogW10KfQ==
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// src/errors.ts
|
|
2
|
+
class QgisSdkError2 extends Error {
|
|
3
|
+
code;
|
|
4
|
+
constructor(message, code = "sdk_error") {
|
|
5
|
+
super(message);
|
|
6
|
+
this.name = new.target.name;
|
|
7
|
+
this.code = code;
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export { QgisSdkError2 };
|
|
12
|
+
|
|
13
|
+
//# debugId=87B5084359C9044664756E2164756E21
|
|
14
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL2Vycm9ycy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICAgICIvKipcbiAqIFRoZSBvbmUgZXJyb3Igcm9vdCBvZiBgQGFyY2hvbnQ1NjEvcWdpcy1zZGtgLlxuICpcbiAqIEV2ZXJ5IGVycm9yIHRoaXMgcGFja2FnZSByYWlzZXMgLSB0cmFuc3BvcnQsIGhvc3QgY29udHJhY3QsIFJlYWN0IGJpbmRpbmcsXG4gKiB0ZXN0IGhhcm5lc3MgLSBleHRlbmRzIGBRZ2lzU2RrRXJyb3JgLCBzbyBhIHBhZ2UgY2FuIGNhdGNoIHRoZSBmYW1pbHkgaW4gb25lXG4gKiBgaW5zdGFuY2VvZmAgYW5kIHN3aXRjaCBvbiB0aGUgc3RhYmxlIHdpcmUgYGNvZGVgIHJhdGhlciB0aGFuIG9uIGNsYXNzIG5hbWVzXG4gKiBvciBtZXNzYWdlIHRleHQuIFRoZSBjbGFzcyBsaXZlcyBpbiBpdHMgb3duIG1vZHVsZSBzbyB0aGUgZW50cnkgcG9pbnRzIGNhblxuICogc2hhcmUgaXQgd2l0aG91dCBpbXBvcnRpbmcgZWFjaCBvdGhlci5cbiAqL1xuXG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIGV4cGVjdGVkIFNESyBlcnJvcnMgYWNyb3NzIHRoZSBicmlkZ2UgYm91bmRhcnkuXG4gKi9cbmV4cG9ydCBjbGFzcyBRZ2lzU2RrRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG5cdHB1YmxpYyByZWFkb25seSBjb2RlOiBzdHJpbmc7XG5cblx0cHVibGljIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZywgY29kZTogc3RyaW5nID0gXCJzZGtfZXJyb3JcIikge1xuXHRcdHN1cGVyKG1lc3NhZ2UpO1xuXHRcdHRoaXMubmFtZSA9IG5ldy50YXJnZXQubmFtZTtcblx0XHR0aGlzLmNvZGUgPSBjb2RlO1xuXHR9XG59XG4iCiAgXSwKICAibWFwcGluZ3MiOiAiO0FBYU8sTUFBTSxzQkFBcUIsTUFBTTtBQUFBLEVBQ3ZCO0FBQUEsRUFFVCxXQUFXLENBQUMsU0FBaUIsT0FBZSxhQUFhO0FBQUEsSUFDL0QsTUFBTSxPQUFPO0FBQUEsSUFDYixLQUFLLE9BQU8sV0FBVztBQUFBLElBQ3ZCLEtBQUssT0FBTztBQUFBO0FBRWQ7IiwKICAiZGVidWdJZCI6ICI4N0I1MDg0MzU5QzkwNDQ2NjQ3NTZFMjE2NDc1NkUyMSIsCiAgIm5hbWVzIjogW10KfQ==
|