@jax-data-science/sci-image-visualizer 0.3.1 → 0.3.3

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/README.md CHANGED
@@ -241,11 +241,11 @@ once per image; the decoder runs per prompt). The registry lives in
241
241
 
242
242
  | Picker id | Domain | Encoder | Runs on | HF model |
243
243
  |---|---|---|---|---|
244
- | `microsam-vit-t-lm` *(default)* | light microscopy | TinyViT, ~14 MB fp16 | WASM¹ | [Ballon999/microsam-vit-t-lm-onnx](https://huggingface.co/Ballon999/microsam-vit-t-lm-onnx) |
245
- | `microsam-vit-b-lm` | light microscopy | ViT-B, ~172 MB fp16 | WebGPU | [Ballon999/microsam-vit-b-lm-onnx](https://huggingface.co/Ballon999/microsam-vit-b-lm-onnx) |
246
- | `patho-sam-vit-b` | histopathology (H&E) | ViT-B, ~172 MB fp16 | WebGPU | [Ballon999/patho-sam-vit-b-onnx](https://huggingface.co/Ballon999/patho-sam-vit-b-onnx) |
247
- | `patho-sam-vit-b-int8` | histopathology (H&E) | ViT-B, ~100 MB int8 | WASM | [Ballon999/patho-sam-vit-b-onnx](https://huggingface.co/Ballon999/patho-sam-vit-b-onnx) (`encoder.int8.onnx`) |
248
- | cellpose-SAM *(automatic)* | cells (generalist) | SAM ViT + flow head | WebGPU/WASM | [ballon999/cellpose-sam-onnx](https://huggingface.co/ballon999/cellpose-sam-onnx) |
244
+ | `microsam-vit-t-lm` *(default)* | light microscopy | TinyViT, ~14 MB fp16 | WASM¹ | [jax-image-tools/microsam-vit-t-lm-onnx](https://huggingface.co/jax-image-tools/microsam-vit-t-lm-onnx) |
245
+ | `microsam-vit-b-lm` | light microscopy | ViT-B, ~172 MB fp16 | WebGPU | [jax-image-tools/microsam-vit-b-lm-onnx](https://huggingface.co/jax-image-tools/microsam-vit-b-lm-onnx) |
246
+ | `patho-sam-vit-b` | histopathology (H&E) | ViT-B, ~172 MB fp16 | WebGPU | [jax-image-tools/patho-sam-vit-b-onnx](https://huggingface.co/jax-image-tools/patho-sam-vit-b-onnx) |
247
+ | `patho-sam-vit-b-int8` | histopathology (H&E) | ViT-B, ~100 MB int8 | WASM | [jax-image-tools/patho-sam-vit-b-onnx](https://huggingface.co/jax-image-tools/patho-sam-vit-b-onnx) (`encoder.int8.onnx`) |
248
+ | cellpose-SAM *(automatic)* | cells (generalist) | SAM ViT + flow head | WebGPU/WASM | [jax-image-tools/cellpose-sam-onnx](https://huggingface.co/jax-image-tools/cellpose-sam-onnx) |
249
249
 
250
250
  ¹ TinyViT's fp16 attention overflows on the onnxruntime-web WebGPU EP (returns an
251
251
  empty mask); it is numerically correct and fast on WASM, so its encoder is pinned
@@ -366,8 +366,8 @@ cellpose adapter). Configure hosted SAM model URLs once at startup:
366
366
  import { setSamModelUrls } from '@jax-data-science/sci-image-visualizer';
367
367
 
368
368
  setSamModelUrls('microsam-vit-t-lm',
369
- 'https://huggingface.co/Ballon999/microsam-vit-t-lm-onnx/resolve/main/encoder.fp16.onnx',
370
- 'https://huggingface.co/Ballon999/microsam-vit-t-lm-onnx/resolve/main/decoder.onnx');
369
+ 'https://huggingface.co/jax-image-tools/microsam-vit-t-lm-onnx/resolve/main/encoder.fp16.onnx',
370
+ 'https://huggingface.co/jax-image-tools/microsam-vit-t-lm-onnx/resolve/main/decoder.onnx');
371
371
  ```
372
372
 
373
373
  `onnxruntime-web` WASM/JSEP sidecars must be served from `/assets/ort/`. See
@@ -163,4 +163,60 @@ export class MultiPolygon {
163
163
  this.polygons = [];
164
164
  }
165
165
  }
166
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9tb2RlbHMvcmVnaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFFekMsTUFBTSxPQUFPLE1BQU07SUFBbkI7UUFPRSxXQUFNLEdBQStDLElBQUksQ0FBQztRQTBCMUQ7OztxRUFHNkQ7UUFDN0QsTUFBQyxHQUFHLENBQUMsQ0FBQztRQUNOLGVBQVUsR0FBSSxTQUFTLENBQUM7UUFDeEIsa0JBQWEsR0FBRyxDQUFDLENBQUM7UUFDbEI7Ozs7Ozs7OztXQVNHO1FBQ0gsZUFBVSxHQUFHLENBQUMsQ0FBQztRQUNmLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFDaEIsZUFBVSxHQUFHLENBQUMsQ0FBQztRQUNmLG9CQUFlLEdBQW9CLElBQUksQ0FBQztJQWdHMUMsQ0FBQztJQTlGQzs7aUVBRTZEO0lBQzdELFNBQVM7UUFDUCxPQUFPLElBQUksQ0FBQyxJQUFJLEtBQUssU0FBUyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxRQUFRO1FBQ04sd0JBQXdCO1FBQ3hCLElBQUksSUFBSSxDQUFDLE1BQU0sWUFBWSxTQUFTLEVBQUUsQ0FBQztZQUNyQyxPQUFPLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO3VCQUM5QixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssYUFBYSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3RFLENBQUM7YUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLFlBQVksT0FBTyxFQUFFLENBQUM7WUFDMUMsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDO1lBQ2Ysa0JBQWtCO1lBQ2xCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUM3QyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDaEMsSUFBSSxHQUFHLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7Z0JBQ3ZFLENBQUM7cUJBQU0sQ0FBQztvQkFDTixJQUFJLEdBQUcsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDdEUsQ0FBQztZQUNILENBQUM7WUFDRCxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxLQUFLLEtBQUssRUFBRSxDQUFDO2dCQUNqQyxJQUFJLElBQUksR0FBRyxDQUFDO1lBQ2QsQ0FBQztZQUNELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUNELE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsUUFBUSxDQUFDLGtCQUEyQixJQUFJO1FBQ3RDLE1BQU0sS0FBSyxHQUFHLElBQUksY0FBYyxFQUFFLENBQUM7UUFDbkMsS0FBSyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ25CLEtBQUssQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztRQUN2QixLQUFLLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztRQUN0QixLQUFLLENBQUMsSUFBSSxHQUFHO1lBQ1gsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVO1lBQ2hELEtBQUssRUFBRSxDQUFDO1NBQ1QsQ0FBQztRQUNGLEtBQUssQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUMvQixJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssU0FBUztZQUFFLEtBQUssQ0FBQyxJQUFJLEdBQUcsU0FBUyxDQUFDO1FBQ3BELElBQUksZUFBZSxFQUFFLENBQUM7WUFDcEIsS0FBSyxDQUFDLEtBQUssR0FBRztnQkFDWixJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFO2dCQUNyQixZQUFZLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFO2dCQUM3QixJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRTtnQkFDMUQsWUFBWSxFQUFFLFVBQVU7YUFDekIsQ0FBQztRQUNKLENBQUM7YUFBTSxDQUFDO1lBQ04sS0FBSyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDbkIsQ0FBQztRQUNELEtBQUssQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUUxQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ3pCLElBQUksSUFBSSxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ3RCLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUMzQixLQUFLLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQztnQkFDcEIsS0FBSyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUNsQixLQUFLLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQ2xCLEtBQUssQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO2dCQUMvQixLQUFLLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUNsQyxDQUFDO1lBQ0QsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQ3pCLEtBQUssQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDO2dCQUNwQixJQUFJLElBQUksR0FBRyxHQUFHLENBQUM7Z0JBQ2YsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztvQkFDdEMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLEVBQUUsQ0FBQzt3QkFDekIsSUFBSSxHQUFHLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO29CQUN6RCxDQUFDO3lCQUFNLENBQUM7d0JBQ04sSUFBSSxHQUFHLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO29CQUN4RCxDQUFDO2dCQUNILENBQUM7Z0JBQ0QsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLEtBQUssRUFBRSxDQUFDO29CQUMxQixJQUFJLElBQUksR0FBRyxDQUFDO2dCQUNkLENBQUM7Z0JBQ0QsS0FBSyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7WUFDcEIsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxXQUFXLENBQUMsSUFBUztRQUNuQixPQUFPLEdBQUcsSUFBSSxJQUFJLElBQUksR0FBRyxJQUFJLElBQUksSUFBSSxPQUFPLElBQUksSUFBSSxJQUFJLFFBQVEsSUFBSSxJQUFJLENBQUM7SUFDM0UsQ0FBQztJQUVELFNBQVMsQ0FBQyxJQUFTO1FBQ2pCLE9BQU8sU0FBUyxJQUFJLElBQUksSUFBSSxTQUFTLElBQUksSUFBSSxJQUFJLFNBQVMsSUFBSSxJQUFJLENBQUM7SUFDckUsQ0FBQztDQUNGO0FBRUQsTUFBTSxPQUFPLFNBQVM7SUFBdEI7UUFDRSxNQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ04sTUFBQyxHQUFHLENBQUMsQ0FBQztRQUNOLFVBQUssR0FBRyxDQUFDLENBQUM7UUFDVixXQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ2IsQ0FBQztDQUFBO0FBRUQsTUFBTSxPQUFPLE9BQU87SUFBcEI7UUFDRSxZQUFPLEdBQUcsQ0FBQyxDQUFDO1FBQ1osWUFBTyxHQUFhLEVBQUUsQ0FBQztRQUN2QixZQUFPLEdBQWEsRUFBRSxDQUFDO1FBQ3ZCLGdCQUFXLEdBQWUsRUFBRSxDQUFDO1FBQzdCLG1FQUFtRTtRQUNuRSxXQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ2Q7Ozs7Ozs7O1dBUUc7UUFDSCxXQUFNLEdBQUcsS0FBSyxDQUFDO0lBOEJqQixDQUFDO0NBQUE7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLE9BQU8sWUFBWTtJQUF6QjtRQUNFLGtFQUFrRTtRQUNsRSxhQUFRLEdBQWMsRUFBRSxDQUFDO0lBQzNCLENBQUM7Q0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNoYXBlU2VsZWN0aW9uIH0gZnJvbSAnLi9zaGFwZSc7XG5cbmV4cG9ydCBjbGFzcyBSZWdpb24ge1xuICAvKiogU3RhYmxlLCB1bmlxdWUgaWRlbnRpdHkgZm9yIHNlbGVjdGlvbiBhbmQgZXF1YWxpdHkuIE1pbnRlZCBieVxuICAgKiAgUGxvdGx5U2VydmljZSB3aGVuIGEgcmVnaW9uIGZpcnN0IGVudGVycyB0aGUgc3lzdGVtLiBOZXZlciBkZXJpdmVkXG4gICAqICBmcm9tIGFycmF5IGluZGV4IOKAlCBuYW1lIGNvbGxpc2lvbnMgYWNyb3NzIGRlbGV0ZS9hZGQgY3ljbGVzIG11c3RcbiAgICogIG5vdCBicmVhayBQcmltZU5HIHJvdyBzZWxlY3Rpb24uICovXG4gIGlkITogbnVtYmVyO1xuICBuYW1lITogc3RyaW5nO1xuICBib3VuZHM/OiBSZWN0YW5nbGUgfCBQb2x5Z29uIHwgTXVsdGlQb2x5Z29uIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBwcm9maWxlID0gYW4gaW50ZW5zaXR5LXByb2ZpbGUgbGluZSBST0k7IHJlbmRlcmVkL2RyYWdnZWQgbGlrZSBhIHJlZ2lvbiBidXRcbiAgICogIGV4Y2x1ZGVkIGZyb20gdGhlIFJlZ2lvbnMgdGFiIGFuZCBleHBvcnRzLiBVc2UgYGlzUHJvZmlsZSgpYCB0byB0ZXN0IGl0IOKAlFxuICAgKiAgaXQncyB0aGUgY2Fub25pY2FsIG1hcmtlciB0aGF0IHNlcGFyYXRlcyBpbnRlbnNpdHkgbGluZXMgKG93bmVkIGJ5IHRoZVxuICAgKiAgaW50ZW5zaXR5IHRvb2wsIHNhbXBsZWQgaW50byB0aGUgaW5zZXQpIGZyb20gYW5ub3RhdGlvbiByZWdpb25zIChvd25lZCBieVxuICAgKiAgdGhlIFJlZ2lvbiBFZGl0b3IpLiBCb3RoIGJhY2tlbmRzIChQbG90bHksIE9TRCkgaG9ub3VyIGl0LiAqL1xuICBraW5kPzogJ3Byb2ZpbGUnO1xuICAvKipcbiAgICogV2hpY2ggYXV0b21hdGVkIHRvb2wgcHJvZHVjZWQgdGhpcyByZWdpb24sIGUuZy4gYCd5b2xvJ2AuIEFic2VudCBvblxuICAgKiBhbnl0aGluZyB0aGUgdXNlciBkcmV3LlxuICAgKlxuICAgKiBMZXRzIGEgdG9vbCByZXBsYWNlIGl0cyAqb3duKiBwcmV2aW91cyBvdXRwdXQgb24gYSByZS1ydW4gd2l0aG91dCB0b3VjaGluZ1xuICAgKiBoYW5kLWRyYXduIHdvcmsgb3IgYW5vdGhlciB0b29sJ3MgcmVzdWx0cyDigJQgd2hpY2ggbWF0dGVycyB3aGlsZSB0dW5pbmdcbiAgICogcGFyYW1ldGVycywgd2hlcmUgZXZlcnkgcnVuIHdvdWxkIG90aGVyd2lzZSBwaWxlIG9udG8gdGhlIGxhc3QuIElkZW50aXR5XG4gICAqIGNvbXBhcmlzb24gaXMgbm90IGEgc3Vic3RpdHV0ZTogcmVnaW9ucyBtYXkgYmUgcmUtbWludGVkIGFzIHRoZXkgcGFzc1xuICAgKiB0aHJvdWdoIHRoZSBzdG9yZSwgc28gdGhlIG1hcmtlciBoYXMgdG8gdHJhdmVsIHdpdGggdGhlIGRhdGEuXG4gICAqL1xuICBzb3VyY2U/OiBzdHJpbmc7XG4gIGNvbG9yPzogc3RyaW5nOyAvLyBoZXggc3RyaW5nLCBlLmcuICcjUlJHR0JCJyAodGhlIGhpc3RvcmljYWwgXCJbciwgZywgYl1cIiBub3RlIGlzIHN0YWxlKVxuICAvLyBjbGFzcyBsYWJlbFxuICBsYWJlbD86IHN0cmluZztcbiAgLyoqIFRydWUgd2hlbiB0aGUgdXNlciBzZXQgdGhpcyByZWdpb24ncyBjb2xvdXIgZXhwbGljaXRseSAoUmVnaW9uIEVkaXRvciBDb2xvclxuICAgKiAgY29sdW1uKS4gUHJlc2V0IGNvbG91ciByZXNvbHV0aW9uIChqaXQtdWkjNzApIHNraXBzIG92ZXJyaWRkZW4gcmVnaW9ucyBzbyBhXG4gICAqICBtYW51YWwgY29sb3VyIGlzIG5vdCBjbG9iYmVyZWQgd2hlbiBwcmVzZXRzIGFyZSAocmUpYXBwbGllZCBvbiBsb2FkL2ltcG9ydC4gKi9cbiAgY29sb3JPdmVycmlkZGVuPzogYm9vbGVhbjtcbiAgZmlsZW5hbWU/OiBzdHJpbmc7XG4gIC8qKiBaZXJvLWJhc2VkIHotc2xpY2UgdGhpcyByZWdpb24gYmVsb25ncyB0byB3aXRoaW4gYSBzdGFjayDigJQgbWlycm9yc1xuICAgKiAgUXVQYXRoJ3MgYGdlb21ldHJ5LnBsYW5lLnpgIChhIG1pc3NpbmcgcGxhbmUgLyBkZWZhdWx0IHBsYW5lIHJlYWRzIGJhY2sgYXNcbiAgICogIDApLiBVc2VkIHRvIHBsYWNlL2ZpbHRlciBST0lzIHBlciBzbGljZTsgMCBmb3IgYSBwbGFpbiBzaW5nbGUtcGxhbmUgaW1hZ2VcbiAgICogIG9yIGEgcmVnaW9uIGRyYXduIHdpdGhvdXQgYSBzbGljZSBjb250ZXh0IChqaXQtdWkjOTMpLiAqL1xuICB6ID0gMDtcbiAgc2hhcGVDb2xvcj8gPSAnIzAwRkZGRic7XG4gIGJ5dGVzUGVyUGl4ZWwgPSA4O1xuICAvKipcbiAgICogcmVzb2x1dGlvbiBpcyB0aGUgcmVzb2x1dGlvbiBhdCB3aGljaCB0aGUgcmVnaW9uXG4gICAqIHdhcyBmb3VuZC4gSW4gb3JkZXIgdG8gZ2V0IGl0IGluIHRoZSBmdWxsIGltYWdlXG4gICAqIGNvb3JkaW5hdGVzIGl0IHdpbGwgbm9ybWFsbHkgYmUgMC4gSG93ZXZlciBpZlxuICAgKiB0aGVyZSBpcyBhIG1pc3Rha2Ugd2l0aCB0aGUgcmVzb2x1dGlvbiBpdCBtYXkgbm90XG4gICAqIGJlLiBXZSByZXR1cm4gdGhlIHJlc29sdXRpb24gaGVyZSBpbiBvcmRlciB0byBiZVxuICAgKiBzdXJlIHdoYXQgaXQgaXMuIFRoZSBzZXJ2ZXIgbWF5IG5lZWQgdG8gYmUgY2hhbmdlZFxuICAgKiB0byBlbnN1cmUgdGhhdCByZXN1bHRzIHJlZ2lvbnMgYXJlIGFsd2F5cyByZXR1cm5lZFxuICAgKiBhdCByZXNvbHV0aW9uID0gMFxuICAgKi9cbiAgcmVzb2x1dGlvbiA9IDA7XG4gIGNyb3BwZWQgPSBmYWxzZTtcbiAgdGlsZU51bWJlciA9IDA7XG4gIHRpbGVDb29yZGluYXRlczogbnVtYmVyW10gfCBudWxsID0gbnVsbDtcblxuICAvKiogVHJ1ZSBmb3IgaW50ZW5zaXR5LXByb2ZpbGUgbGluZSBST0lzICh0aGUgaW50ZW5zaXR5IHRvb2wncyBsaW5lcykuIFRoZXNlIGFyZVxuICAgKiAgTk9UIGFubm90YXRpb24gcmVnaW9uczogdGhleSBuZXZlciBhcHBlYXIgaW4gdGhlIFJlZ2lvbiBFZGl0b3IgYW5kIGVkaXRvclxuICAgKiAgb3BlcmF0aW9ucyAoc2VsZWN0L3NhdmUvZGVsZXRlKSBtdXN0IG5ldmVyIHRvdWNoIHRoZW0uICovXG4gIGlzUHJvZmlsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5raW5kID09PSAncHJvZmlsZSc7XG4gIH1cblxuICB0b1N0cmluZygpIHtcbiAgICAvLyBpZiBzaGFwZSBpcyByZWN0YW5nbGVcbiAgICBpZiAodGhpcy5ib3VuZHMgaW5zdGFuY2VvZiBSZWN0YW5nbGUpIHtcbiAgICAgIHJldHVybiBgeDogJHt0aGlzLmJvdW5kcy54fSwgeTogJHt0aGlzLmJvdW5kcy55fSxcbiAgICAgICAgICAgICAgd2lkdGg6ICR7dGhpcy5ib3VuZHMud2lkdGh9LCBoZWlnaHQ6ICR7dGhpcy5ib3VuZHMuaGVpZ2h0fWA7XG4gICAgfSBlbHNlIGlmICh0aGlzLmJvdW5kcyBpbnN0YW5jZW9mIFBvbHlnb24pIHtcbiAgICAgIGxldCBwYXRoID0gJ00nO1xuICAgICAgLy8gZGlzcGxheSBhcyBwYXRoXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuYm91bmRzLm5wb2ludHM7IGkrKykge1xuICAgICAgICBpZiAoaSA8IHRoaXMuYm91bmRzLm5wb2ludHMgLSAxKSB7XG4gICAgICAgICAgcGF0aCA9IGAke3BhdGh9JHt0aGlzLmJvdW5kcy54cG9pbnRzW2ldfSwke3RoaXMuYm91bmRzLnlwb2ludHNbaV19TGA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGF0aCA9IGAke3BhdGh9JHt0aGlzLmJvdW5kcy54cG9pbnRzW2ldfSwke3RoaXMuYm91bmRzLnlwb2ludHNbaV19YDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuYm91bmRzLmNsb3NlZCAhPT0gZmFsc2UpIHtcbiAgICAgICAgcGF0aCArPSAnWic7XG4gICAgICB9XG4gICAgICByZXR1cm4gcGF0aDtcbiAgICB9XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBTaGFwZVNlbGVjdGlvbiBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCB0b1xuICAgKiBjcmVhdGUgYSBzaGFwZSBpbiBQbG90bHkuXG4gICAqIEBwYXJhbSBzaG93UmVnaW9uTGFiZWxcbiAgICogQHJldHVybiBTaGFwZVNlbGVjdGlvblxuICAgKi9cbiAgZ2V0U2hhcGUoc2hvd1JlZ2lvbkxhYmVsOiBib29sZWFuID0gdHJ1ZSk6IFNoYXBlU2VsZWN0aW9uIHtcbiAgICBjb25zdCBzaGFwZSA9IG5ldyBTaGFwZVNlbGVjdGlvbigpO1xuICAgIHNoYXBlLmlkID0gdGhpcy5pZDtcbiAgICBzaGFwZS5uYW1lID0gdGhpcy5uYW1lO1xuICAgIHNoYXBlLmVkaXRhYmxlID0gdHJ1ZTtcbiAgICBzaGFwZS5saW5lID0ge1xuICAgICAgY29sb3I6IHRoaXMuY29sb3IgPyB0aGlzLmNvbG9yIDogdGhpcy5zaGFwZUNvbG9yLFxuICAgICAgd2lkdGg6IDMsXG4gICAgfTtcbiAgICBzaGFwZS5maWxlTmFtZSA9IHRoaXMuZmlsZW5hbWU7XG4gICAgaWYgKHRoaXMua2luZCA9PT0gJ3Byb2ZpbGUnKSBzaGFwZS5raW5kID0gJ3Byb2ZpbGUnO1xuICAgIGlmIChzaG93UmVnaW9uTGFiZWwpIHtcbiAgICAgIHNoYXBlLmxhYmVsID0ge1xuICAgICAgICB0ZXh0OiBgJHt0aGlzLmxhYmVsfWAsXG4gICAgICAgIHRleHR0ZW1wbGF0ZTogYCR7dGhpcy5sYWJlbH1gLFxuICAgICAgICBmb250OiB7IGNvbG9yOiB0aGlzLmNvbG9yID8gdGhpcy5jb2xvciA6IHRoaXMuc2hhcGVDb2xvciB9LFxuICAgICAgICB0ZXh0cG9zaXRpb246ICd0b3AgbGVmdCcsXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBzaGFwZS5sYWJlbCA9IHt9O1xuICAgIH1cbiAgICBzaGFwZS5sZWdlbmQgPSB0aGlzLmxhYmVsO1xuXG4gICAgY29uc3QgYm5kcyA9IHRoaXMuYm91bmRzO1xuICAgIGlmIChibmRzICE9IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHRoaXMuaXNSZWN0YW5nbGUoYm5kcykpIHtcbiAgICAgICAgc2hhcGUudHlwZSA9ICdyZWN0JztcbiAgICAgICAgc2hhcGUueDAgPSBibmRzLng7XG4gICAgICAgIHNoYXBlLnkwID0gYm5kcy55O1xuICAgICAgICBzaGFwZS54MSA9IGJuZHMueCArIGJuZHMud2lkdGg7XG4gICAgICAgIHNoYXBlLnkxID0gYm5kcy55ICsgYm5kcy5oZWlnaHQ7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5pc1BvbHlnb24oYm5kcykpIHtcbiAgICAgICAgc2hhcGUudHlwZSA9ICdwYXRoJztcbiAgICAgICAgbGV0IHBhdGggPSAnTSc7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYm5kcy5ucG9pbnRzOyBpKyspIHtcbiAgICAgICAgICBpZiAoaSA8IGJuZHMubnBvaW50cyAtIDEpIHtcbiAgICAgICAgICAgIHBhdGggPSBgJHtwYXRofSR7Ym5kcy54cG9pbnRzW2ldfSwke2JuZHMueXBvaW50c1tpXX1MYDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGF0aCA9IGAke3BhdGh9JHtibmRzLnhwb2ludHNbaV19LCR7Ym5kcy55cG9pbnRzW2ldfWA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChibmRzLmNsb3NlZCAhPT0gZmFsc2UpIHtcbiAgICAgICAgICBwYXRoICs9ICdaJztcbiAgICAgICAgfVxuICAgICAgICBzaGFwZS5wYXRoID0gcGF0aDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNoYXBlO1xuICB9XG5cbiAgaXNSZWN0YW5nbGUoYm5kczogYW55KTogYm5kcyBpcyBSZWN0YW5nbGUge1xuICAgIHJldHVybiAneCcgaW4gYm5kcyAmJiAneScgaW4gYm5kcyAmJiAnd2lkdGgnIGluIGJuZHMgJiYgJ2hlaWdodCcgaW4gYm5kcztcbiAgfVxuXG4gIGlzUG9seWdvbihibmRzOiBhbnkpOiBibmRzIGlzIFBvbHlnb24ge1xuICAgIHJldHVybiAnbnBvaW50cycgaW4gYm5kcyAmJiAneHBvaW50cycgaW4gYm5kcyAmJiAneXBvaW50cycgaW4gYm5kcztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUmVjdGFuZ2xlIHtcbiAgeCA9IDA7XG4gIHkgPSAwO1xuICB3aWR0aCA9IDA7XG4gIGhlaWdodCA9IDA7XG59XG5cbmV4cG9ydCBjbGFzcyBQb2x5Z29uIHtcbiAgbnBvaW50cyA9IDA7XG4gIHhwb2ludHM6IG51bWJlcltdID0gW107XG4gIHlwb2ludHM6IG51bWJlcltdID0gW107XG4gIGNvb3JkaW5hdGVzOiBudW1iZXJbXVtdID0gW107XG4gIC8qKiBmYWxzZSBmb3Igb3BlbiBwb2x5bGluZXM7IHRydWUgKGRlZmF1bHQpIGZvciBjbG9zZWQgcG9seWdvbnMgKi9cbiAgY2xvc2VkID0gdHJ1ZTtcbiAgLyoqXG4gICAqIFdoZW4gdHJ1ZSB0aGUgdmVydGljZXMgYXJlIHRyZWF0ZWQgYXMgYmV6aWVyLXNwbGluZSAqKmFuY2hvcnMqKiBhbmQgdGhlXG4gICAqIHJlZ2lvbiBpcyByZW5kZXJlZC9leHBvcnRlZCBhcyBhIHNtb290aCBjdXJ2ZSB0aHJvdWdoIHRoZW0uIFRoZSB2ZXJ0aWNlc1xuICAgKiBzdGF5IHRoZSBlZGl0YWJsZSBhbmNob3JzIOKAlCB0b2dnbGluZyB0aGlzIGZsYWcgaXMgdGhlIHRvQmV6aWVyXG4gICAqIChgdHJ1ZWApIC8gdG9Qb2x5Z29uIChgZmFsc2VgKSwgd2hpY2ggb25seSBhZGQvcmVtb3ZlIHRoZSBjdXJ2ZSwgbmV2ZXIgbW92ZVxuICAgKiB0aGUgYW5jaG9ycy4gR2VvSlNPTiBrZWVwcyB0aGUgZmxhdHRlbmVkIGN1cnZlIGFzIHRoZSBnZW9tZXRyeSAoc28gUXVQYXRoXG4gICAqIHJlbmRlcnMgaXQpIHBsdXMgdGhlIGFuY2hvcnMgKyBoYW5kbGVzICsgZmxhZyBpbiBwcm9wZXJ0aWVzIChzbyBKSVRcbiAgICogcm91bmQtdHJpcHMgdGhlIGVkaXRhYmxlIGJlemllcikuXG4gICAqL1xuICBiZXppZXIgPSBmYWxzZTtcbiAgLyoqXG4gICAqIFBlci1hbmNob3IgY3ViaWMtYmV6aWVyIGNvbnRyb2wtcG9pbnQgb2Zmc2V0cywgKipyZWxhdGl2ZSoqIHRvIHRoZWlyIGFuY2hvclxuICAgKiAoc28gdGhleSB0cmFuc2xhdGUgd2l0aCBpdCkuIFByZXNlbnQgb25seSBmb3IgYmV6aWVyIHJlZ2lvbnM7IGluaXRpYWxpc2VkXG4gICAqIGZyb20gdGhlIENhdG11bGwtUm9tIGNvbnN0cnVjdGlvbiAoYSBzbW9vdGggY3VydmUpIHdoZW4gYmV6aWVyIGlzIHR1cm5lZCBvbixcbiAgICogdGhlbiBpbmRpdmlkdWFsbHkgZWRpdGFibGUgYnkgZHJhZ2dpbmcgdGhlIGhhbmRsZXMuIGBoYW5kbGVzSW5baV1gIC9cbiAgICogYGhhbmRsZXNPdXRbaV1gIGFyZSBgW2R4LCBkeV1gIGZvciB2ZXJ0ZXggYGlgLlxuICAgKi9cbiAgaGFuZGxlc0luPzogbnVtYmVyW11bXTtcbiAgaGFuZGxlc091dD86IG51bWJlcltdW107XG5cbiAgLyoqXG4gICAqIEludGVyaW9yIHJpbmdzIChob2xlcykg4oCUIGppdC11aSM4NS4gRWFjaCByaW5nIGlzIGEgbGlzdCBvZiBgW3gsIHldYFxuICAgKiBpbWFnZS1waXhlbCBwYWlycyBpbiB0aGUgU0FNRSBjbG9zZWQtcG9seWdvbiBjb252ZW50aW9uIGFzIHRoZSBleHRlcmlvclxuICAgKiAoYGNvb3JkaW5hdGVzYCk6IG5vIHJlcGVhdGVkIGNsb3NpbmcgcG9pbnQuIFByZXNlbnQgb25seSBvbiBjbG9zZWQgcG9seWdvbnMuXG4gICAqIEEgcG9pbnQgaW5zaWRlIHRoZSBleHRlcmlvciAqKmFuZCoqIGluc2lkZSBhbnkgaG9sZSBpcyBPVVRTSURFIHRoZSByZWdpb25cbiAgICogKGV2ZW4tb2RkIHJ1bGUpLiBBYnNlbnQvZW1wdHkgPT0gYSBzb2xpZCBwb2x5Z29uICh0aGUgcHJpb3IgYmVoYXZpb3VyKSwgc29cbiAgICogZXZlcnkgZXhpc3RpbmcgcmVnaW9uIGlzIHVuYWZmZWN0ZWQuXG4gICAqL1xuICBob2xlcz86IG51bWJlcltdW11bXTtcblxuICAvKipcbiAgICogUGVyLWhvbGUgYsOpemllciBjb250cm9sLXBvaW50IG9mZnNldHMsIHBhcmFsbGVsIHRvIHtAbGluayBob2xlc30gKG9uZSBlbnRyeSBwZXIgcmluZywgZWFjaCBhXG4gICAqIGxpc3Qgb2YgYFtkeCwgZHldYCBwZXIgcmluZyB2ZXJ0ZXgsICoqcmVsYXRpdmUqKiB0byB0aGUgdmVydGV4KS4gUHJlc2VudCBvbmx5IHdoZW4gYGJlemllcmAgaXNcbiAgICogb24gZm9yIGEgZG9udXQg4oCUIHNlZWRlZCBmcm9tIHRoZSBDYXRtdWxsLVJvbSBkZWZhdWx0IGFuZCBpbmRpdmlkdWFsbHkgZWRpdGFibGUsIGV4YWN0bHkgbGlrZVxuICAgKiB0aGUgZXh0ZXJpb3Ige0BsaW5rIGhhbmRsZXNJbn0ve0BsaW5rIGhhbmRsZXNPdXR9LiBTbyBhIGRvbnV0IHNtb290aGVkIHRvIGEgYsOpemllciBjdXJ2ZXMgaXRzXG4gICAqIGhvbGVzIHRvbyAoaml0LXVpIzEwMikuXG4gICAqL1xuICBob2xlSGFuZGxlc0luPzogbnVtYmVyW11bXVtdO1xuICBob2xlSGFuZGxlc091dD86IG51bWJlcltdW11bXTtcbn1cblxuLyoqXG4gKiBBIHJlZ2lvbiB3aG9zZSBnZW9tZXRyeSBpcyBzZXZlcmFsIGRpc2pvaW50IHBhcnRzIOKAlCBlLmcuIHRoZSByZXN1bHQgb2YgbWVyZ2luZ1xuICogdHdvIG5vbi10b3VjaGluZyByZWdpb25zLCBvciB0aGUgaW52ZXJzZSBvZiBhIGJsb2IgKGppdC11aSM4NSkuIEVhY2ggcGFydCBpcyBhXG4gKiBjbG9zZWQge0BsaW5rIFBvbHlnb259IHRoYXQgbWF5IGNhcnJ5IGl0cyBvd24gaG9sZXMsIHNvIGEgTXVsdGlQb2x5Z29uXG4gKiByZXByZXNlbnRzIFwic3BhcnNlIGJpdHMsIHNvbWUgd2l0aCBkb251dCBob2xlc1wiIGFzIGEgc2luZ2xlIHJlZ2lvbi4gTWFwcyAxOjFcbiAqIG9udG8gYSBHZW9KU09OIGBNdWx0aVBvbHlnb25gIChhbmQgUXVQYXRoJ3MgZ2VvbWV0cnkpLlxuICpcbiAqIEEgc2luZ2xlLXBhcnQgTXVsdGlQb2x5Z29uIGlzIGVxdWl2YWxlbnQgdG8gdGhhdCBQb2x5Z29uOyBjYWxsZXJzIHNob3VsZFxuICogcHJlZmVyIGEgcGxhaW4ge0BsaW5rIFBvbHlnb259IGZvciBvbmUgY29ubmVjdGVkIHBhcnQuXG4gKi9cbmV4cG9ydCBjbGFzcyBNdWx0aVBvbHlnb24ge1xuICAvKiogT25lIG9yIG1vcmUgZGlzam9pbnQgY2xvc2VkIHBvbHlnb25zIChlYWNoIG1heSBoYXZlIGhvbGVzKS4gKi9cbiAgcG9seWdvbnM6IFBvbHlnb25bXSA9IFtdO1xufVxuXG5leHBvcnQgdHlwZSBCb3VuZHMgPVxuICB8IFJlY3RhbmdsZVxuICB8IFBvbHlnb25cbiAgfCB7XG4gICAgICB4PzogbnVtYmVyO1xuICAgICAgeT86IG51bWJlcjtcbiAgICAgIHdpZHRoPzogbnVtYmVyO1xuICAgICAgaGVpZ2h0PzogbnVtYmVyO1xuICAgICAgbnBvaW50cz86IG51bWJlcjtcbiAgICAgIHhwb2ludHM/OiBudW1iZXJbXTtcbiAgICAgIHlwb2ludHM/OiBudW1iZXJbXTtcbiAgICB9O1xuIl19
166
+ /**
167
+ * Rebuild a plain-object `bounds` as the class instance the renderers expect
168
+ * (jit-ui#124).
169
+ *
170
+ * Regions that arrive as JSON — a host's server response, a `structuredClone`,
171
+ * anything that has been through `JSON.parse` — carry a `bounds` that has the
172
+ * right *fields* but not the right *prototype*. The renderers disagree about
173
+ * whether that is acceptable: `Region.getShape()` (Plotly) and the napari
174
+ * overlay duck-type the bounds, while the OpenSeadragon overlay discriminates
175
+ * with `bounds instanceof Rectangle`. So a JSON region drew in Heatmap mode and
176
+ * silently vanished in Image mode. `instanceof` also gates the store's own
177
+ * geometry de-duplication, `moveRegion`, and the GeoJSON export — a JSON region
178
+ * is undraggable and absent from a save in *every* mode.
179
+ *
180
+ * Rather than duck-type ~20 call sites, the store normalizes here on the way in,
181
+ * so everything downstream can keep relying on `instanceof`. Values that are
182
+ * already instances are returned **by reference**, untouched: overlays and tools
183
+ * hold onto the bounds they created and mutate them in place during a drag.
184
+ */
185
+ export function hydrateBounds(bounds) {
186
+ if (!bounds ||
187
+ bounds instanceof Rectangle ||
188
+ bounds instanceof Polygon ||
189
+ bounds instanceof MultiPolygon) {
190
+ return bounds;
191
+ }
192
+ if (Array.isArray(bounds.polygons)) {
193
+ const multi = new MultiPolygon();
194
+ multi.polygons = bounds.polygons.map((part) => hydratePolygon(part));
195
+ return multi;
196
+ }
197
+ if ('npoints' in bounds || 'xpoints' in bounds) {
198
+ return hydratePolygon(bounds);
199
+ }
200
+ if ('width' in bounds && 'height' in bounds) {
201
+ return Object.assign(new Rectangle(), bounds);
202
+ }
203
+ // Nothing recognisable — hand it back rather than coerce it into the wrong
204
+ // geometry. It renders nowhere either way, but a caller can still inspect it.
205
+ return bounds;
206
+ }
207
+ /** {@link hydrateBounds} for one polygon, deriving the fields a lean serializer
208
+ * omits: JIT's Java `PolygonSerializer` writes only `npoints`/`xpoints`/
209
+ * `ypoints`, while the GeoJSON export reads `coordinates` and the overlays read
210
+ * `closed`. */
211
+ function hydratePolygon(raw) {
212
+ if (raw instanceof Polygon)
213
+ return raw;
214
+ const polygon = Object.assign(new Polygon(), raw);
215
+ polygon.xpoints = [...(raw.xpoints ?? [])];
216
+ polygon.ypoints = [...(raw.ypoints ?? [])];
217
+ polygon.npoints = raw.npoints ?? polygon.xpoints.length;
218
+ polygon.coordinates = raw.coordinates ?? polygon.xpoints.map((x, i) => [x, polygon.ypoints[i]]);
219
+ polygon.closed = raw.closed ?? true;
220
+ return polygon;
221
+ }
222
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9tb2RlbHMvcmVnaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFFekMsTUFBTSxPQUFPLE1BQU07SUFBbkI7UUFPRSxXQUFNLEdBQStDLElBQUksQ0FBQztRQTBCMUQ7OztxRUFHNkQ7UUFDN0QsTUFBQyxHQUFHLENBQUMsQ0FBQztRQUNOLGVBQVUsR0FBSSxTQUFTLENBQUM7UUFDeEIsa0JBQWEsR0FBRyxDQUFDLENBQUM7UUFDbEI7Ozs7Ozs7OztXQVNHO1FBQ0gsZUFBVSxHQUFHLENBQUMsQ0FBQztRQUNmLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFDaEIsZUFBVSxHQUFHLENBQUMsQ0FBQztRQUNmLG9CQUFlLEdBQW9CLElBQUksQ0FBQztJQWdHMUMsQ0FBQztJQTlGQzs7aUVBRTZEO0lBQzdELFNBQVM7UUFDUCxPQUFPLElBQUksQ0FBQyxJQUFJLEtBQUssU0FBUyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxRQUFRO1FBQ04sd0JBQXdCO1FBQ3hCLElBQUksSUFBSSxDQUFDLE1BQU0sWUFBWSxTQUFTLEVBQUUsQ0FBQztZQUNyQyxPQUFPLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO3VCQUM5QixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssYUFBYSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3RFLENBQUM7YUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLFlBQVksT0FBTyxFQUFFLENBQUM7WUFDMUMsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDO1lBQ2Ysa0JBQWtCO1lBQ2xCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUM3QyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDaEMsSUFBSSxHQUFHLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7Z0JBQ3ZFLENBQUM7cUJBQU0sQ0FBQztvQkFDTixJQUFJLEdBQUcsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDdEUsQ0FBQztZQUNILENBQUM7WUFDRCxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxLQUFLLEtBQUssRUFBRSxDQUFDO2dCQUNqQyxJQUFJLElBQUksR0FBRyxDQUFDO1lBQ2QsQ0FBQztZQUNELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUNELE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsUUFBUSxDQUFDLGtCQUEyQixJQUFJO1FBQ3RDLE1BQU0sS0FBSyxHQUFHLElBQUksY0FBYyxFQUFFLENBQUM7UUFDbkMsS0FBSyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ25CLEtBQUssQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztRQUN2QixLQUFLLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztRQUN0QixLQUFLLENBQUMsSUFBSSxHQUFHO1lBQ1gsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVO1lBQ2hELEtBQUssRUFBRSxDQUFDO1NBQ1QsQ0FBQztRQUNGLEtBQUssQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUMvQixJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssU0FBUztZQUFFLEtBQUssQ0FBQyxJQUFJLEdBQUcsU0FBUyxDQUFDO1FBQ3BELElBQUksZUFBZSxFQUFFLENBQUM7WUFDcEIsS0FBSyxDQUFDLEtBQUssR0FBRztnQkFDWixJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFO2dCQUNyQixZQUFZLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFO2dCQUM3QixJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRTtnQkFDMUQsWUFBWSxFQUFFLFVBQVU7YUFDekIsQ0FBQztRQUNKLENBQUM7YUFBTSxDQUFDO1lBQ04sS0FBSyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDbkIsQ0FBQztRQUNELEtBQUssQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUUxQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ3pCLElBQUksSUFBSSxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ3RCLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO2dCQUMzQixLQUFLLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQztnQkFDcEIsS0FBSyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUNsQixLQUFLLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQ2xCLEtBQUssQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO2dCQUMvQixLQUFLLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUNsQyxDQUFDO1lBQ0QsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQ3pCLEtBQUssQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDO2dCQUNwQixJQUFJLElBQUksR0FBRyxHQUFHLENBQUM7Z0JBQ2YsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztvQkFDdEMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLEVBQUUsQ0FBQzt3QkFDekIsSUFBSSxHQUFHLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO29CQUN6RCxDQUFDO3lCQUFNLENBQUM7d0JBQ04sSUFBSSxHQUFHLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO29CQUN4RCxDQUFDO2dCQUNILENBQUM7Z0JBQ0QsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLEtBQUssRUFBRSxDQUFDO29CQUMxQixJQUFJLElBQUksR0FBRyxDQUFDO2dCQUNkLENBQUM7Z0JBQ0QsS0FBSyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7WUFDcEIsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxXQUFXLENBQUMsSUFBUztRQUNuQixPQUFPLEdBQUcsSUFBSSxJQUFJLElBQUksR0FBRyxJQUFJLElBQUksSUFBSSxPQUFPLElBQUksSUFBSSxJQUFJLFFBQVEsSUFBSSxJQUFJLENBQUM7SUFDM0UsQ0FBQztJQUVELFNBQVMsQ0FBQyxJQUFTO1FBQ2pCLE9BQU8sU0FBUyxJQUFJLElBQUksSUFBSSxTQUFTLElBQUksSUFBSSxJQUFJLFNBQVMsSUFBSSxJQUFJLENBQUM7SUFDckUsQ0FBQztDQUNGO0FBRUQsTUFBTSxPQUFPLFNBQVM7SUFBdEI7UUFDRSxNQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ04sTUFBQyxHQUFHLENBQUMsQ0FBQztRQUNOLFVBQUssR0FBRyxDQUFDLENBQUM7UUFDVixXQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQ2IsQ0FBQztDQUFBO0FBRUQsTUFBTSxPQUFPLE9BQU87SUFBcEI7UUFDRSxZQUFPLEdBQUcsQ0FBQyxDQUFDO1FBQ1osWUFBTyxHQUFhLEVBQUUsQ0FBQztRQUN2QixZQUFPLEdBQWEsRUFBRSxDQUFDO1FBQ3ZCLGdCQUFXLEdBQWUsRUFBRSxDQUFDO1FBQzdCLG1FQUFtRTtRQUNuRSxXQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ2Q7Ozs7Ozs7O1dBUUc7UUFDSCxXQUFNLEdBQUcsS0FBSyxDQUFDO0lBOEJqQixDQUFDO0NBQUE7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLE9BQU8sWUFBWTtJQUF6QjtRQUNFLGtFQUFrRTtRQUNsRSxhQUFRLEdBQWMsRUFBRSxDQUFDO0lBQzNCLENBQUM7Q0FBQTtBQWVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFDSCxNQUFNLFVBQVUsYUFBYSxDQUFDLE1BQVc7SUFDdkMsSUFDRSxDQUFDLE1BQU07UUFDUCxNQUFNLFlBQVksU0FBUztRQUMzQixNQUFNLFlBQVksT0FBTztRQUN6QixNQUFNLFlBQVksWUFBWSxFQUM5QixDQUFDO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUNELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUNuQyxNQUFNLEtBQUssR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ2pDLEtBQUssQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFTLEVBQUUsRUFBRSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQzFFLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUNELElBQUksU0FBUyxJQUFJLE1BQU0sSUFBSSxTQUFTLElBQUksTUFBTSxFQUFFLENBQUM7UUFDL0MsT0FBTyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUNELElBQUksT0FBTyxJQUFJLE1BQU0sSUFBSSxRQUFRLElBQUksTUFBTSxFQUFFLENBQUM7UUFDNUMsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksU0FBUyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUNELDJFQUEyRTtJQUMzRSw4RUFBOEU7SUFDOUUsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVEOzs7Z0JBR2dCO0FBQ2hCLFNBQVMsY0FBYyxDQUFDLEdBQVE7SUFDOUIsSUFBSSxHQUFHLFlBQVksT0FBTztRQUFFLE9BQU8sR0FBRyxDQUFDO0lBQ3ZDLE1BQU0sT0FBTyxHQUFZLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxPQUFPLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUMzRCxPQUFPLENBQUMsT0FBTyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMzQyxPQUFPLENBQUMsT0FBTyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMzQyxPQUFPLENBQUMsT0FBTyxHQUFHLEdBQUcsQ0FBQyxPQUFPLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7SUFDeEQsT0FBTyxDQUFDLFdBQVcsR0FBRyxHQUFHLENBQUMsV0FBVyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDaEcsT0FBTyxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQztJQUNwQyxPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU2hhcGVTZWxlY3Rpb24gfSBmcm9tICcuL3NoYXBlJztcblxuZXhwb3J0IGNsYXNzIFJlZ2lvbiB7XG4gIC8qKiBTdGFibGUsIHVuaXF1ZSBpZGVudGl0eSBmb3Igc2VsZWN0aW9uIGFuZCBlcXVhbGl0eS4gTWludGVkIGJ5XG4gICAqICBQbG90bHlTZXJ2aWNlIHdoZW4gYSByZWdpb24gZmlyc3QgZW50ZXJzIHRoZSBzeXN0ZW0uIE5ldmVyIGRlcml2ZWRcbiAgICogIGZyb20gYXJyYXkgaW5kZXgg4oCUIG5hbWUgY29sbGlzaW9ucyBhY3Jvc3MgZGVsZXRlL2FkZCBjeWNsZXMgbXVzdFxuICAgKiAgbm90IGJyZWFrIFByaW1lTkcgcm93IHNlbGVjdGlvbi4gKi9cbiAgaWQhOiBudW1iZXI7XG4gIG5hbWUhOiBzdHJpbmc7XG4gIGJvdW5kcz86IFJlY3RhbmdsZSB8IFBvbHlnb24gfCBNdWx0aVBvbHlnb24gfCBudWxsID0gbnVsbDtcbiAgLyoqIHByb2ZpbGUgPSBhbiBpbnRlbnNpdHktcHJvZmlsZSBsaW5lIFJPSTsgcmVuZGVyZWQvZHJhZ2dlZCBsaWtlIGEgcmVnaW9uIGJ1dFxuICAgKiAgZXhjbHVkZWQgZnJvbSB0aGUgUmVnaW9ucyB0YWIgYW5kIGV4cG9ydHMuIFVzZSBgaXNQcm9maWxlKClgIHRvIHRlc3QgaXQg4oCUXG4gICAqICBpdCdzIHRoZSBjYW5vbmljYWwgbWFya2VyIHRoYXQgc2VwYXJhdGVzIGludGVuc2l0eSBsaW5lcyAob3duZWQgYnkgdGhlXG4gICAqICBpbnRlbnNpdHkgdG9vbCwgc2FtcGxlZCBpbnRvIHRoZSBpbnNldCkgZnJvbSBhbm5vdGF0aW9uIHJlZ2lvbnMgKG93bmVkIGJ5XG4gICAqICB0aGUgUmVnaW9uIEVkaXRvcikuIEJvdGggYmFja2VuZHMgKFBsb3RseSwgT1NEKSBob25vdXIgaXQuICovXG4gIGtpbmQ/OiAncHJvZmlsZSc7XG4gIC8qKlxuICAgKiBXaGljaCBhdXRvbWF0ZWQgdG9vbCBwcm9kdWNlZCB0aGlzIHJlZ2lvbiwgZS5nLiBgJ3lvbG8nYC4gQWJzZW50IG9uXG4gICAqIGFueXRoaW5nIHRoZSB1c2VyIGRyZXcuXG4gICAqXG4gICAqIExldHMgYSB0b29sIHJlcGxhY2UgaXRzICpvd24qIHByZXZpb3VzIG91dHB1dCBvbiBhIHJlLXJ1biB3aXRob3V0IHRvdWNoaW5nXG4gICAqIGhhbmQtZHJhd24gd29yayBvciBhbm90aGVyIHRvb2wncyByZXN1bHRzIOKAlCB3aGljaCBtYXR0ZXJzIHdoaWxlIHR1bmluZ1xuICAgKiBwYXJhbWV0ZXJzLCB3aGVyZSBldmVyeSBydW4gd291bGQgb3RoZXJ3aXNlIHBpbGUgb250byB0aGUgbGFzdC4gSWRlbnRpdHlcbiAgICogY29tcGFyaXNvbiBpcyBub3QgYSBzdWJzdGl0dXRlOiByZWdpb25zIG1heSBiZSByZS1taW50ZWQgYXMgdGhleSBwYXNzXG4gICAqIHRocm91Z2ggdGhlIHN0b3JlLCBzbyB0aGUgbWFya2VyIGhhcyB0byB0cmF2ZWwgd2l0aCB0aGUgZGF0YS5cbiAgICovXG4gIHNvdXJjZT86IHN0cmluZztcbiAgY29sb3I/OiBzdHJpbmc7IC8vIGhleCBzdHJpbmcsIGUuZy4gJyNSUkdHQkInICh0aGUgaGlzdG9yaWNhbCBcIltyLCBnLCBiXVwiIG5vdGUgaXMgc3RhbGUpXG4gIC8vIGNsYXNzIGxhYmVsXG4gIGxhYmVsPzogc3RyaW5nO1xuICAvKiogVHJ1ZSB3aGVuIHRoZSB1c2VyIHNldCB0aGlzIHJlZ2lvbidzIGNvbG91ciBleHBsaWNpdGx5IChSZWdpb24gRWRpdG9yIENvbG9yXG4gICAqICBjb2x1bW4pLiBQcmVzZXQgY29sb3VyIHJlc29sdXRpb24gKGppdC11aSM3MCkgc2tpcHMgb3ZlcnJpZGRlbiByZWdpb25zIHNvIGFcbiAgICogIG1hbnVhbCBjb2xvdXIgaXMgbm90IGNsb2JiZXJlZCB3aGVuIHByZXNldHMgYXJlIChyZSlhcHBsaWVkIG9uIGxvYWQvaW1wb3J0LiAqL1xuICBjb2xvck92ZXJyaWRkZW4/OiBib29sZWFuO1xuICBmaWxlbmFtZT86IHN0cmluZztcbiAgLyoqIFplcm8tYmFzZWQgei1zbGljZSB0aGlzIHJlZ2lvbiBiZWxvbmdzIHRvIHdpdGhpbiBhIHN0YWNrIOKAlCBtaXJyb3JzXG4gICAqICBRdVBhdGgncyBgZ2VvbWV0cnkucGxhbmUuemAgKGEgbWlzc2luZyBwbGFuZSAvIGRlZmF1bHQgcGxhbmUgcmVhZHMgYmFjayBhc1xuICAgKiAgMCkuIFVzZWQgdG8gcGxhY2UvZmlsdGVyIFJPSXMgcGVyIHNsaWNlOyAwIGZvciBhIHBsYWluIHNpbmdsZS1wbGFuZSBpbWFnZVxuICAgKiAgb3IgYSByZWdpb24gZHJhd24gd2l0aG91dCBhIHNsaWNlIGNvbnRleHQgKGppdC11aSM5MykuICovXG4gIHogPSAwO1xuICBzaGFwZUNvbG9yPyA9ICcjMDBGRkZGJztcbiAgYnl0ZXNQZXJQaXhlbCA9IDg7XG4gIC8qKlxuICAgKiByZXNvbHV0aW9uIGlzIHRoZSByZXNvbHV0aW9uIGF0IHdoaWNoIHRoZSByZWdpb25cbiAgICogd2FzIGZvdW5kLiBJbiBvcmRlciB0byBnZXQgaXQgaW4gdGhlIGZ1bGwgaW1hZ2VcbiAgICogY29vcmRpbmF0ZXMgaXQgd2lsbCBub3JtYWxseSBiZSAwLiBIb3dldmVyIGlmXG4gICAqIHRoZXJlIGlzIGEgbWlzdGFrZSB3aXRoIHRoZSByZXNvbHV0aW9uIGl0IG1heSBub3RcbiAgICogYmUuIFdlIHJldHVybiB0aGUgcmVzb2x1dGlvbiBoZXJlIGluIG9yZGVyIHRvIGJlXG4gICAqIHN1cmUgd2hhdCBpdCBpcy4gVGhlIHNlcnZlciBtYXkgbmVlZCB0byBiZSBjaGFuZ2VkXG4gICAqIHRvIGVuc3VyZSB0aGF0IHJlc3VsdHMgcmVnaW9ucyBhcmUgYWx3YXlzIHJldHVybmVkXG4gICAqIGF0IHJlc29sdXRpb24gPSAwXG4gICAqL1xuICByZXNvbHV0aW9uID0gMDtcbiAgY3JvcHBlZCA9IGZhbHNlO1xuICB0aWxlTnVtYmVyID0gMDtcbiAgdGlsZUNvb3JkaW5hdGVzOiBudW1iZXJbXSB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBUcnVlIGZvciBpbnRlbnNpdHktcHJvZmlsZSBsaW5lIFJPSXMgKHRoZSBpbnRlbnNpdHkgdG9vbCdzIGxpbmVzKS4gVGhlc2UgYXJlXG4gICAqICBOT1QgYW5ub3RhdGlvbiByZWdpb25zOiB0aGV5IG5ldmVyIGFwcGVhciBpbiB0aGUgUmVnaW9uIEVkaXRvciBhbmQgZWRpdG9yXG4gICAqICBvcGVyYXRpb25zIChzZWxlY3Qvc2F2ZS9kZWxldGUpIG11c3QgbmV2ZXIgdG91Y2ggdGhlbS4gKi9cbiAgaXNQcm9maWxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmtpbmQgPT09ICdwcm9maWxlJztcbiAgfVxuXG4gIHRvU3RyaW5nKCkge1xuICAgIC8vIGlmIHNoYXBlIGlzIHJlY3RhbmdsZVxuICAgIGlmICh0aGlzLmJvdW5kcyBpbnN0YW5jZW9mIFJlY3RhbmdsZSkge1xuICAgICAgcmV0dXJuIGB4OiAke3RoaXMuYm91bmRzLnh9LCB5OiAke3RoaXMuYm91bmRzLnl9LFxuICAgICAgICAgICAgICB3aWR0aDogJHt0aGlzLmJvdW5kcy53aWR0aH0sIGhlaWdodDogJHt0aGlzLmJvdW5kcy5oZWlnaHR9YDtcbiAgICB9IGVsc2UgaWYgKHRoaXMuYm91bmRzIGluc3RhbmNlb2YgUG9seWdvbikge1xuICAgICAgbGV0IHBhdGggPSAnTSc7XG4gICAgICAvLyBkaXNwbGF5IGFzIHBhdGhcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5ib3VuZHMubnBvaW50czsgaSsrKSB7XG4gICAgICAgIGlmIChpIDwgdGhpcy5ib3VuZHMubnBvaW50cyAtIDEpIHtcbiAgICAgICAgICBwYXRoID0gYCR7cGF0aH0ke3RoaXMuYm91bmRzLnhwb2ludHNbaV19LCR7dGhpcy5ib3VuZHMueXBvaW50c1tpXX1MYDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwYXRoID0gYCR7cGF0aH0ke3RoaXMuYm91bmRzLnhwb2ludHNbaV19LCR7dGhpcy5ib3VuZHMueXBvaW50c1tpXX1gO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5ib3VuZHMuY2xvc2VkICE9PSBmYWxzZSkge1xuICAgICAgICBwYXRoICs9ICdaJztcbiAgICAgIH1cbiAgICAgIHJldHVybiBwYXRoO1xuICAgIH1cbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIFNoYXBlU2VsZWN0aW9uIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIHRvXG4gICAqIGNyZWF0ZSBhIHNoYXBlIGluIFBsb3RseS5cbiAgICogQHBhcmFtIHNob3dSZWdpb25MYWJlbFxuICAgKiBAcmV0dXJuIFNoYXBlU2VsZWN0aW9uXG4gICAqL1xuICBnZXRTaGFwZShzaG93UmVnaW9uTGFiZWw6IGJvb2xlYW4gPSB0cnVlKTogU2hhcGVTZWxlY3Rpb24ge1xuICAgIGNvbnN0IHNoYXBlID0gbmV3IFNoYXBlU2VsZWN0aW9uKCk7XG4gICAgc2hhcGUuaWQgPSB0aGlzLmlkO1xuICAgIHNoYXBlLm5hbWUgPSB0aGlzLm5hbWU7XG4gICAgc2hhcGUuZWRpdGFibGUgPSB0cnVlO1xuICAgIHNoYXBlLmxpbmUgPSB7XG4gICAgICBjb2xvcjogdGhpcy5jb2xvciA/IHRoaXMuY29sb3IgOiB0aGlzLnNoYXBlQ29sb3IsXG4gICAgICB3aWR0aDogMyxcbiAgICB9O1xuICAgIHNoYXBlLmZpbGVOYW1lID0gdGhpcy5maWxlbmFtZTtcbiAgICBpZiAodGhpcy5raW5kID09PSAncHJvZmlsZScpIHNoYXBlLmtpbmQgPSAncHJvZmlsZSc7XG4gICAgaWYgKHNob3dSZWdpb25MYWJlbCkge1xuICAgICAgc2hhcGUubGFiZWwgPSB7XG4gICAgICAgIHRleHQ6IGAke3RoaXMubGFiZWx9YCxcbiAgICAgICAgdGV4dHRlbXBsYXRlOiBgJHt0aGlzLmxhYmVsfWAsXG4gICAgICAgIGZvbnQ6IHsgY29sb3I6IHRoaXMuY29sb3IgPyB0aGlzLmNvbG9yIDogdGhpcy5zaGFwZUNvbG9yIH0sXG4gICAgICAgIHRleHRwb3NpdGlvbjogJ3RvcCBsZWZ0JyxcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHNoYXBlLmxhYmVsID0ge307XG4gICAgfVxuICAgIHNoYXBlLmxlZ2VuZCA9IHRoaXMubGFiZWw7XG5cbiAgICBjb25zdCBibmRzID0gdGhpcy5ib3VuZHM7XG4gICAgaWYgKGJuZHMgIT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAodGhpcy5pc1JlY3RhbmdsZShibmRzKSkge1xuICAgICAgICBzaGFwZS50eXBlID0gJ3JlY3QnO1xuICAgICAgICBzaGFwZS54MCA9IGJuZHMueDtcbiAgICAgICAgc2hhcGUueTAgPSBibmRzLnk7XG4gICAgICAgIHNoYXBlLngxID0gYm5kcy54ICsgYm5kcy53aWR0aDtcbiAgICAgICAgc2hhcGUueTEgPSBibmRzLnkgKyBibmRzLmhlaWdodDtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmlzUG9seWdvbihibmRzKSkge1xuICAgICAgICBzaGFwZS50eXBlID0gJ3BhdGgnO1xuICAgICAgICBsZXQgcGF0aCA9ICdNJztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBibmRzLm5wb2ludHM7IGkrKykge1xuICAgICAgICAgIGlmIChpIDwgYm5kcy5ucG9pbnRzIC0gMSkge1xuICAgICAgICAgICAgcGF0aCA9IGAke3BhdGh9JHtibmRzLnhwb2ludHNbaV19LCR7Ym5kcy55cG9pbnRzW2ldfUxgO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXRoID0gYCR7cGF0aH0ke2JuZHMueHBvaW50c1tpXX0sJHtibmRzLnlwb2ludHNbaV19YDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJuZHMuY2xvc2VkICE9PSBmYWxzZSkge1xuICAgICAgICAgIHBhdGggKz0gJ1onO1xuICAgICAgICB9XG4gICAgICAgIHNoYXBlLnBhdGggPSBwYXRoO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc2hhcGU7XG4gIH1cblxuICBpc1JlY3RhbmdsZShibmRzOiBhbnkpOiBibmRzIGlzIFJlY3RhbmdsZSB7XG4gICAgcmV0dXJuICd4JyBpbiBibmRzICYmICd5JyBpbiBibmRzICYmICd3aWR0aCcgaW4gYm5kcyAmJiAnaGVpZ2h0JyBpbiBibmRzO1xuICB9XG5cbiAgaXNQb2x5Z29uKGJuZHM6IGFueSk6IGJuZHMgaXMgUG9seWdvbiB7XG4gICAgcmV0dXJuICducG9pbnRzJyBpbiBibmRzICYmICd4cG9pbnRzJyBpbiBibmRzICYmICd5cG9pbnRzJyBpbiBibmRzO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSZWN0YW5nbGUge1xuICB4ID0gMDtcbiAgeSA9IDA7XG4gIHdpZHRoID0gMDtcbiAgaGVpZ2h0ID0gMDtcbn1cblxuZXhwb3J0IGNsYXNzIFBvbHlnb24ge1xuICBucG9pbnRzID0gMDtcbiAgeHBvaW50czogbnVtYmVyW10gPSBbXTtcbiAgeXBvaW50czogbnVtYmVyW10gPSBbXTtcbiAgY29vcmRpbmF0ZXM6IG51bWJlcltdW10gPSBbXTtcbiAgLyoqIGZhbHNlIGZvciBvcGVuIHBvbHlsaW5lczsgdHJ1ZSAoZGVmYXVsdCkgZm9yIGNsb3NlZCBwb2x5Z29ucyAqL1xuICBjbG9zZWQgPSB0cnVlO1xuICAvKipcbiAgICogV2hlbiB0cnVlIHRoZSB2ZXJ0aWNlcyBhcmUgdHJlYXRlZCBhcyBiZXppZXItc3BsaW5lICoqYW5jaG9ycyoqIGFuZCB0aGVcbiAgICogcmVnaW9uIGlzIHJlbmRlcmVkL2V4cG9ydGVkIGFzIGEgc21vb3RoIGN1cnZlIHRocm91Z2ggdGhlbS4gVGhlIHZlcnRpY2VzXG4gICAqIHN0YXkgdGhlIGVkaXRhYmxlIGFuY2hvcnMg4oCUIHRvZ2dsaW5nIHRoaXMgZmxhZyBpcyB0aGUgdG9CZXppZXJcbiAgICogKGB0cnVlYCkgLyB0b1BvbHlnb24gKGBmYWxzZWApLCB3aGljaCBvbmx5IGFkZC9yZW1vdmUgdGhlIGN1cnZlLCBuZXZlciBtb3ZlXG4gICAqIHRoZSBhbmNob3JzLiBHZW9KU09OIGtlZXBzIHRoZSBmbGF0dGVuZWQgY3VydmUgYXMgdGhlIGdlb21ldHJ5IChzbyBRdVBhdGhcbiAgICogcmVuZGVycyBpdCkgcGx1cyB0aGUgYW5jaG9ycyArIGhhbmRsZXMgKyBmbGFnIGluIHByb3BlcnRpZXMgKHNvIEpJVFxuICAgKiByb3VuZC10cmlwcyB0aGUgZWRpdGFibGUgYmV6aWVyKS5cbiAgICovXG4gIGJlemllciA9IGZhbHNlO1xuICAvKipcbiAgICogUGVyLWFuY2hvciBjdWJpYy1iZXppZXIgY29udHJvbC1wb2ludCBvZmZzZXRzLCAqKnJlbGF0aXZlKiogdG8gdGhlaXIgYW5jaG9yXG4gICAqIChzbyB0aGV5IHRyYW5zbGF0ZSB3aXRoIGl0KS4gUHJlc2VudCBvbmx5IGZvciBiZXppZXIgcmVnaW9uczsgaW5pdGlhbGlzZWRcbiAgICogZnJvbSB0aGUgQ2F0bXVsbC1Sb20gY29uc3RydWN0aW9uIChhIHNtb290aCBjdXJ2ZSkgd2hlbiBiZXppZXIgaXMgdHVybmVkIG9uLFxuICAgKiB0aGVuIGluZGl2aWR1YWxseSBlZGl0YWJsZSBieSBkcmFnZ2luZyB0aGUgaGFuZGxlcy4gYGhhbmRsZXNJbltpXWAgL1xuICAgKiBgaGFuZGxlc091dFtpXWAgYXJlIGBbZHgsIGR5XWAgZm9yIHZlcnRleCBgaWAuXG4gICAqL1xuICBoYW5kbGVzSW4/OiBudW1iZXJbXVtdO1xuICBoYW5kbGVzT3V0PzogbnVtYmVyW11bXTtcblxuICAvKipcbiAgICogSW50ZXJpb3IgcmluZ3MgKGhvbGVzKSDigJQgaml0LXVpIzg1LiBFYWNoIHJpbmcgaXMgYSBsaXN0IG9mIGBbeCwgeV1gXG4gICAqIGltYWdlLXBpeGVsIHBhaXJzIGluIHRoZSBTQU1FIGNsb3NlZC1wb2x5Z29uIGNvbnZlbnRpb24gYXMgdGhlIGV4dGVyaW9yXG4gICAqIChgY29vcmRpbmF0ZXNgKTogbm8gcmVwZWF0ZWQgY2xvc2luZyBwb2ludC4gUHJlc2VudCBvbmx5IG9uIGNsb3NlZCBwb2x5Z29ucy5cbiAgICogQSBwb2ludCBpbnNpZGUgdGhlIGV4dGVyaW9yICoqYW5kKiogaW5zaWRlIGFueSBob2xlIGlzIE9VVFNJREUgdGhlIHJlZ2lvblxuICAgKiAoZXZlbi1vZGQgcnVsZSkuIEFic2VudC9lbXB0eSA9PSBhIHNvbGlkIHBvbHlnb24gKHRoZSBwcmlvciBiZWhhdmlvdXIpLCBzb1xuICAgKiBldmVyeSBleGlzdGluZyByZWdpb24gaXMgdW5hZmZlY3RlZC5cbiAgICovXG4gIGhvbGVzPzogbnVtYmVyW11bXVtdO1xuXG4gIC8qKlxuICAgKiBQZXItaG9sZSBiw6l6aWVyIGNvbnRyb2wtcG9pbnQgb2Zmc2V0cywgcGFyYWxsZWwgdG8ge0BsaW5rIGhvbGVzfSAob25lIGVudHJ5IHBlciByaW5nLCBlYWNoIGFcbiAgICogbGlzdCBvZiBgW2R4LCBkeV1gIHBlciByaW5nIHZlcnRleCwgKipyZWxhdGl2ZSoqIHRvIHRoZSB2ZXJ0ZXgpLiBQcmVzZW50IG9ubHkgd2hlbiBgYmV6aWVyYCBpc1xuICAgKiBvbiBmb3IgYSBkb251dCDigJQgc2VlZGVkIGZyb20gdGhlIENhdG11bGwtUm9tIGRlZmF1bHQgYW5kIGluZGl2aWR1YWxseSBlZGl0YWJsZSwgZXhhY3RseSBsaWtlXG4gICAqIHRoZSBleHRlcmlvciB7QGxpbmsgaGFuZGxlc0lufS97QGxpbmsgaGFuZGxlc091dH0uIFNvIGEgZG9udXQgc21vb3RoZWQgdG8gYSBiw6l6aWVyIGN1cnZlcyBpdHNcbiAgICogaG9sZXMgdG9vIChqaXQtdWkjMTAyKS5cbiAgICovXG4gIGhvbGVIYW5kbGVzSW4/OiBudW1iZXJbXVtdW107XG4gIGhvbGVIYW5kbGVzT3V0PzogbnVtYmVyW11bXVtdO1xufVxuXG4vKipcbiAqIEEgcmVnaW9uIHdob3NlIGdlb21ldHJ5IGlzIHNldmVyYWwgZGlzam9pbnQgcGFydHMg4oCUIGUuZy4gdGhlIHJlc3VsdCBvZiBtZXJnaW5nXG4gKiB0d28gbm9uLXRvdWNoaW5nIHJlZ2lvbnMsIG9yIHRoZSBpbnZlcnNlIG9mIGEgYmxvYiAoaml0LXVpIzg1KS4gRWFjaCBwYXJ0IGlzIGFcbiAqIGNsb3NlZCB7QGxpbmsgUG9seWdvbn0gdGhhdCBtYXkgY2FycnkgaXRzIG93biBob2xlcywgc28gYSBNdWx0aVBvbHlnb25cbiAqIHJlcHJlc2VudHMgXCJzcGFyc2UgYml0cywgc29tZSB3aXRoIGRvbnV0IGhvbGVzXCIgYXMgYSBzaW5nbGUgcmVnaW9uLiBNYXBzIDE6MVxuICogb250byBhIEdlb0pTT04gYE11bHRpUG9seWdvbmAgKGFuZCBRdVBhdGgncyBnZW9tZXRyeSkuXG4gKlxuICogQSBzaW5nbGUtcGFydCBNdWx0aVBvbHlnb24gaXMgZXF1aXZhbGVudCB0byB0aGF0IFBvbHlnb247IGNhbGxlcnMgc2hvdWxkXG4gKiBwcmVmZXIgYSBwbGFpbiB7QGxpbmsgUG9seWdvbn0gZm9yIG9uZSBjb25uZWN0ZWQgcGFydC5cbiAqL1xuZXhwb3J0IGNsYXNzIE11bHRpUG9seWdvbiB7XG4gIC8qKiBPbmUgb3IgbW9yZSBkaXNqb2ludCBjbG9zZWQgcG9seWdvbnMgKGVhY2ggbWF5IGhhdmUgaG9sZXMpLiAqL1xuICBwb2x5Z29uczogUG9seWdvbltdID0gW107XG59XG5cbmV4cG9ydCB0eXBlIEJvdW5kcyA9XG4gIHwgUmVjdGFuZ2xlXG4gIHwgUG9seWdvblxuICB8IHtcbiAgICAgIHg/OiBudW1iZXI7XG4gICAgICB5PzogbnVtYmVyO1xuICAgICAgd2lkdGg/OiBudW1iZXI7XG4gICAgICBoZWlnaHQ/OiBudW1iZXI7XG4gICAgICBucG9pbnRzPzogbnVtYmVyO1xuICAgICAgeHBvaW50cz86IG51bWJlcltdO1xuICAgICAgeXBvaW50cz86IG51bWJlcltdO1xuICAgIH07XG5cbi8qKlxuICogUmVidWlsZCBhIHBsYWluLW9iamVjdCBgYm91bmRzYCBhcyB0aGUgY2xhc3MgaW5zdGFuY2UgdGhlIHJlbmRlcmVycyBleHBlY3RcbiAqIChqaXQtdWkjMTI0KS5cbiAqXG4gKiBSZWdpb25zIHRoYXQgYXJyaXZlIGFzIEpTT04g4oCUIGEgaG9zdCdzIHNlcnZlciByZXNwb25zZSwgYSBgc3RydWN0dXJlZENsb25lYCxcbiAqIGFueXRoaW5nIHRoYXQgaGFzIGJlZW4gdGhyb3VnaCBgSlNPTi5wYXJzZWAg4oCUIGNhcnJ5IGEgYGJvdW5kc2AgdGhhdCBoYXMgdGhlXG4gKiByaWdodCAqZmllbGRzKiBidXQgbm90IHRoZSByaWdodCAqcHJvdG90eXBlKi4gVGhlIHJlbmRlcmVycyBkaXNhZ3JlZSBhYm91dFxuICogd2hldGhlciB0aGF0IGlzIGFjY2VwdGFibGU6IGBSZWdpb24uZ2V0U2hhcGUoKWAgKFBsb3RseSkgYW5kIHRoZSBuYXBhcmlcbiAqIG92ZXJsYXkgZHVjay10eXBlIHRoZSBib3VuZHMsIHdoaWxlIHRoZSBPcGVuU2VhZHJhZ29uIG92ZXJsYXkgZGlzY3JpbWluYXRlc1xuICogd2l0aCBgYm91bmRzIGluc3RhbmNlb2YgUmVjdGFuZ2xlYC4gU28gYSBKU09OIHJlZ2lvbiBkcmV3IGluIEhlYXRtYXAgbW9kZSBhbmRcbiAqIHNpbGVudGx5IHZhbmlzaGVkIGluIEltYWdlIG1vZGUuIGBpbnN0YW5jZW9mYCBhbHNvIGdhdGVzIHRoZSBzdG9yZSdzIG93blxuICogZ2VvbWV0cnkgZGUtZHVwbGljYXRpb24sIGBtb3ZlUmVnaW9uYCwgYW5kIHRoZSBHZW9KU09OIGV4cG9ydCDigJQgYSBKU09OIHJlZ2lvblxuICogaXMgdW5kcmFnZ2FibGUgYW5kIGFic2VudCBmcm9tIGEgc2F2ZSBpbiAqZXZlcnkqIG1vZGUuXG4gKlxuICogUmF0aGVyIHRoYW4gZHVjay10eXBlIH4yMCBjYWxsIHNpdGVzLCB0aGUgc3RvcmUgbm9ybWFsaXplcyBoZXJlIG9uIHRoZSB3YXkgaW4sXG4gKiBzbyBldmVyeXRoaW5nIGRvd25zdHJlYW0gY2FuIGtlZXAgcmVseWluZyBvbiBgaW5zdGFuY2VvZmAuIFZhbHVlcyB0aGF0IGFyZVxuICogYWxyZWFkeSBpbnN0YW5jZXMgYXJlIHJldHVybmVkICoqYnkgcmVmZXJlbmNlKiosIHVudG91Y2hlZDogb3ZlcmxheXMgYW5kIHRvb2xzXG4gKiBob2xkIG9udG8gdGhlIGJvdW5kcyB0aGV5IGNyZWF0ZWQgYW5kIG11dGF0ZSB0aGVtIGluIHBsYWNlIGR1cmluZyBhIGRyYWcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoeWRyYXRlQm91bmRzKGJvdW5kczogYW55KTogUmVjdGFuZ2xlIHwgUG9seWdvbiB8IE11bHRpUG9seWdvbiB8IG51bGwgfCB1bmRlZmluZWQge1xuICBpZiAoXG4gICAgIWJvdW5kcyB8fFxuICAgIGJvdW5kcyBpbnN0YW5jZW9mIFJlY3RhbmdsZSB8fFxuICAgIGJvdW5kcyBpbnN0YW5jZW9mIFBvbHlnb24gfHxcbiAgICBib3VuZHMgaW5zdGFuY2VvZiBNdWx0aVBvbHlnb25cbiAgKSB7XG4gICAgcmV0dXJuIGJvdW5kcztcbiAgfVxuICBpZiAoQXJyYXkuaXNBcnJheShib3VuZHMucG9seWdvbnMpKSB7XG4gICAgY29uc3QgbXVsdGkgPSBuZXcgTXVsdGlQb2x5Z29uKCk7XG4gICAgbXVsdGkucG9seWdvbnMgPSBib3VuZHMucG9seWdvbnMubWFwKChwYXJ0OiBhbnkpID0+IGh5ZHJhdGVQb2x5Z29uKHBhcnQpKTtcbiAgICByZXR1cm4gbXVsdGk7XG4gIH1cbiAgaWYgKCducG9pbnRzJyBpbiBib3VuZHMgfHwgJ3hwb2ludHMnIGluIGJvdW5kcykge1xuICAgIHJldHVybiBoeWRyYXRlUG9seWdvbihib3VuZHMpO1xuICB9XG4gIGlmICgnd2lkdGgnIGluIGJvdW5kcyAmJiAnaGVpZ2h0JyBpbiBib3VuZHMpIHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihuZXcgUmVjdGFuZ2xlKCksIGJvdW5kcyk7XG4gIH1cbiAgLy8gTm90aGluZyByZWNvZ25pc2FibGUg4oCUIGhhbmQgaXQgYmFjayByYXRoZXIgdGhhbiBjb2VyY2UgaXQgaW50byB0aGUgd3JvbmdcbiAgLy8gZ2VvbWV0cnkuIEl0IHJlbmRlcnMgbm93aGVyZSBlaXRoZXIgd2F5LCBidXQgYSBjYWxsZXIgY2FuIHN0aWxsIGluc3BlY3QgaXQuXG4gIHJldHVybiBib3VuZHM7XG59XG5cbi8qKiB7QGxpbmsgaHlkcmF0ZUJvdW5kc30gZm9yIG9uZSBwb2x5Z29uLCBkZXJpdmluZyB0aGUgZmllbGRzIGEgbGVhbiBzZXJpYWxpemVyXG4gKiAgb21pdHM6IEpJVCdzIEphdmEgYFBvbHlnb25TZXJpYWxpemVyYCB3cml0ZXMgb25seSBgbnBvaW50c2AvYHhwb2ludHNgL1xuICogIGB5cG9pbnRzYCwgd2hpbGUgdGhlIEdlb0pTT04gZXhwb3J0IHJlYWRzIGBjb29yZGluYXRlc2AgYW5kIHRoZSBvdmVybGF5cyByZWFkXG4gKiAgYGNsb3NlZGAuICovXG5mdW5jdGlvbiBoeWRyYXRlUG9seWdvbihyYXc6IGFueSk6IFBvbHlnb24ge1xuICBpZiAocmF3IGluc3RhbmNlb2YgUG9seWdvbikgcmV0dXJuIHJhdztcbiAgY29uc3QgcG9seWdvbjogUG9seWdvbiA9IE9iamVjdC5hc3NpZ24obmV3IFBvbHlnb24oKSwgcmF3KTtcbiAgcG9seWdvbi54cG9pbnRzID0gWy4uLihyYXcueHBvaW50cyA/PyBbXSldO1xuICBwb2x5Z29uLnlwb2ludHMgPSBbLi4uKHJhdy55cG9pbnRzID8/IFtdKV07XG4gIHBvbHlnb24ubnBvaW50cyA9IHJhdy5ucG9pbnRzID8/IHBvbHlnb24ueHBvaW50cy5sZW5ndGg7XG4gIHBvbHlnb24uY29vcmRpbmF0ZXMgPSByYXcuY29vcmRpbmF0ZXMgPz8gcG9seWdvbi54cG9pbnRzLm1hcCgoeCwgaSkgPT4gW3gsIHBvbHlnb24ueXBvaW50c1tpXV0pO1xuICBwb2x5Z29uLmNsb3NlZCA9IHJhdy5jbG9zZWQgPz8gdHJ1ZTtcbiAgcmV0dXJuIHBvbHlnb247XG59XG4iXX0=