@whoj/box-vue
Version:
Box Ui Elements as Vue (2 & 3) Component
332 lines • 53.9 kB
JavaScript
/**
* @module @whoj/box-vue
* @version 1.0.0-beta.8
* @copyright 2023 Jonson B. All rights reserved.
*/
import { isDef, getProperty, getGlobal, template, objectKeys, hasProperty, objectEntries, unrefOf, isArray } from '@whoj/utils';
import { ref, unref, defineComponent, readonly, watchEffect } from 'vue-demi';
import { tryOnUnmounted, useVModel, whenever } from '@vueuse/core';
import { useHead } from '@unhead/vue';
import { createVNode, mergeProps } from 'vue';
function useCdn(boxEl, {
cdn,
style,
onload,
version,
disposeOnUnmount = true
}) {
version = version || (boxEl === "preview" ? "2.91.0" : "17.0.0");
const element = boxEl === "preview" ? "preview" : "elements";
const {
css,
js
} = cdn || {
css: `https://cdn01.boxcdn.net/platform/${element}/${version}/en-US/${boxEl}.css`,
js: `https://cdn01.boxcdn.net/platform/${element}/${version}/en-US/${boxEl}.js`
};
const loaded = ref(false);
const head = useHead({
link: [{
href: css,
rel: "stylesheet",
key: `whoj-box-vue__${boxEl}-css`
}],
script: [{
src: js,
fetchpriority: "high",
type: "text/javascript",
key: `whoj-box-vue__${boxEl}-js`,
onload(e) {
loaded.value = true;
isDef(onload) && onload(e);
}
}],
style: style ? [{
innerHTML: unref(style),
key: `whoj-box-vue__${boxEl}-style`
}] : void 0
});
tryOnUnmounted(() => {
if (disposeOnUnmount) {
head.dispose();
}
});
const newBoxEl = () => {
if (!loaded.value) {
return void 0;
}
return new (getProperty(getGlobal().Box, BoxUiElements[boxEl]))();
};
return {
head,
loaded,
newBoxEl
};
}
let _counter = 0;
class BoxElementFactory {
constructor(name) {
this.name = name;
}
props = {
/**
* File/Folder ID depending on the Element you're using
*/
modelValue: {
type: String,
required: true
},
/**
* Auth Access Token to use for request
*/
accessToken: {
type: String,
required: true
},
/**
* Custom CDN links to use for specific element/component
*/
cdn: {
type: Object,
required: false
},
/**
* Options
*/
options: {
type: null,
default: () => ({})
},
/**
* Version of box-ui-elements to use.
* It will have no effect when using custom cdn links
*/
version: {
type: String,
required: false
},
/**
* Whether to dispose the Head on unmount
*/
height: {
type: String,
default: "350px"
},
/**
* Whether to dispose the Head on unmount
*/
disposeOnUnmount: {
type: Boolean,
default: true
},
/**
* Whether to render the component immediately after load
*/
immediate: {
type: Boolean,
default: true
},
/**
* Whether to dispose the Head on unmount
*/
show: {
type: Boolean,
default: true
}
};
create(name, events) {
return defineComponent({
name: this.name,
props: this.props,
emits: events,
expose: ["instance"],
setup(props, {
attrs,
emit,
expose
}) {
const fid = useVModel(props, "modelValue", emit);
const id = attrs.id || `box__${name}__wrapper${++_counter}`;
const {
getInstance,
instance,
loaded
} = useBoxElement(
fid,
props.accessToken,
// @ts-ignore
{
...props.options || {},
cdn: props.cdn,
el: name,
disposeOnUnmount: props.disposeOnUnmount,
immediate: props.immediate,
container: `#${id}`,
version: props.version,
style: `.box-ui-element-wrapper > :first-child { height: ${props.height}; }`,
listeners: objectKeys(events).filter((name2) => !["update:model-value"].includes(name2)).reduce((evt, name2) => ({
...evt,
[name2]: (args) => {
emit(name2, args);
}
}), {})
}
);
expose({
instance: readonly(instance.value)
});
watchEffect(() => {
if (loaded && getInstance()?.show) {
emit("initiated", getInstance());
try {
if (fid.value?.length) {
getInstance().show(fid.value, props.accessToken, {
...props.options,
container: `#${id}`
});
} else {
getInstance().hide();
}
} catch (e) {
}
}
});
return () => createVNode("div", mergeProps(attrs, {
"id": id,
"className": "box-ui-element-wrapper"
}), null);
}
});
}
}
function GenericBoxElement(name, events) {
const _events = {
...events,
"initiated": (args) => true,
"update:model-value": (args) => true
};
const component = new BoxElementFactory(template("Box{0}", BoxUiElements[name]));
return component.create(name, _events);
}
var BoxUiElements = /* @__PURE__ */ ((BoxUiElements2) => {
BoxUiElements2["explorer"] = "ContentExplorer";
BoxUiElements2["picker"] = "FilePicker";
BoxUiElements2["preview"] = "Preview";
BoxUiElements2["sidebar"] = "ContentSidebar";
BoxUiElements2["uploader"] = "ContentUploader";
return BoxUiElements2;
})(BoxUiElements || {});
function useBoxElement(id, accessToken, {
cdn,
disposeOnUnmount,
el,
immediate = true,
listeners,
onload,
version,
style,
...options
}) {
const instance = ref();
const getInstance = () => instance.value;
const {
loaded,
newBoxEl
} = useCdn(el, {
cdn,
style,
version,
onload,
disposeOnUnmount
});
whenever(() => loaded.value, () => {
if (!getInstance() || !hasProperty(getInstance(), "addListener")) {
instance.value = newBoxEl();
}
if (listeners) {
objectEntries(listeners).forEach(([event, listener]) => {
getInstance().addListener(event, listener);
});
}
if (immediate) {
getInstance().show(unrefOf(id), unrefOf(accessToken), options || {});
}
});
return {
loaded,
instance,
newBoxEl,
getInstance
};
}
const EXPLORER_EVENTS = {
select: (payload) => isArray(payload),
rename: (payload) => isDef(payload),
preview: (payload) => isDef(payload),
download: (payload) => isArray(payload),
delete: (payload) => isArray(payload),
upload: (payload) => isArray(payload),
navigate: (payload) => isDef(payload),
create: (payload) => isDef(payload)
};
function useBoxContentExplorer(fileId, accessToken, options) {
return useBoxElement(fileId, accessToken, {
disposeOnUnmount: true,
...options || {},
el: "explorer"
});
}
const BoxContentExplorer = /* @__PURE__ */ GenericBoxElement("explorer", EXPLORER_EVENTS);
const PREVIEW_EVENTS = {
viewer: (args) => isDef(args),
load: (args) => isDef(args),
navigate: (args) => isDef(args),
notification: (args) => isDef(args),
viewerevent: (args) => isDef(args)
};
function useBoxPreview(fileId, accessToken, options) {
return useBoxElement(fileId, accessToken, {
disposeOnUnmount: true,
...options || {},
el: "preview"
});
}
const BoxPreview = /* @__PURE__ */ GenericBoxElement("preview", PREVIEW_EVENTS);
const PICKER_EVENTS = {
choose: (args) => isDef(args),
cancel: () => true
};
function useBoxFilePicker(fileId, accessToken, options) {
return useBoxElement(fileId, accessToken, {
disposeOnUnmount: true,
...options || {},
el: "picker"
});
}
const BoxFilePicker = /* @__PURE__ */ GenericBoxElement("picker", PICKER_EVENTS);
const SIDEBAR_EVENTS = {};
function useBoxContentSidebar(fileId, accessToken, options) {
return useBoxElement(fileId, accessToken, {
disposeOnUnmount: true,
...options || {},
el: "sidebar"
});
}
const BoxContentSidebar = /* @__PURE__ */ GenericBoxElement("sidebar", SIDEBAR_EVENTS);
const UPLOADER_EVENTS = {
close: () => true,
complete: (payload) => isArray(payload),
error: (args) => isDef(args),
upload: (payload) => isDef(payload)
};
function useBoxContentUploader(fileId, accessToken, options) {
return useBoxElement(fileId, accessToken, {
disposeOnUnmount: true,
...options || {},
el: "uploader"
});
}
const BoxContentUploader = /* @__PURE__ */ GenericBoxElement("uploader", UPLOADER_EVENTS);
export { BoxContentExplorer, BoxContentSidebar, BoxContentUploader, BoxFilePicker, BoxPreview, useBoxContentExplorer, useBoxContentSidebar, useBoxContentUploader, useBoxFilePicker, useBoxPreview };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgubWpzIiwic291cmNlcyI6WyIuLi9zcmMvY29tcG9uZW50cy91aS1lbGVtZW50cy9jZG4udHMiLCIuLi9zcmMvY29tcG9uZW50cy91aS1lbGVtZW50cy9ib3gtZWxlbWVudC50c3giLCIuLi9zcmMvY29tcG9uZW50cy91aS1lbGVtZW50cy91c2VCb3hFbGVtZW50LnRzIiwiLi4vc3JjL2NvbXBvbmVudHMvdWktZWxlbWVudHMvZXhwbG9yZXIudHN4IiwiLi4vc3JjL2NvbXBvbmVudHMvdWktZWxlbWVudHMvcHJldmlldy50c3giLCIuLi9zcmMvY29tcG9uZW50cy91aS1lbGVtZW50cy9waWNrZXIudHN4IiwiLi4vc3JjL2NvbXBvbmVudHMvdWktZWxlbWVudHMvc2lkZWJhci50c3giLCIuLi9zcmMvY29tcG9uZW50cy91aS1lbGVtZW50cy91cGxvYWRlci50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBSZWYgfSBmcm9tICd2dWUtZGVtaSc7XG5pbXBvcnQgeyB1c2VIZWFkIH0gZnJvbSAnQHVuaGVhZC92dWUnO1xuaW1wb3J0IHsgcmVmLCB1bnJlZiB9IGZyb20gJ3Z1ZS1kZW1pJztcbmltcG9ydCB7IHRyeU9uVW5tb3VudGVkIH0gZnJvbSAnQHZ1ZXVzZS9jb3JlJztcbmltcG9ydCB7IGdldEdsb2JhbCwgZ2V0UHJvcGVydHksIGlzRGVmIH0gZnJvbSAnQHdob2ovdXRpbHMnO1xuaW1wb3J0IHR5cGUgeyBDb25zdHJ1Y3RvciwgRnVuYywgTWF5YmVSZWYgfSBmcm9tICdAd2hvai91dGlscyc7XG5cbmltcG9ydCB0eXBlIHsgQ2RuT3B0aW9uIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgQm94VWlFbGVtZW50cyB9IGZyb20gJy4vdXNlQm94RWxlbWVudCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXNlQ2RuT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBDdXN0b20gQ0ROIGxpbmtzIHRvIHVzZSBmb3Igc3BlY2lmaWMgZWxlbWVudC9jb21wb25lbnRcbiAgICovXG4gIGNkbj86IENkbk9wdGlvbjtcblxuICAvKipcbiAgICogVmVyc2lvbiBvZiBib3gtdWktZWxlbWVudHMgdG8gdXNlLlxuICAgKiBJdCB3aWxsIGhhdmUgbm8gZWZmZWN0IHdoZW4gdXNpbmcgY3VzdG9tIGNkbiBsaW5rc1xuICAgKi9cbiAgdmVyc2lvbj86IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciB0byBkaXNwb3NlIHRoZSBIZWFkIG9uIHVubW91bnRcbiAgICovXG4gIGRpc3Bvc2VPblVubW91bnQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBTY3JpcHQgb25sb2FkIGhhbmRsZXJcbiAgICovXG4gIG9ubG9hZD86IEZ1bmM8RXZlbnQsIHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBDc3MgQ29kZSBhcyBzdHJpbmdcbiAgICovXG4gIHN0eWxlPzogTWF5YmVSZWY8c3RyaW5nPjtcbn1cblxuaW50ZXJmYWNlIFVzZUNkblJldHVybjxUIGV4dGVuZHMgb2JqZWN0ID0gYW55PiB7XG4gIGhlYWQ6IEV4Y2x1ZGU8UmV0dXJuVHlwZTx0eXBlb2YgdXNlSGVhZD4sIHZvaWQ+O1xuICBsb2FkZWQ6IFJlZjxib29sZWFuPjtcbiAgbmV3Qm94RWwoKTogVCB8IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZUNkbjxUIGV4dGVuZHMgb2JqZWN0ID0gYW55PihcbiAgYm94RWw6IGtleW9mIHR5cGVvZiBCb3hVaUVsZW1lbnRzLFxuICB7IGNkbiwgc3R5bGUsIG9ubG9hZCwgdmVyc2lvbiwgZGlzcG9zZU9uVW5tb3VudCA9IHRydWUgfTogVXNlQ2RuT3B0aW9uc1xuKTogVXNlQ2RuUmV0dXJuPFQ+IHtcbiAgdmVyc2lvbiA9IHZlcnNpb24gfHwgKGJveEVsID09PSAncHJldmlldycgPyAnMi45MS4wJyA6ICcxNy4wLjAnKTtcbiAgY29uc3QgZWxlbWVudCA9IGJveEVsID09PSAncHJldmlldycgPyAncHJldmlldycgOiAnZWxlbWVudHMnO1xuXG4gIGNvbnN0IHsgY3NzLCBqcyB9ID0gY2RuIHx8IHtcbiAgICBjc3M6IGBodHRwczovL2NkbjAxLmJveGNkbi5uZXQvcGxhdGZvcm0vJHtlbGVtZW50fS8ke3ZlcnNpb259L2VuLVVTLyR7Ym94RWx9LmNzc2AsXG4gICAganM6IGBodHRwczovL2NkbjAxLmJveGNkbi5uZXQvcGxhdGZvcm0vJHtlbGVtZW50fS8ke3ZlcnNpb259L2VuLVVTLyR7Ym94RWx9LmpzYFxuICB9O1xuXG4gIGNvbnN0IGxvYWRlZCA9IHJlZihmYWxzZSk7XG4gIGNvbnN0IGhlYWQgPSB1c2VIZWFkKHtcbiAgICBsaW5rOiBbXG4gICAgICB7XG4gICAgICAgIGhyZWY6IGNzcyxcbiAgICAgICAgcmVsOiAnc3R5bGVzaGVldCcsXG4gICAgICAgIGtleTogYHdob2otYm94LXZ1ZV9fJHtib3hFbH0tY3NzYFxuICAgICAgfVxuICAgIF0sXG4gICAgc2NyaXB0OiBbXG4gICAgICB7XG4gICAgICAgIHNyYzoganMsXG4gICAgICAgIGZldGNocHJpb3JpdHk6ICdoaWdoJyxcbiAgICAgICAgdHlwZTogJ3RleHQvamF2YXNjcmlwdCcsXG4gICAgICAgIGtleTogYHdob2otYm94LXZ1ZV9fJHtib3hFbH0tanNgLFxuICAgICAgICBvbmxvYWQoZSkge1xuICAgICAgICAgIGxvYWRlZC52YWx1ZSA9IHRydWU7XG4gICAgICAgICAgaXNEZWYob25sb2FkKSAmJiBvbmxvYWQoZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICBdLFxuICAgIHN0eWxlOiBzdHlsZVxuICAgICAgPyBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgaW5uZXJIVE1MOiB1bnJlZihzdHlsZSksXG4gICAgICAgICAgICBrZXk6IGB3aG9qLWJveC12dWVfXyR7Ym94RWx9LXN0eWxlYFxuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgOiB1bmRlZmluZWRcbiAgfSkgYXMgVXNlQ2RuUmV0dXJuWydoZWFkJ107XG5cbiAgdHJ5T25Vbm1vdW50ZWQoKCkgPT4ge1xuICAgIGlmIChkaXNwb3NlT25Vbm1vdW50KSB7XG4gICAgICBoZWFkLmRpc3Bvc2UoKTtcbiAgICB9XG4gIH0pO1xuXG4gIGNvbnN0IG5ld0JveEVsID0gKCkgPT4ge1xuICAgIGlmICghbG9hZGVkLnZhbHVlKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IChnZXRQcm9wZXJ0eShnZXRHbG9iYWwoKS5Cb3gsIEJveFVpRWxlbWVudHNbYm94RWxdKSBhcyB1bmtub3duIGFzIENvbnN0cnVjdG9yPFQ+KSgpO1xuICB9O1xuXG4gIHJldHVybiB7XG4gICAgaGVhZCxcbiAgICBsb2FkZWQsXG4gICAgbmV3Qm94RWxcbiAgfTtcbn1cbiIsImltcG9ydCB0eXBlIHtcbiAgQ29tcG9uZW50T3B0aW9uc01peGluLFxuICBPYmplY3RFbWl0c09wdGlvbnMsXG4gIFByb3BUeXBlXG59IGZyb20gJ3Z1ZS1kZW1pJztcbmltcG9ydCB7IHVzZVZNb2RlbCB9IGZyb20gJ0B2dWV1c2UvY29yZSc7XG5pbXBvcnQgeyBvYmplY3RLZXlzLCB0ZW1wbGF0ZSB9IGZyb20gJ0B3aG9qL3V0aWxzJztcbmltcG9ydCB7IGRlZmluZUNvbXBvbmVudCwgcmVhZG9ubHksIHdhdGNoRWZmZWN0IH0gZnJvbSAndnVlLWRlbWknO1xuXG5pbXBvcnQgeyBCb3hVaUVsZW1lbnRzLCB1c2VCb3hFbGVtZW50IH0gZnJvbSAnLi91c2VCb3hFbGVtZW50JztcbmltcG9ydCB0eXBlIHsgQm94VWlFbGVtZW50TmFtZSB9IGZyb20gJy4vdXNlQm94RWxlbWVudCc7XG5pbXBvcnQgdHlwZSB7IEJhc2VFbCwgQ2RuT3B0aW9uIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5sZXQgX2NvdW50ZXIgPSAwO1xuXG4vKipcbiAqIEBjbGFzcyBCb3hFbGVtZW50RmFjdG9yeVxuICovXG5jbGFzcyBCb3hFbGVtZW50RmFjdG9yeTxFbCBleHRlbmRzIEJhc2VFbDxPcHQsIEV2dD4sIE9wdCBleHRlbmRzIG9iamVjdCwgRXZ0IGV4dGVuZHMgT2JqZWN0RW1pdHNPcHRpb25zPiB7XG4gIHJlYWRvbmx5IHByb3BzID0ge1xuICAgIC8qKlxuICAgICAqIEZpbGUvRm9sZGVyIElEIGRlcGVuZGluZyBvbiB0aGUgRWxlbWVudCB5b3UncmUgdXNpbmdcbiAgICAgKi9cbiAgICBtb2RlbFZhbHVlOiB7XG4gICAgICB0eXBlOiBTdHJpbmcgYXMgUHJvcFR5cGU8c3RyaW5nIHwgbnVsbD4sXG4gICAgICByZXF1aXJlZDogdHJ1ZVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBBdXRoIEFjY2VzcyBUb2tlbiB0byB1c2UgZm9yIHJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NUb2tlbjoge1xuICAgICAgdHlwZTogU3RyaW5nIGFzIFByb3BUeXBlPHN0cmluZz4sXG4gICAgICByZXF1aXJlZDogdHJ1ZVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBDdXN0b20gQ0ROIGxpbmtzIHRvIHVzZSBmb3Igc3BlY2lmaWMgZWxlbWVudC9jb21wb25lbnRcbiAgICAgKi9cbiAgICBjZG46IHtcbiAgICAgIHR5cGU6IE9iamVjdCBhcyBQcm9wVHlwZTxDZG5PcHRpb24+LFxuICAgICAgcmVxdWlyZWQ6IGZhbHNlXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIE9wdGlvbnNcbiAgICAgKi9cbiAgICBvcHRpb25zOiB7XG4gICAgICB0eXBlOiBudWxsIGFzIHVua25vd24gYXMgUHJvcFR5cGU8T3B0PixcbiAgICAgIGRlZmF1bHQ6ICgpID0+ICh7fSlcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogVmVyc2lvbiBvZiBib3gtdWktZWxlbWVudHMgdG8gdXNlLlxuICAgICAqIEl0IHdpbGwgaGF2ZSBubyBlZmZlY3Qgd2hlbiB1c2luZyBjdXN0b20gY2RuIGxpbmtzXG4gICAgICovXG4gICAgdmVyc2lvbjoge1xuICAgICAgdHlwZTogU3RyaW5nIGFzIFByb3BUeXBlPHN0cmluZz4sXG4gICAgICByZXF1aXJlZDogZmFsc2VcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB0byBkaXNwb3NlIHRoZSBIZWFkIG9uIHVubW91bnRcbiAgICAgKi9cbiAgICBoZWlnaHQ6IHtcbiAgICAgIHR5cGU6IFN0cmluZyBhcyBQcm9wVHlwZTxDU1NTdHlsZURlY2xhcmF0aW9uWydoZWlnaHQnXT4sXG4gICAgICBkZWZhdWx0OiAnMzUwcHgnXG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdG8gZGlzcG9zZSB0aGUgSGVhZCBvbiB1bm1vdW50XG4gICAgICovXG4gICAgZGlzcG9zZU9uVW5tb3VudDoge1xuICAgICAgdHlwZTogQm9vbGVhbiBhcyBQcm9wVHlwZTxib29sZWFuPixcbiAgICAgIGRlZmF1bHQ6IHRydWVcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB0byByZW5kZXIgdGhlIGNvbXBvbmVudCBpbW1lZGlhdGVseSBhZnRlciBsb2FkXG4gICAgICovXG4gICAgaW1tZWRpYXRlOiB7XG4gICAgICB0eXBlOiBCb29sZWFuIGFzIFByb3BUeXBlPGJvb2xlYW4+LFxuICAgICAgZGVmYXVsdDogdHJ1ZVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRvIGRpc3Bvc2UgdGhlIEhlYWQgb24gdW5tb3VudFxuICAgICAqL1xuICAgIHNob3c6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4gYXMgUHJvcFR5cGU8Ym9vbGVhbj4sXG4gICAgICBkZWZhdWx0OiB0cnVlXG4gICAgfVxuICB9O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgbmFtZTogc3RyaW5nKSB7fVxuXG4gIGNyZWF0ZTxVaU5hbWUgZXh0ZW5kcyBCb3hVaUVsZW1lbnROYW1lPihuYW1lOiBVaU5hbWUsIGV2ZW50czogRXZ0KSB7XG4gICAgdHlwZSBfUHJvcHMgPSB0eXBlb2YgdGhpcy5wcm9wcztcblxuICAgIHJldHVybiBkZWZpbmVDb21wb25lbnQ8X1Byb3BzLCB7IGluc3RhbmNlOiBSZWFkb25seTxFbD4gfSwgdW5rbm93biwge30sIHt9LCBDb21wb25lbnRPcHRpb25zTWl4aW4sIENvbXBvbmVudE9wdGlvbnNNaXhpbiwgRXZ0Pih7XG4gICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICBwcm9wczogdGhpcy5wcm9wcyxcbiAgICAgIGVtaXRzOiBldmVudHMsXG4gICAgICBleHBvc2U6IFsnaW5zdGFuY2UnXSxcbiAgICAgIHNldHVwKHByb3BzLCB7IGF0dHJzLCBlbWl0LCBleHBvc2UgfSkge1xuICAgICAgICBjb25zdCBmaWQgPSB1c2VWTW9kZWwocHJvcHMsICdtb2RlbFZhbHVlJywgZW1pdCk7XG5cbiAgICAgICAgY29uc3QgaWQgPSAoYXR0cnMuaWQgfHwgYGJveF9fJHtuYW1lfV9fd3JhcHBlciR7KytfY291bnRlcn1gKSBhcyBzdHJpbmc7XG5cbiAgICAgICAgY29uc3QgeyBnZXRJbnN0YW5jZSwgaW5zdGFuY2UsIGxvYWRlZCB9ID0gdXNlQm94RWxlbWVudDxFbCwgT3B0LCBFdnQ+KFxuICAgICAgICAgIGZpZCxcbiAgICAgICAgICBwcm9wcy5hY2Nlc3NUb2tlbixcbiAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAge1xuICAgICAgICAgICAgLi4uKHByb3BzLm9wdGlvbnMgfHwge30pLFxuICAgICAgICAgICAgY2RuOiBwcm9wcy5jZG4sXG4gICAgICAgICAgICBlbDogbmFtZSxcbiAgICAgICAgICAgIGRpc3Bvc2VPblVubW91bnQ6IHByb3BzLmRpc3Bvc2VPblVubW91bnQsXG4gICAgICAgICAgICBpbW1lZGlhdGU6IHByb3BzLmltbWVkaWF0ZSxcbiAgICAgICAgICAgIGNvbnRhaW5lcjogYCMke2lkfWAsXG4gICAgICAgICAgICB2ZXJzaW9uOiBwcm9wcy52ZXJzaW9uLFxuICAgICAgICAgICAgc3R5bGU6IGAuYm94LXVpLWVsZW1lbnQtd3JhcHBlciA+IDpmaXJzdC1jaGlsZCB7IGhlaWdodDogJHtwcm9wcy5oZWlnaHR9OyB9YCxcbiAgICAgICAgICAgIGxpc3RlbmVyczogb2JqZWN0S2V5cyhldmVudHMpXG4gICAgICAgICAgICAgIC5maWx0ZXIobmFtZSA9PiAhWyd1cGRhdGU6bW9kZWwtdmFsdWUnXS5pbmNsdWRlcyhuYW1lIGFzIHN0cmluZykpXG4gICAgICAgICAgICAgIC5yZWR1Y2UoKGV2dCwgbmFtZSkgPT4gKHtcbiAgICAgICAgICAgICAgICAuLi5ldnQsXG4gICAgICAgICAgICAgICAgW25hbWVdOiAoYXJncykgPT4ge1xuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgIGVtaXQobmFtZSwgYXJncyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KSwge30pXG4gICAgICAgICAgfVxuICAgICAgICApO1xuXG4gICAgICAgIGV4cG9zZSh7IGluc3RhbmNlOiByZWFkb25seShpbnN0YW5jZS52YWx1ZSkgfSk7XG5cbiAgICAgICAgd2F0Y2hFZmZlY3QoKCkgPT4ge1xuICAgICAgICAgIGlmIChsb2FkZWQgJiYgZ2V0SW5zdGFuY2UoKT8uc2hvdykge1xuICAgICAgICAgICAgZW1pdCgnaW5pdGlhdGVkJywgZ2V0SW5zdGFuY2UoKSk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBpZiAoZmlkLnZhbHVlPy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBnZXRJbnN0YW5jZSgpLnNob3coZmlkLnZhbHVlLCBwcm9wcy5hY2Nlc3NUb2tlbiwgeyAuLi5wcm9wcy5vcHRpb25zLCBjb250YWluZXI6IGAjJHtpZH1gIH0gYXMgYW55KTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBnZXRJbnN0YW5jZSgpLmhpZGUoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge31cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiAoKSA9PiAoPGRpdiB7IC4uLmF0dHJzIH0gaWQ9e2lkfSBjbGFzc05hbWU9XCJib3gtdWktZWxlbWVudC13cmFwcGVyXCI+PC9kaXY+KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gR2VuZXJpY0JveEVsZW1lbnQ8RWwgZXh0ZW5kcyBCYXNlRWw8T3B0LCBFdnQ+LCBPcHQgZXh0ZW5kcyBvYmplY3QsIEV2dCBleHRlbmRzIE9iamVjdEVtaXRzT3B0aW9ucywgVCBleHRlbmRzIEJveFVpRWxlbWVudE5hbWUgPSBCb3hVaUVsZW1lbnROYW1lPihcbiAgbmFtZTogVCxcbiAgLy8gdXNlRWxlbWVudDogdHlwZW9mIHVzZUJveEVsZW1lbnQ8RWwsIE9wdCwgRXZ0PixcbiAgZXZlbnRzOiBFdnRcbikge1xuICBjb25zdCBfZXZlbnRzID0ge1xuICAgIC4uLmV2ZW50cyxcbiAgICAnaW5pdGlhdGVkJzogKGFyZ3M6IEVsKSA9PiB0cnVlLFxuICAgICd1cGRhdGU6bW9kZWwtdmFsdWUnOiAoYXJnczogc3RyaW5nIHwgbnVsbCkgPT4gdHJ1ZVxuICB9O1xuXG4gIHR5cGUgX0V2ZW50cyA9IHR5cGVvZiBfZXZlbnRzICYgRXZ0O1xuXG4gIGNvbnN0IGNvbXBvbmVudCA9IG5ldyBCb3hFbGVtZW50RmFjdG9yeTxFbCwgT3B0LCBfRXZlbnRzPih0ZW1wbGF0ZSgnQm94ezB9JywgQm94VWlFbGVtZW50c1tuYW1lXSkpO1xuXG4gIHJldHVybiBjb21wb25lbnQuY3JlYXRlKG5hbWUsIF9ldmVudHMpO1xufVxuIiwiaW1wb3J0IHsgcmVmIH0gZnJvbSAndnVlLWRlbWknO1xuaW1wb3J0IHsgd2hlbmV2ZXIgfSBmcm9tICdAdnVldXNlL2NvcmUnO1xuaW1wb3J0IHR5cGUgeyBNYXliZVJlZiB9IGZyb20gJ0B3aG9qL3V0aWxzJztcbmltcG9ydCB0eXBlIHsgRnVuYyB9IGZyb20gJ0B3aG9qL3V0aWxzLXR5cGVzJztcbmltcG9ydCB7IGhhc1Byb3BlcnR5LCBvYmplY3RFbnRyaWVzLCB1bnJlZk9mIH0gZnJvbSAnQHdob2ovdXRpbHMnO1xuXG5pbXBvcnQgeyB1c2VDZG4gfSBmcm9tICcuL2Nkbic7XG5pbXBvcnQgdHlwZSB7IFVzZUNkbk9wdGlvbnMgfSBmcm9tICcuL2Nkbic7XG5pbXBvcnQgdHlwZSB7IEJhc2VFbCwgVW5PYmogfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmV4cG9ydCBlbnVtIEJveFVpRWxlbWVudHMge1xuICBleHBsb3JlciA9ICdDb250ZW50RXhwbG9yZXInLFxuICBwaWNrZXIgPSAnRmlsZVBpY2tlcicsXG4gIHByZXZpZXcgPSAnUHJldmlldycsXG4gIHNpZGViYXIgPSAnQ29udGVudFNpZGViYXInLFxuICB1cGxvYWRlciA9ICdDb250ZW50VXBsb2FkZXInXG59XG5cbmV4cG9ydCB0eXBlIEJveFVpRWxlbWVudE5hbWUgPSBrZXlvZiB0eXBlb2YgQm94VWlFbGVtZW50cztcbmV4cG9ydCB0eXBlIEdsb2JhbEJveFVpRWxlbWVudHMgPSBSZXZlcnNlTWFwPHR5cGVvZiBCb3hVaUVsZW1lbnRzPjtcblxuZXhwb3J0IHR5cGUgUmV2ZXJzZU1hcDxUIGV4dGVuZHMgUmVjb3JkPGtleW9mIFQsIGFueT4+ID0ge1xuICBbViBpbiBUW2tleW9mIFRdXToge1xuICAgIFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgViA/IEsgOiBuZXZlcjtcbiAgfVtrZXlvZiBUXTtcbn07XG5cbmV4cG9ydCB0eXBlIFVzZUJveEVsZW1lbnRzT3B0aW9uczxPcHQsIEUgZXh0ZW5kcyBvYmplY3QgPSBhbnk+ID0gT3B0ICYgVXNlQ2RuT3B0aW9ucyAmIHtcbiAgbGlzdGVuZXJzPzogRSxcbiAgaW1tZWRpYXRlPzogYm9vbGVhblxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIHVzZUJveEVsZW1lbnQ8VCBleHRlbmRzIEJhc2VFbDxPcHQsIEU+LCBPcHQgZXh0ZW5kcyBVbk9iaiwgRSBleHRlbmRzIHsgW3A6IHN0cmluZ106IEZ1bmM8YW55LCB2b2lkPiB9PihcbiAgaWQ6IE1heWJlUmVmPHN0cmluZz4sXG4gIGFjY2Vzc1Rva2VuOiBNYXliZVJlZjxzdHJpbmc+LFxuICB7XG4gICAgY2RuLFxuICAgIGRpc3Bvc2VPblVubW91bnQsXG4gICAgZWwsXG4gICAgaW1tZWRpYXRlID0gdHJ1ZSxcbiAgICBsaXN0ZW5lcnMsXG4gICAgb25sb2FkLFxuICAgIHZlcnNpb24sXG4gICAgc3R5bGUsXG4gICAgLi4ub3B0aW9uc1xuICB9OiBVc2VCb3hFbGVtZW50c09wdGlvbnM8T3B0LCBFPiAmIHsgZWw6IGtleW9mIHR5cGVvZiBCb3hVaUVsZW1lbnRzIH1cbikge1xuICBjb25zdCBpbnN0YW5jZSA9IHJlZjxUPigpO1xuICBjb25zdCBnZXRJbnN0YW5jZSA9ICgpID0+IGluc3RhbmNlLnZhbHVlO1xuXG4gIGNvbnN0IHsgbG9hZGVkLCBuZXdCb3hFbCB9ID0gdXNlQ2RuPFQ+KGVsLCB7XG4gICAgY2RuLFxuICAgIHN0eWxlLFxuICAgIHZlcnNpb24sXG4gICAgb25sb2FkLFxuICAgIGRpc3Bvc2VPblVubW91bnRcbiAgfSk7XG5cbiAgd2hlbmV2ZXIoKCkgPT4gbG9hZGVkLnZhbHVlLCAoKSA9PiB7XG4gICAgaWYgKCFnZXRJbnN0YW5jZSgpIHx8ICFoYXNQcm9wZXJ0eShnZXRJbnN0YW5jZSgpLCAnYWRkTGlzdGVuZXInKSkge1xuICAgICAgaW5zdGFuY2UudmFsdWUgPSBuZXdCb3hFbCgpO1xuICAgIH1cblxuICAgIGlmIChsaXN0ZW5lcnMpIHtcbiAgICAgIG9iamVjdEVudHJpZXM8RT4obGlzdGVuZXJzKS5mb3JFYWNoKChbZXZlbnQsIGxpc3RlbmVyXSkgPT4ge1xuICAgICAgICBnZXRJbnN0YW5jZSgpIS5hZGRMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIhKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChpbW1lZGlhdGUpIHtcbiAgICAgIGdldEluc3RhbmNlKCkhLnNob3codW5yZWZPZihpZCksIHVucmVmT2YoYWNjZXNzVG9rZW4pLCAob3B0aW9ucyB8fCB7fSkgYXMgdW5rbm93biBhcyBPcHQpO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICBsb2FkZWQsXG4gICAgaW5zdGFuY2UsXG4gICAgbmV3Qm94RWwsXG4gICAgZ2V0SW5zdGFuY2VcbiAgfTtcbn1cblxuZXhwb3J0ICogZnJvbSAnLi9ib3gtZWxlbWVudCc7XG4iLCJpbXBvcnQgeyBpc0FycmF5LCBpc0RlZiB9IGZyb20gJ0B3aG9qL3V0aWxzJztcbmltcG9ydCB0eXBlIHsgRnVuYywgTWF5YmVSZWYgfSBmcm9tICdAd2hvai91dGlscyc7XG5pbXBvcnQgdHlwZSB7IFVzZUJveEVsZW1lbnRzT3B0aW9ucyB9IGZyb20gJy4vdXNlQm94RWxlbWVudCc7XG5pbXBvcnQgeyBHZW5lcmljQm94RWxlbWVudCwgdXNlQm94RWxlbWVudCB9IGZyb20gJy4vdXNlQm94RWxlbWVudCc7XG5pbXBvcnQgdHlwZSB7IEF4aW9zUmVxdWVzdENvbmZpZywgQXhpb3NSZXNwb25zZSB9IGZyb20gJ2F4aW9zJztcbmltcG9ydCB0eXBlIHsgQmFzZUVsLCBCb3hVaU9wdGlvbnMsIEZpbGUsIEZvbGRlciwgTWFwVG9SZXR1cm5Wb2lkLCBNYXliZVByb21pc2UsIFdlYkxpbmsgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmNvbnN0IEVYUExPUkVSX0VWRU5UUyA9IHtcbiAgc2VsZWN0OiAocGF5bG9hZDogQXJyYXk8RmlsZSB8IEZvbGRlciB8IFdlYkxpbms+KSA9PiBpc0FycmF5KHBheWxvYWQpLFxuICByZW5hbWU6IChwYXlsb2FkOiBGaWxlIHwgRm9sZGVyIHwgV2ViTGluaykgPT4gaXNEZWYocGF5bG9hZCksXG4gIHByZXZpZXc6IChwYXlsb2FkOiBGaWxlKSA9PiBpc0RlZihwYXlsb2FkKSxcbiAgZG93bmxvYWQ6IChwYXlsb2FkOiBGaWxlW10pID0+IGlzQXJyYXkocGF5bG9hZCksXG4gIGRlbGV0ZTogKHBheWxvYWQ6IEZpbGVbXSkgPT4gaXNBcnJheShwYXlsb2FkKSxcbiAgdXBsb2FkOiAocGF5bG9hZDogRmlsZVtdKSA9PiBpc0FycmF5KHBheWxvYWQpLFxuICBuYXZpZ2F0ZTogKHBheWxvYWQ6IEZvbGRlcikgPT4gaXNEZWYocGF5bG9hZCksXG4gIGNyZWF0ZTogKHBheWxvYWQ6IEZvbGRlcikgPT4gaXNEZWYocGF5bG9hZClcbn07XG5cbmRlY2xhcmUgdHlwZSBFeHBsb3JlckV2ZW50cyA9IE1hcFRvUmV0dXJuVm9pZDx0eXBlb2YgRVhQTE9SRVJfRVZFTlRTPjtcblxuZXhwb3J0IGludGVyZmFjZSBFeHBsb3Jlck9wdGlvbnMgZXh0ZW5kcyBCb3hVaU9wdGlvbnMge1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgdG8gdGhlIGNvbnRlbnQgZXhwbG9yZXIgdG8gZml0IHdpdGhpbiBhIHNtYWxsIG9yIGxhcmdlIHdpZHRoIGNvbnRhaW5lci5cbiAgICogSWYgYWJzZW50IHRoZSBVSSBFbGVtZW50IHdpbGwgYWRhcHQgdG8gaXRzIGNvbnRhaW5lclxuICAgKiBhbmQgYXV0b21hdGljYWxseSBzd2l0Y2ggYmV0d2VlbiBzbWFsbCB3aWR0aCBvciBsYXJnZSB3aWR0aCBtb2RlLlxuICAgKi9cbiAgc2l6ZT86ICdzbWFsbCcgfCAnbGFyZ2UnO1xuXG4gIC8qKlxuICAgKiBUaGUgaW5pdGlhbCBzb3J0IGJ5IG9wdGlvbiBmb3IgdGhlIGNvbnRlbnQgbGlzdC5cbiAgICovXG4gIHNvcnRCeT86ICdpZCcgfCAnbmFtZScgfCAnZGF0ZScgfCAnc2l6ZSc7XG5cbiAgLyoqXG4gICAqIFRoZSBpbml0aWFsIHNvcnQgZGlyZWN0aW9uIG9wdGlvbiBmb3IgdGhlIGNvbnRlbnQgbGlzdC5cbiAgICovXG4gIHNvcnREaXJlY3Rpb24/OiAnQVNDJyB8ICdERVNDJztcblxuICAvKipcbiAgICogV2hlbiBzZXQgdG8gdHJ1ZSwgdGhlIGl0ZW0gZ3JpZCB3aWxsIGdldCBmb2N1cyBvbiBpbml0aWFsIGxvYWQuXG4gICAqL1xuICBhdXRvRm9jdXM/OiBib29sZWFuO1xuXG4gIGNhbkNyZWF0ZU5ld0ZvbGRlcj86IGJvb2xlYW47XG5cbiAgY2FuRGVsZXRlPzogYm9vbGVhbjtcblxuICBjYW5Eb3dubG9hZD86IGJvb2xlYW47XG5cbiAgY2FuUHJldmlldz86IGJvb2xlYW47XG5cbiAgY2FuUmVuYW1lPzogYm9vbGVhbjtcblxuICBjYW5TZXRTaGFyZUFjY2Vzcz86IGJvb2xlYW47XG5cbiAgY2FuU2hhcmU/OiBib29sZWFuO1xuXG4gIGNhblVwbG9hZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB0byB0aGUgY29udGVudCBleHBsb3JlciB0aGF0IGl0IGlzIGJlaW5nIHJlbmRlcmVkIG9uIGEgdG91Y2ggZW5hYmxlZCBkZXZpY2UuXG4gICAqIERlZmF1bHRzIHRvIHRoZSBicm93c2VyIGFuZCBkZXZpY2UncyBkZWZhdWx0IHRvdWNoIHN1cHBvcnRcbiAgICovXG4gIGlzVG91Y2g/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGVuIHNldCB0byByZWNlbnRzLCBieSBkZWZhdWx0IHlvdSB3aWxsIHNlZSByZWNlbnQgaXRlbXMgaW5zdGVhZCBvZiB0aGUgcmVndWxhciBmaWxlL2ZvbGRlciBzdHJ1Y3R1cmUuXG4gICAqL1xuICBkZWZhdWx0Vmlldz86ICdmaWxlcycgfCAncmVjZW50cyc7XG5cbiAgLyoqXG4gICAqIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vYXhpb3MvYXhpb3MjaW50ZXJjZXB0b3JzXG4gICAqL1xuICByZXF1ZXN0SW50ZXJjZXB0b3I/OiBGdW5jPEF4aW9zUmVxdWVzdENvbmZpZywgTWF5YmVQcm9taXNlPGFueSB8IHZvaWQ+PjtcblxuICAvKipcbiAgICogLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9heGlvcy9heGlvcyNpbnRlcmNlcHRvcnNcbiAgICovXG4gIHJlc3BvbnNlSW50ZXJjZXB0b3I/OiBGdW5jPEF4aW9zUmVzcG9uc2UsIE1heWJlUHJvbWlzZTxBeGlvc1Jlc3BvbnNlIHwgdm9pZD4+O1xuXG4gIC8qKlxuICAgKiBBbGxvd3MgeW91IHRvIHNob3cgdGhlIE9wZW4gV2l0aCBFbGVtZW50IHdoZW4gcHJldmlld2luZyB2aWEgdGhlIGV4cGxvcmVyLlxuICAgKi9cbiAgQ29udGVudE9wZW5XaXRoUHJvcHM/OiB7XG4gICAgc2hvdz86IGJvb2xlYW4sXG4gICAgW3A6IHN0cmluZ106IGFueVxuICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4cGxvcmVyIGV4dGVuZHMgQmFzZUVsPEV4cGxvcmVyT3B0aW9ucywgRXhwbG9yZXJFdmVudHM+IHtcbiAgLyoqXG4gICAqIENsZWFycyBvdXQgdGhlIGludGVybmFsIGluLW1lbW9yeVxuICAgKiBjYWNoZSBmb3IgdGhlIGNvbnRlbnQgZXhwbG9yZXIgZm9yY2luZ1xuICAgKiByZS1sb2FkIG9mIGl0ZW1zIHZpYSB0aGUgQVBJLlxuICAgKlxuICAgKiBAcHVibGljXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBjbGVhckNhY2hlKCk6IHZvaWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VCb3hDb250ZW50RXhwbG9yZXIoZmlsZUlkOiBNYXliZVJlZjxzdHJpbmc+LCBhY2Nlc3NUb2tlbjogTWF5YmVSZWY8c3RyaW5nPiwgb3B0aW9uczogVXNlQm94RWxlbWVudHNPcHRpb25zPEV4cGxvcmVyT3B0aW9ucywgRXhwbG9yZXJFdmVudHM+KSB7XG4gIHJldHVybiB1c2VCb3hFbGVtZW50PEV4cGxvcmVyLCBFeHBsb3Jlck9wdGlvbnMsIEV4cGxvcmVyRXZlbnRzPihcbiAgICBmaWxlSWQsXG4gICAgYWNjZXNzVG9rZW4sXG4gICAge1xuICAgICAgZGlzcG9zZU9uVW5tb3VudDogdHJ1ZSxcbiAgICAgIC4uLihvcHRpb25zIHx8IHt9KSxcbiAgICAgIGVsOiAnZXhwbG9yZXInXG4gICAgfVxuICApO1xufVxuXG5leHBvcnQgY29uc3QgQm94Q29udGVudEV4cGxvcmVyID0gLyogQF9fUFVSRV9fICovIEdlbmVyaWNCb3hFbGVtZW50PEV4cGxvcmVyLCBFeHBsb3Jlck9wdGlvbnMsIHR5cGVvZiBFWFBMT1JFUl9FVkVOVFM+KFxuICAnZXhwbG9yZXInLFxuICBFWFBMT1JFUl9FVkVOVFNcbik7XG4iLCJpbXBvcnQgeyBpc0RlZiB9IGZyb20gJ0B3aG9qL3V0aWxzJztcbmltcG9ydCB0eXBlIHsgTWF5YmVSZWYgfSBmcm9tICdAd2hvai91dGlscyc7XG5pbXBvcnQgdHlwZSB7IFVzZUJveEVsZW1lbnRzT3B0aW9ucyB9IGZyb20gJy4vdXNlQm94RWxlbWVudCc7XG5pbXBvcnQgeyBHZW5lcmljQm94RWxlbWVudCwgdXNlQm94RWxlbWVudCB9IGZyb20gJy4vdXNlQm94RWxlbWVudCc7XG5pbXBvcnQgdHlwZSB7IEJhc2VFbCwgQm94VWlPcHRpb25zLCBNYXBUb1JldHVyblZvaWQgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmNvbnN0IFBSRVZJRVdfRVZFTlRTID0ge1xuICB2aWV3ZXI6IChhcmdzOiBhbnkpID0+IGlzRGVmKGFyZ3MpLFxuICBsb2FkOiAoYXJnczogYW55KSA9PiBpc0RlZihhcmdzKSxcbiAgbmF2aWdhdGU6IChhcmdzOiBhbnkpID0+IGlzRGVmKGFyZ3MpLFxuICBub3RpZmljYXRpb246IChhcmdzOiBhbnkpID0+IGlzRGVmKGFyZ3MpLFxuICB2aWV3ZXJldmVudDogKGFyZ3M6IGFueSkgPT4gaXNEZWYoYXJncylcbn07XG5cbmV4cG9ydCB0eXBlIFByZXZpZXdFdmVudHMgPSBNYXBUb1JldHVyblZvaWQ8dHlwZW9mIFBSRVZJRVdfRVZFTlRTPjtcblxuZXhwb3J0IGludGVyZmFjZSBQcmV2aWV3T3B0aW9ucyBleHRlbmRzIEJveFVpT3B0aW9ucyB7XG5cbiAgLyoqXG4gICAqIExpc3Qgb2YgZmlsZSBJRHMgdG8gcHJldmlldyBvdmVyLlxuICAgKi9cbiAgY29sbGVjdGlvbj86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBWYWx1ZXMgdGhhdCBjb250cm9sIGhlYWRlciB2aXNpYmlsaXR5IGFuZCBiYWNrZ3JvdW5kIGNvbG9yLlxuICAgKiBVc2Ugbm9uZSBmb3Igbm8gaGVhZGVyLFxuICAgKiBsaWdodCBmb3IgYSBsaWdodCBoZWFkZXIgYW5kIGJhY2tncm91bmQsXG4gICAqIGFuZCBkYXJrIGZvciBhIGRhcmsgaGVhZGVyIGFuZCBiYWNrZ3JvdW5kXG4gICAqIEBkZWZhdWx0IGAnbGlnaHQnYFxuICAgKi9cbiAgaGVhZGVyPzogJ25vbmUnIHwgJ2xpZ2h0JyB8ICdkYXJrJztcblxuICAvKipcbiAgICogV2hldGhlciBhbm5vdGF0aW9uIGJ1dHRvbiBpbiBoZWFkZXIgYW5kIGFubm90YXRpb25zIG9uIGNvbnRlbnQgYXJlIHNob3duXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHNob3dBbm5vdGF0aW9ucz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgZG93bmxvYWQgYnV0dG9uIGlzIHNob3duIGluIGhlYWRlci5cbiAgICogV2lsbCBhbHNvIGNvbnRyb2wgcHJpbnQgYnV0dG9uIHZpc2liaWxpdHkgaW4gdmlld2VycyB0aGF0IHN1cHBvcnQgcHJpbnQuXG4gICAqIE5vdGUgdGhhdCB0aGlzIG9wdGlvbiB3aWxsIG5vdCBvdmVycmlkZSBkb3dubG9hZCBwZXJtaXNzaW9ucyBvbiB0aGUgYWNjZXNzIHRva2VuLlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICBzaG93RG93bmxvYWQ/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFByZXZpZXcgZXh0ZW5kcyBCYXNlRWw8UHJldmlld09wdGlvbnMsIFByZXZpZXdFdmVudHM+IHtcbiAgLyoqXG4gICAqIFByaW50cyB0aGUgY3VycmVudCBmaWxlLCBpZiBwcmludGFibGUuXG4gICAqXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBwcmludCgpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBEb3dubG9hZHMgdGhlIGN1cnJlbnQgZmlsZS5cbiAgICpcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIGRvd25sb2FkKCk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFJlc2l6ZXMgdGhlIGN1cnJlbnQgcHJldmlldywgaWYgYXBwbGljYWJsZS4gVGhpcyBmdW5jdGlvbiBvbmx5IG5lZWRzIHRvXG4gICAqIGJlIGNhbGxlZCB3aGVuIHByZXZpZXcncyB2aWV3cG9ydCBoYXMgY2hhbmdlZCB3aGlsZSB0aGUgd2luZG93IGhhcyBub3QuXG4gICAqIElmIHRoZSB3aW5kb3cgaXMgcmVzaXppbmcsIHRoZW4gcHJldmlldyB3aWxsIGF1dG9tYXRpY2FsbHkgcmVzaXplIGl0c2VsZi5cbiAgICpcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIHJlc2l6ZSgpOiB2b2lkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlQm94UHJldmlldyhmaWxlSWQ6IE1heWJlUmVmPHN0cmluZz4sIGFjY2Vzc1Rva2VuOiBNYXliZVJlZjxzdHJpbmc+LCBvcHRpb25zOiBVc2VCb3hFbGVtZW50c09wdGlvbnM8UHJldmlld09wdGlvbnMsIFByZXZpZXdFdmVudHM+KSB7XG4gIHJldHVybiB1c2VCb3hFbGVtZW50PFByZXZpZXcsIFByZXZpZXdPcHRpb25zLCBQcmV2aWV3RXZlbnRzPihcbiAgICBmaWxlSWQsXG4gICAgYWNjZXNzVG9rZW4sXG4gICAge1xuICAgICAgZGlzcG9zZU9uVW5tb3VudDogdHJ1ZSxcbiAgICAgIC4uLihvcHRpb25zIHx8IHt9KSxcbiAgICAgIGVsOiAncHJldmlldydcbiAgICB9XG4gICk7XG59XG5cbmV4cG9ydCBjb25zdCBCb3hQcmV2aWV3ID0gLyogQF9fUFVSRV9fICovIEdlbmVyaWNCb3hFbGVtZW50PFByZXZpZXcsIFByZXZpZXdPcHRpb25zLCB0eXBlb2YgUFJFVklFV19FVkVOVFM+KFxuICAncHJldmlldycsXG4gIFBSRVZJRVdfRVZFTlRTXG4pO1xuIiwiaW1wb3J0IHsgaXNEZWYgfSBmcm9tICdAd2hvai91dGlscyc7XG5pbXBvcnQgdHlwZSB7IEZ1bmMsIE1heWJlUmVmIH0gZnJvbSAnQHdob2ovdXRpbHMnO1xuaW1wb3J0IHR5cGUgeyBVc2VCb3hFbGVtZW50c09wdGlvbnMgfSBmcm9tICcuL3VzZUJveEVsZW1lbnQnO1xuaW1wb3J0IHR5cGUgeyBCYXNlRWwsIEZpbGUsIEZvbGRlciwgTWFwVG9SZXR1cm5Wb2lkLCBXZWJMaW5rIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBFeHBsb3Jlck9wdGlvbnMgfSBmcm9tICcuL2V4cGxvcmVyJztcbmltcG9ydCB7IEdlbmVyaWNCb3hFbGVtZW50LCB1c2VCb3hFbGVtZW50IH0gZnJvbSAnLi91c2VCb3hFbGVtZW50JztcblxuY29uc3QgUElDS0VSX0VWRU5UUyA9IHtcbiAgY2hvb3NlOiAoYXJnczogQXJyYXk8RmlsZSB8IEZvbGRlciB8IFdlYkxpbms+KSA9PiBpc0RlZihhcmdzKSxcbiAgY2FuY2VsOiAoKSA9PiB0cnVlXG59O1xuXG5leHBvcnQgdHlwZSBGaWxlUGlja2VyRXZlbnRzID0gTWFwVG9SZXR1cm5Wb2lkPHR5cGVvZiBQSUNLRVJfRVZFTlRTPjtcblxuZXhwb3J0IGludGVyZmFjZSBGaWxlUGlja2VyT3B0aW9ucyBleHRlbmRzIE9taXQ8RXhwbG9yZXJPcHRpb25zLCAnY2FuRGVsZXRlJyB8ICdjYW5Eb3dubG9hZCcgfCAnY2FuUHJldmlldycgfCAnY2FuUmVuYW1lJyB8ICdjYW5TaGFyZSc+IHtcbiAgLyoqXG4gICAqIEFycmF5IG9mIGZpbGUgZXh0ZW5zaW9ucyB0byBiZSBhbGxvd2VkIGZvciBzZWxlY3Rpb25cbiAgICogQGV4YW1wbGUgYFsnZG9jJywgJ3BwdCddYFxuICAgKi9cbiAgZXh0ZW5zaW9ucz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBOdW1iZXIgb2YgZmlsZXMgb3IgZm9sZGVycyB0aGF0IGNhbiBiZSBzZWxlY3RlZC5cbiAgICogU3BlY2lmeSAxIGlmIHlvdSB3YW50IG9ubHkgMSBmaWxlIG9yIGZvbGRlciBzZWxlY3RlZC5cbiAgICogQGRlZmF1bHQgYEluZmluaXR5YFxuICAgKi9cbiAgbWF4U2VsZWN0YWJsZT86IG51bWJlcjtcblxuICBtb2RhbD86IHtcbiAgICBidXR0b25MYWJlbD86IHN0cmluZywgLy9cdFx0TGFiZWwgZm9yIHRoZSBidXR0b25cbiAgICBidXR0b25DbGFzc05hbWU/OiBzdHJpbmcsIC8vXHRCb3ggQmx1ZSBCdXR0b25cdENTUyBjbGFzcyB0byBkZWNvcmF0ZSB0aGUgYnV0dG9uXG4gICAgbW9kYWxDbGFzc05hbWU/OiBzdHJpbmcsIC8vXHRcdENTUyBjbGFzcyB0byBkZWNvcmF0ZSB0aGUgbW9kYWwgcG9wdXAgY29udGVudFxuICAgIG92ZXJsYXlDbGFzc05hbWU/OiBzdHJpbmcgLy9cdFx0Q1NTIGNsYXNzIHRvIGRlY29yYXRlIHRoZSBtb2RhbCBwb3B1cCBvdmVybGF5XG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZVBpY2tlciBleHRlbmRzIEJhc2VFbDxGaWxlUGlja2VyT3B0aW9ucywgRmlsZVBpY2tlckV2ZW50cz4ge1xuICAvKipcbiAgICogQ2xlYXJzIG91dCB0aGUgaW50ZXJuYWwgaW4tbWVtb3J5XG4gICAqIGNhY2hlIGZvciB0aGUgY29udGVudCBleHBsb3JlciBmb3JjaW5nXG4gICAqIHJlLWxvYWQgb2YgaXRlbXMgdmlhIHRoZSBBUEkuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIGNsZWFyQ2FjaGUoKTogdm9pZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZUJveEZpbGVQaWNrZXIoZmlsZUlkOiBNYXliZVJlZjxzdHJpbmc+LCBhY2Nlc3NUb2tlbjogTWF5YmVSZWY8c3RyaW5nPiwgb3B0aW9uczogVXNlQm94RWxlbWVudHNPcHRpb25zPEZpbGVQaWNrZXJPcHRpb25zLCBGaWxlUGlja2VyRXZlbnRzPikge1xuICByZXR1cm4gdXNlQm94RWxlbWVudDxGaWxlUGlja2VyLCBGaWxlUGlja2VyT3B0aW9ucywgRmlsZVBpY2tlckV2ZW50cz4oXG4gICAgZmlsZUlkLFxuICAgIGFjY2Vzc1Rva2VuLFxuICAgIHtcbiAgICAgIGRpc3Bvc2VPblVubW91bnQ6IHRydWUsXG4gICAgICAuLi4ob3B0aW9ucyB8fCB7fSksXG4gICAgICBlbDogJ3BpY2tlcidcbiAgICB9XG4gICk7XG59XG5cbmV4cG9ydCBjb25zdCBCb3hGaWxlUGlja2VyID0gLyogQF9fUFVSRV9fICovIEdlbmVyaWNCb3hFbGVtZW50PEZpbGVQaWNrZXIsIEZpbGVQaWNrZXJPcHRpb25zLCB0eXBlb2YgUElDS0VSX0VWRU5UUz4oXG4gICdwaWNrZXInLFxuICBQSUNLRVJfRVZFTlRTXG4pO1xuIiwiaW1wb3J0IHR5cGUgeyBNYXliZVJlZiB9IGZyb20gJ0B3aG9qL3V0aWxzJztcbmltcG9ydCB0eXBlIHsgRXhwbG9yZXJPcHRpb25zIH0gZnJvbSAnLi9leHBsb3Jlcic7XG5pbXBvcnQgdHlwZSB7IFVzZUJveEVsZW1lbnRzT3B0aW9ucyB9IGZyb20gJy4vdXNlQm94RWxlbWVudCc7XG5pbXBvcnQgdHlwZSB7IEJhc2VFbCwgTWFwVG9SZXR1cm5Wb2lkIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgR2VuZXJpY0JveEVsZW1lbnQsIHVzZUJveEVsZW1lbnQgfSBmcm9tICcuL3VzZUJveEVsZW1lbnQnO1xuXG5jb25zdCBTSURFQkFSX0VWRU5UUyA9IHt9O1xuXG5leHBvcnQgdHlwZSBTaWRlYmFyRXZlbnRzID0gTWFwVG9SZXR1cm5Wb2lkPHR5cGVvZiBTSURFQkFSX0VWRU5UUz47XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2lkZWJhck9wdGlvbnMgZXh0ZW5kcyBQaWNrPEV4cGxvcmVyT3B0aW9ucywgJ2NvbnRhaW5lcicgfCAncmVxdWVzdEludGVyY2VwdG9yJyB8ICdyZXNwb25zZUludGVyY2VwdG9yJz4ge1xuICAvKipcbiAgICogU2V0IHRvIHRydWUgdG8gc2hvdyB0aGUgYWN0aXZpdHkgZmVlZCB0aGF0IGluY2x1ZGVzIHZlcnNpb25zLCBjb21tZW50cyBhbmQgdGFza3MuXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIGhhc0FjdGl2aXR5RmVlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFNldCB0byB0cnVlIHRvIHNob3cgYm94IG1ldGFkYXRhIGZvciB0aGUgZmlsZS5cbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgaGFzTWV0YWRhdGE/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBTZXQgdG8gdHJ1ZSB0byBzaG93IHRoZSBmaWxlIHNraWxscyBkYXRhLlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICBoYXNTa2lsbHM/OiBib29sZWFuO1xuXG4gIGRldGFpbHNTaWRlYmFyUHJvcHM/OiB7XG4gICAgaGFzUHJvcGVydGllcz86IGJvb2xlYW4sIC8vIFx0ZmFsc2VcdFNldCB0byB0cnVlIHRvIHNob3cgZmlsZSBwcm9wZXJ0aWVzIGluIHRoZSBkZXRhaWxzIHNpZGViYXIuXG4gICAgaGFzQWNjZXNzU3RhdHM/OiBib29sZWFuLCAvLyBcdGZhbHNlXHRTZXQgdG8gdHJ1ZSB0byBzaG93IGZpbGUgYWNjZXNzIHN0YXRzIGluIHRoZSBkZXRhaWxzIHNpZGViYXIuXG4gICAgaGFzVmVyc2lvbnM/OiBib29sZWFuLCAvLyBcdGZhbHNlXHRTZXQgdG8gdHJ1ZSB0byBzaG93IGZpbGUgdmVyc2lvbnMgaW4gdGhlIGRldGFpbHMgc2lkZWJhci5cbiAgICBoYXNOb3RpY2VzPzogYm9vbGVhbiAvLyBcdGZhbHNlXHRTZXQgdG8gdHJ1ZSB0byBzaG93IGZpbGUgcmVsYXRlZCBub3RpY2VzIGluIHRoZSBkZXRhaWxzIHNpZGViYXIuXG5cbiAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTaWRlYmFyIGV4dGVuZHMgQmFzZUVsPFNpZGViYXJPcHRpb25zLCBTaWRlYmFyRXZlbnRzPiB7XG4gIC8qKlxuICAgKiBDbGVhcnMgb3V0IHRoZSBpbnRlcm5hbCBpbi1tZW1vcnlcbiAgICogY2FjaGUgZm9yIHRoZSBjb250ZW50IGV4cGxvcmVyIGZvcmNpbmdcbiAgICogcmUtbG9hZCBvZiBpdGVtcyB2aWEgdGhlIEFQSS5cbiAgICpcbiAgICogQHB1YmxpY1xuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgY2xlYXJDYWNoZSgpOiB2b2lkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlQm94Q29udGVudFNpZGViYXIoZmlsZUlkOiBNYXliZVJlZjxzdHJpbmc+LCBhY2Nlc3NUb2tlbjogTWF5YmVSZWY8c3RyaW5nPiwgb3B0aW9uczogVXNlQm94RWxlbWVudHNPcHRpb25zPFNpZGViYXJPcHRpb25zLCBTaWRlYmFyRXZlbnRzPikge1xuICByZXR1cm4gdXNlQm94RWxlbWVudDxTaWRlYmFyLCBTaWRlYmFyT3B0aW9ucywgU2lkZWJhckV2ZW50cz4oXG4gICAgZmlsZUlkLFxuICAgIGFjY2Vzc1Rva2VuLFxuICAgIHtcbiAgICAgIGRpc3Bvc2VPblVubW91bnQ6IHRydWUsXG4gICAgICAuLi4ob3B0aW9ucyB8fCB7fSksXG4gICAgICBlbDogJ3NpZGViYXInXG4gICAgfVxuICApO1xufVxuXG5leHBvcnQgY29uc3QgQm94Q29udGVudFNpZGViYXIgPSAvKiBAX19QVVJFX18gKi8gR2VuZXJpY0JveEVsZW1lbnQ8U2lkZWJhciwgU2lkZWJhck9wdGlvbnMsIHR5cGVvZiBTSURFQkFSX0VWRU5UUz4oXG4gICdzaWRlYmFyJyxcbiAgU0lERUJBUl9FVkVOVFNcbik7XG4iLCJpbXBvcnQgeyBpc0FycmF5LCBpc0RlZiB9IGZyb20gJ0B3aG9qL3V0aWxzJztcbmltcG9ydCB0eXBlIHsgTWF5YmVSZWYgfSBmcm9tICdAd2hvai91dGlscyc7XG5pbXBvcnQgdHlwZSB7IEV4cGxvcmVyT3B0aW9ucyB9IGZyb20gJy4vZXhwbG9yZXInO1xuaW1wb3J0IHR5cGUgeyBVc2VCb3hFbGVtZW50c09wdGlvbnMgfSBmcm9tICcuL3VzZUJveEVsZW1lbnQnO1xuaW1wb3J0IHR5cGUgeyBCYXNlRWwsIEZpbGUsIE1hcFRvUmV0dXJuVm9pZCB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IEdlbmVyaWNCb3hFbGVtZW50LCB1c2VCb3hFbGVtZW50IH0gZnJvbSAnLi91c2VCb3hFbGVtZW50JztcblxuY29uc3QgVVBMT0FERVJfRVZFTlRTID0ge1xuICBjbG9zZTogKCkgPT4gdHJ1ZSxcbiAgY29tcGxldGU6IChwYXlsb2FkOiBGaWxlW10pID0+IGlzQXJyYXkocGF5bG9hZCksXG4gIGVycm9yOiAoYXJnczogRXJyb3IpID0+IGlzRGVmKGFyZ3MpLFxuICB1cGxvYWQ6IChwYXlsb2FkOiBGaWxlKSA9PiBpc0RlZihwYXlsb2FkKVxufTtcblxuZXhwb3J0IHR5cGUgVXBsb2FkZXJFdmVudHMgPSBNYXBUb1JldHVyblZvaWQ8dHlwZW9mIFVQTE9BREVSX0VWRU5UUz47XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXBsb2FkZXJPcHRpb25zIGV4dGVuZHMgUGljazxFeHBsb3Jlck9wdGlvbnMsICdjb250YWluZXInIHwgJ3JlcXVlc3RJbnRlcmNlcHRvcicgfCAncmVzcG9uc2VJbnRlcmNlcHRvcicgfCAnc2hhcmVkTGluaycgfCAnc2hhcmVkTGlua1Bhc3N3b3JkJyB8ICdzaXplJyB8ICdpc1RvdWNoJz4ge1xuICAvKipcbiAgICogQ2FsbGJhY2sgZnVuY3Rpb24gZm9yICdDbG9zZScgYnV0dG9uLFxuICAgKiB3aGljaCB3aWxsIGFwcGVhciB3aGVuIHRoZXJlIGFyZSBubyBmaWxlcyB0byB1cGxvYWQgb3Igd2hlbiBhbGwgdXBsb2FkcyBhcmUgY29tcGxldGUuXG4gICAqIElmIHRoaXMgb3B0aW9uIGlzIHNldCB0byBgbnVsbGAgdGhlIGJ1dHRvbiB3aWxsIG5vdCBhcHBlYXIuXG4gICAqL1xuICBvbkNsb3NlPzogbnVsbCB8ICgoKSA9PiB2b2lkKTtcblxuICAvKipcbiAgICogTnVtYmVyIG9mIGZpbGVzIG9yIGZvbGRlcnMgdGhhdCBjYW4gYmUgc2VsZWN0ZWQuXG4gICAqIFNwZWNpZnkgMSBpZiB5b3Ugd2FudCBvbmx5IDEgZmlsZSBvciBmb2xkZXIgc2VsZWN0ZWQuXG4gICAqIEBkZWZhdWx0IGAxMDBgXG4gICAqL1xuICBmaWxlTGltaXQ/OiBudW1iZXI7XG5cbiAgbW9kYWw/OiB7XG4gICAgYnV0dG9uTGFiZWw/OiBzdHJpbmcsIC8vXHRcdExhYmVsIGZvciB0aGUgYnV0dG9uXG4gICAgYnV0dG9uQ2xhc3NOYW1lPzogc3RyaW5nLCAvL1x0Qm94IEJsdWUgQnV0dG9uXHRDU1MgY2xhc3MgdG8gZGVjb3JhdGUgdGhlIGJ1dHRvblxuICAgIG1vZGFsQ2xhc3NOYW1lPzogc3RyaW5nLCAvL1x0XHRDU1MgY2xhc3MgdG8gZGVjb3JhdGUgdGhlIG1vZGFsIHBvcHVwIGNvbnRlbnRcbiAgICBvdmVybGF5Q2xhc3NOYW1lPzogc3RyaW5nIC8vXHRcdENTUyBjbGFzcyB0byBkZWNvcmF0ZSB0aGUgbW9kYWwgcG9wdXAgb3ZlcmxheVxuICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVwbG9hZGVyIGV4dGVuZHMgQmFzZUVsPFVwbG9hZGVyT3B0aW9ucywgVXBsb2FkZXJFdmVudHM+IHtcblxufVxuXG5leHBvcnQgZnVuY3Rpb24gdXNlQm94Q29udGVudFVwbG9hZGVyKGZpbGVJZDogTWF5YmVSZWY8c3RyaW5nPiwgYWNjZXNzVG9rZW46IE1heWJlUmVmPHN0cmluZz4sIG9wdGlvbnM6IFVzZUJveEVsZW1lbnRzT3B0aW9uczxVcGxvYWRlck9wdGlvbnMsIFVwbG9hZGVyRXZlbnRzPikge1xuICByZXR1cm4gdXNlQm94RWxlbWVudDxVcGxvYWRlciwgVXBsb2FkZXJPcHRpb25zLCBVcGxvYWRlckV2ZW50cz4oXG4gICAgZmlsZUlkLFxuICAgIGFjY2Vzc1Rva2VuLFxuICAgIHtcbiAgICAgIGRpc3Bvc2VPblVubW91bnQ6IHRydWUsXG4gICAgICAuLi4ob3B0aW9ucyB8fCB7fSksXG4gICAgICBlbDogJ3VwbG9hZGVyJ1xuICAgIH1cbiAgKTtcbn1cblxuZXhwb3J0IGNvbnN0IEJveENvbnRlbnRVcGxvYWRlciA9IC8qIEBfX1BVUkVfXyAqLyBHZW5lcmljQm94RWxlbWVudDxVcGxvYWRlciwgVXBsb2FkZXJPcHRpb25zLCB0eXBlb2YgVVBMT0FERVJfRVZFTlRTPihcbiAgJ3VwbG9hZGVyJyxcbiAgVVBMT0FERVJfRVZFTlRTXG4pO1xuIl0sIm5hbWVzIjpbInVzZUNkbiIsImJveEVsIiwiY2RuIiwic3R5bGUiLCJvbmxvYWQiLCJ2ZXJzaW9uIiwiZGlzcG9zZU9uVW5tb3VudCIsImVsZW1lbnQiLCJjc3MiLCJqcyIsImxvYWRlZCIsInJlZiIsImhlYWQiLCJ1c2VIZWFkIiwibGluayIsImhyZWYiLCJyZWwiLCJrZXkiLCJzY3JpcHQiLCJzcmMiLCJmZXRjaHByaW9yaXR5IiwidHlwZSIsImUiLCJ2YWx1ZSIsImlzRGVmIiwiaW5uZXJIVE1MIiwidW5yZWYiLCJ1bmRlZmluZWQiLCJ0cnlPblVubW91bnRlZCIsImRpc3Bvc2UiLCJuZXdCb3hFbCIsImdldFByb3BlcnR5IiwiZ2V0R2xvYmFsIiwiQm94IiwiQm94VWlFbGVtZW50cyIsIl9jb3VudGVyIiwiQm94RWxlbWVudEZhY3RvcnkiLCJjb25zdHJ1Y3RvciIsIm5hbWUiLCJwcm9wcyIsIm1vZGVsVmFsdWUiLCJTdHJpbmciLCJyZXF1aXJlZCIsImFjY2Vzc1Rva2VuIiwiT2JqZWN0Iiwib3B0aW9ucyIsImRlZmF1bHQiLCJoZWlnaHQiLCJCb29sZWFuIiwiaW1tZWRpYXRlIiwic2hvdyIsImNyZWF0ZSIsImV2ZW50cyIsImRlZmluZUNvbXBvbmVudCIsImVtaXRzIiwiZXhwb3NlIiwic2V0dXAiLCJhdHRycyIsImVtaXQiLCJmaWQiLCJ1c2VWTW9kZWwiLCJpZCIsImdldEluc3RhbmNlIiwiaW5zdGFuY2UiLCJ1c2VCb3hFbGVtZW50IiwiZWwiLCJjb250YWluZXIiLCJsaXN0ZW5lcnMiLCJvYmplY3RLZXlzIiwiZmlsdGVyIiwiaW5jbHVkZXMiLCJyZWR1Y2UiLCJldnQiLCJhcmdzIiwicmVhZG9ubHkiLCJ3YXRjaEVmZmVjdCIsImxlbmd0aCIsImhpZGUiLCJfY3JlYXRlVk5vZGUiLCJfbWVyZ2VQcm9wcyIsIkdlbmVyaWNCb3hFbGVtZW50IiwiX2V2ZW50cyIsImluaXRpYXRlZCIsInVwZGF0ZTptb2RlbC12YWx1ZSIsImNvbXBvbmVudCIsInRlbXBsYXRlIiwiZXhwbG9yZXIiLCJwaWNrZXIiLCJwcmV2aWV3Iiwic2lkZWJhciIsInVwbG9hZGVyIiwid2hlbmV2ZXIiLCJoYXNQcm9wZXJ0eSIsIm9iamVjdEVudHJpZXMiLCJmb3JFYWNoIiwiZXZlbnQiLCJsaXN0ZW5lciIsImFkZExpc3RlbmVyIiwidW5yZWZPZiIsIkVYUExPUkVSX0VWRU5UUyIsInNlbGVjdCIsInBheWxvYWQiLCJpc0FycmF5IiwicmVuYW1lIiwiZG93bmxvYWQiLCJkZWxldGUiLCJ1cGxvYWQiLCJuYXZpZ2F0ZSIsInVzZUJveENvbnRlbnRFeHBsb3JlciIsImZpbGVJZCIsIkJveENvbnRlbnRFeHBsb3JlciIsIlBSRVZJRVdfRVZFTlRTIiwidmlld2VyIiwibG9hZCIsIm5vdGlmaWNhdGlvbiIsInZpZXdlcmV2ZW50IiwidXNlQm94UHJldmlldyIsIkJveFByZXZpZXciLCJQSUNLRVJfRVZFTlRTIiwiY2hvb3NlIiwiY2FuY2VsIiwidXNlQm94RmlsZVBpY2tlciIsIkJveEZpbGVQaWNrZXIiLCJTSURFQkFSX0VWRU5UUyIsInVzZUJveENvbnRlbnRTaWRlYmFyIiwiQm94Q29udGVudFNpZGViYXIiLCJVUExPQURFUl9FVkVOVFMiLCJjbG9zZSIsImNvbXBsZXRlIiwiZXJyb3IiLCJ1c2VCb3hDb250ZW50VXBsb2FkZXIiLCJCb3hDb250ZW50VXBsb2FkZXIiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQTRDTyxTQUFTQSxPQUNkQyxLQUNBLEVBQUE7QUFBQSxFQUFFQyxHQUFBQTtBQUFBQSxFQUFLQyxLQUFBQTtBQUFBQSxFQUFPQyxNQUFBQTtBQUFBQSxFQUFRQyxPQUFBQTtBQUFBQSxFQUFTQyxnQkFBbUIsR0FBQSxJQUFBO0FBQW9CLENBQ3JELEVBQUE7QUFDakJELEVBQVVBLE9BQUFBLEdBQUFBLE9BQUFBLEtBQVlKLEtBQVUsS0FBQSxTQUFBLEdBQVksUUFBVyxHQUFBLFFBQUEsQ0FBQSxDQUFBO0FBQ3ZELEVBQU1NLE1BQUFBLE9BQUFBLEdBQVVOLEtBQVUsS0FBQSxTQUFBLEdBQVksU0FBWSxHQUFBLFVBQUEsQ0FBQTtBQUVsRCxFQUFNLE1BQUE7QUFBQSxJQUFFTyxHQUFBQTtBQUFBQSxJQUFLQyxFQUFBQTtBQUFBQSxNQUFPUCxHQUFPLElBQUE7QUFBQSxJQUN6Qk0sS0FBTSxDQUFvQ0Qsa0NBQUFBLEVBQUFBLE9BQVEsQ0FBR0YsQ0FBQUEsRUFBQUEsT0FBUSxVQUFTSixLQUFNLENBQUEsSUFBQSxDQUFBO0FBQUEsSUFDNUVRLElBQUssQ0FBb0NGLGtDQUFBQSxFQUFBQSxPQUFRLENBQUdGLENBQUFBLEVBQUFBLE9BQVEsVUFBU0osS0FBTSxDQUFBLEdBQUEsQ0FBQTtBQUFBLEdBQzdFLENBQUE7QUFFQSxFQUFNUyxNQUFBQSxNQUFBQSxHQUFTQyxJQUFJLEtBQUssQ0FBQSxDQUFBO0FBQ3hCLEVBQUEsTUFBTUMsT0FBT0MsT0FBUSxDQUFBO0FBQUEsSUFDbkJDLE1BQU0sQ0FDSjtBQUFBLE1BQ0VDLElBQU1QLEVBQUFBLEdBQUFBO0FBQUFBLE1BQ05RLEdBQUssRUFBQSxZQUFBO0FBQUEsTUFDTEMsR0FBQUEsRUFBTSxpQkFBZ0JoQixLQUFNLENBQUEsSUFBQSxDQUFBO0FBQUEsS0FDN0IsQ0FBQTtBQUFBLElBRUhpQixRQUFRLENBQ047QUFBQSxNQUNFQyxHQUFLVixFQUFBQSxFQUFBQTtBQUFBQSxNQUNMVyxhQUFlLEVBQUEsTUFBQTtBQUFBLE1BQ2ZDLElBQU0sRUFBQSxpQkFBQTtBQUFBLE1BQ05KLEdBQUFBLEVBQU0saUJBQWdCaEIsS0FBTSxDQUFBLEdBQUEsQ0FBQTtBQUFBLE1BQzVCRyxPQUFPa0IsQ0FBRyxFQUFBO0FBQ1JaLFFBQUFBLE1BQUFBLENBQU9hLEtBQVEsR0FBQSxJQUFBLENBQUE7QUFDZkMsUUFBTXBCLEtBQUFBLENBQUFBLE1BQU0sQ0FBS0EsSUFBQUEsTUFBQUEsQ0FBT2tCLENBQUMsQ0FBQSxDQUFBO0FBQUEsT0FDM0I7QUFBQSxLQUNELENBQUE7QUFBQSxJQUVIbkIsS0FBQUEsRUFBT0EsUUFDSCxDQUNFO0FBQUEsTUFDRXNCLFNBQUFBLEVBQVdDLE1BQU12QixLQUFLLENBQUE7QUFBQSxNQUN0QmMsR0FBQUEsRUFBTSxpQkFBZ0JoQixLQUFNLENBQUEsTUFBQSxDQUFBO0FBQUEsS0FDN0IsQ0FFSDBCLEdBQUFBLEtBQUFBLENBQUFBO0FBQUFBLEdBQ0wsQ0FBQSxDQUFBO0FBRURDLEVBQUFBLGNBQUFBLENBQWUsTUFBTTtBQUNuQixJQUFBLElBQUl0QixnQkFBa0IsRUFBQTtBQUNwQk0sTUFBQUEsSUFBQUEsQ0FBS2lCLE9BQVEsRUFBQSxDQUFBO0FBQUEsS0FDZjtBQUFBLEdBQ0QsQ0FBQSxDQUFBO0FBRUQsRUFBQSxNQUFNQyxXQUFXQSxNQUFNO0FBQ3JCLElBQUksSUFBQSxDQUFDcEIsT0FBT2EsS0FBTyxFQUFBO0FBQ2pCLE1BQU9JLE9BQUFBLEtBQUFBLENBQUFBLENBQUFBO0FBQUFBLEtBQ1Q7QUFDQSxJQUFPLE9BQUEsS0FBS0ksWUFBWUMsU0FBVSxFQUFBLENBQUVDLEtBQUtDLGFBQWNqQyxDQUFBQSxLQUFLLENBQUMsQ0FBZ0MsR0FBQSxDQUFBO0FBQUEsR0FDL0YsQ0FBQTtBQUVBLEVBQU8sT0FBQTtBQUFBLElBQ0xXLElBQUFBO0FBQUFBLElBQ0FGLE1BQUFBO0FBQUFBLElBQ0FvQixRQUFBQTtBQUFBQSxHQUNGLENBQUE7QUFDRjs7QUM1RkEsSUFBSUssUUFBVyxHQUFBLENBQUEsQ0FBQTtBQUtmLE1BQU1DLGlCQUFtRyxDQUFBO0FBQUEsRUE0RXZHQyxZQUE2QkMsSUFBYyxFQUFBO0FBQWRBLElBQUFBLElBQUFBLENBQUFBLElBQUFBLEdBQUFBLElBQUFBLENBQUFBO0FBQUFBLEdBQWU7QUFBQSxFQTNFbkNDLEtBQVEsR0FBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBSWZDLFVBQVksRUFBQTtBQUFBLE1BQ1ZuQixJQUFNb0IsRUFBQUEsTUFBQUE7QUFBQUEsTUFDTkMsUUFBVSxFQUFBLElBQUE7QUFBQSxLQUNaO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFLQUMsV0FBYSxFQUFBO0FBQUEsTUFDWHRCLElBQU1vQixFQUFBQSxNQUFBQTtBQUFBQSxNQUNOQyxRQUFVLEVBQUEsSUFBQTtBQUFBLEtBQ1o7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUtBeEMsR0FBSyxFQUFBO0FBQUEsTUFDSG1CLElBQU11QixFQUFBQSxNQUFBQTtBQUFBQSxNQUNORixRQUFVLEVBQUEsS0FBQTtBQUFBLEtBQ1o7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUtBRyxPQUFTLEVBQUE7QUFBQSxNQUNQeEI7TUFDQXlCLE9BQUFBLEVBQVNBLE9BQU8sRUFBQyxDQUFBO0FBQUEsS0FDbkI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBTUF6QyxPQUFTLEVBQUE7QUFBQSxNQUNQZ0IsSUFBTW9CLEVBQUFBLE1BQUFBO0FBQUFBLE1BQ05DLFFBQVUsRUFBQSxLQUFBO0FBQUEsS0FDWjtBQUFBO0FBQUE7QUFBQTtBQUFBLElBS0FLLE1BQVEsRUFBQTtBQUFBLE1BQ04xQixJQUFNb0IsRUFBQUEsTUFBQUE7QUFBQUEsTUFDTkssT0FBUyxFQUFBLE9BQUE7QUFBQSxLQUNYO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFLQXhDLGdCQUFrQixFQUFBO0FBQUEsTUFDaEJlLElBQU0yQixFQUFBQSxPQUFBQTtBQUFBQSxNQUNORixPQUFTLEVBQUEsSUFBQTtBQUFBLEtBQ1g7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUtBRyxTQUFXLEVBQUE7QUFBQSxNQUNUNUIsSUFBTTJCLEVBQUFBLE9BQUFBO0FBQUFBLE1BQ05GLE9BQVMsRUFBQSxJQUFBO0FBQUEsS0FDWDtBQUFBO0FBQUE7QUFBQTtBQUFBLElBS0FJLElBQU0sRUFBQTtBQUFBLE1BQ0o3QixJQUFNMkIsRUFBQUEsT0FBQUE7QUFBQUEsTUFDTkYsT0FBUyxFQUFBLElBQUE7QUFBQSxLQUNYO0FBQUEsR0FDRixDQUFBO0FBQUEsRUFJQUssTUFBQUEsQ0FBd0NiLE1BQWNjLE1BQWEsRUFBQTtBQUdqRSxJQUFBLE9BQU9DLGVBQXdILENBQUE7QUFBQSxNQUM3SGYsTUFBTSxJQUFLQSxDQUFBQSxJQUFBQTtBQUFBQSxNQUNYQyxPQUFPLElBQUtBLENBQUFBLEtBQUFBO0FBQUFBLE1BQ1plLEtBQU9GLEVBQUFBLE1BQUFBO0FBQUFBLE1BQ1BHLE1BQUFBLEVBQVEsQ0FBQyxVQUFVLENBQUE7QUFBQSxNQUNuQkMsTUFBTWpCLEtBQU8sRUFBQTtBQUFBLFFBQUVrQixLQUFBQTtBQUFBQSxRQUFPQyxJQUFBQTtBQUFBQSxRQUFNSCxNQUFBQTtBQUFBQSxPQUFVLEVBQUE7QUFDcEMsUUFBQSxNQUFNSSxHQUFNQyxHQUFBQSxTQUFBQSxDQUFVckIsS0FBTyxFQUFBLFlBQUEsRUFBY21CLElBQUksQ0FBQSxDQUFBO0FBRS9DLFFBQUEsTUFBTUcsS0FBTUosS0FBTUksQ0FBQUEsRUFBQUEsSUFBTyxRQUFPdkIsSUFBSyxDQUFBLFNBQUEsRUFBVyxFQUFFSCxRQUFTLENBQUEsQ0FBQSxDQUFBO0FBRTNELFFBQU0sTUFBQTtBQUFBLFVBQUUyQixXQUFBQTtBQUFBQSxVQUFhQyxRQUFBQTtBQUFBQSxVQUFVckQsTUFBQUE7QUFBQUEsU0FBV3NELEdBQUFBLGFBQUFBO0FBQUFBLFVBQ3hDTCxHQUFBQTtBQUFBQSxVQUNBcEIsS0FBTUksQ0FBQUEsV0FBQUE7QUFBQUE7QUFBQUEsVUFFTjtBQUFBLFlBQ0UsR0FBSUosS0FBTU0sQ0FBQUEsT0FBQUEsSUFBVyxFQUFDO0FBQUEsWUFDdEIzQyxLQUFLcUMsS0FBTXJDLENBQUFBLEdBQUFBO0FBQUFBLFlBQ1grRCxFQUFJM0IsRUFBQUEsSUFBQUE7QUFBQUEsWUFDSmhDLGtCQUFrQmlDLEtBQU1qQyxDQUFBQSxnQkFBQUE7QUFBQUEsWUFDeEIyQyxXQUFXVixLQUFNVSxDQUFBQSxTQUFBQTtBQUFBQSxZQUNqQmlCLFNBQUFBLEVBQVksSUFBR0wsRUFBRyxDQUFBLENBQUE7QUFBQSxZQUNsQnhELFNBQVNrQyxLQUFNbEMsQ0FBQUEsT0FBQUE7QUFBQUEsWUFDZkYsS0FBQUEsRUFBUSxDQUFtRG9DLGlEQUFBQSxFQUFBQSxLQUFBQSxDQUFNUSxNQUFPLENBQUEsR0FBQSxDQUFBO0FBQUEsWUFDeEVvQixXQUFXQyxVQUFXaEIsQ0FBQUEsTUFBTSxFQUN6QmlCLE1BQU8vQixDQUFBQSxDQUFBQSxVQUFRLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQSxDQUFFZ0MsU0FBU2hDLEtBQWUsQ0FBQSxFQUMvRGlDLE1BQU8sQ0FBQSxDQUFDQyxLQUFLbEMsS0FBVSxNQUFBO0FBQUEsY0FDdEIsR0FBR2tDLEdBQUFBO0FBQUFBLGNBQ0gsQ0FBQ2xDLEtBQUksR0FBSW1DLENBQVMsSUFBQSxLQUFBO0FBRWhCZixnQkFBQUEsSUFBQUEsQ0FBS3BCLE9BQU1tQyxJQUFJLENBQUEsQ0FBQTtBQUFBLGVBQ2pCO0FBQUEsYUFDRixDQUFBLEVBQUksRUFBRSxDQUFBO0FBQUEsV0FDVjtBQUFBLFNBQ0YsQ0FBQTtBQUVBbEIsUUFBTyxNQUFBLENBQUE7QUFBQSxVQUFFUSxRQUFBQSxFQUFVVyxRQUFTWCxDQUFBQSxRQUFBQSxDQUFTeEMsS0FBSyxDQUFBO0FBQUEsU0FBRyxDQUFBLENBQUE7QUFFN0NvRCxRQUFBQSxXQUFBQSxDQUFZLE1BQU07QUFDaEIsVUFBSWpFLElBQUFBLE1BQUFBLElBQVVvRCxXQUFZLEVBQUEsRUFBR1osSUFBTSxFQUFBO0FBQ2pDUSxZQUFLLElBQUEsQ0FBQSxXQUFBLEVBQWFJLGFBQWEsQ0FBQSxDQUFBO0FBQy9CLFlBQUksSUFBQTtBQUNGLGNBQUlILElBQUFBLEdBQUFBLENBQUlwQyxPQUFPcUQsTUFBUSxFQUFBO0FBQ3JCZCxnQkFBQUEsV0FBQUEsRUFBY1osQ0FBQUEsSUFBQUEsQ0FBS1MsR0FBSXBDLENBQUFBLEtBQUFBLEVBQU9nQixNQUFNSSxXQUFhLEVBQUE7QUFBQSxrQkFBRSxHQUFHSixLQUFNTSxDQUFBQSxPQUFBQTtBQUFBQSxrQkFBU3FCLFNBQUFBLEVBQVksSUFBR0wsRUFBRyxDQUFBLENBQUE7QUFBQSxpQkFBVyxDQUFBLENBQUE7QUFBQSxlQUM3RixNQUFBO0FBQ0xDLGdCQUFBQSxXQUFBQSxHQUFjZSxJQUFLLEVBQUEsQ0FBQTtBQUFBLGVBQ3JCO0FBQUEscUJBQ092RCxDQUFHLEVBQUE7QUFBQSxhQUFDO0FBQUEsV0FDZjtBQUFBLFNBQ0QsQ0FBQSxDQUFBO0FBRUQsUUFBQSxPQUFPLE1BQUF3RCxXQUFBQSxDQUFBQyxLQUFBQSxFQUFBQSxVQUFBQSxDQUFpQnRCLEtBQUssRUFBQTtBQUFBLFVBQUEsSUFBT0ksRUFBQUEsRUFBQUE7QUFBQUEsVUFBRSxXQUFBLEVBQUEsd0JBQUE7QUFBQSxTQUE0QyxHQUFBLElBQUEsQ0FBQSxDQUFBO0FBQUEsT0FDcEY7QUFBQSxLQUNELENBQUEsQ0FBQTtBQUFBLEdBQ0g7QUFDRixDQUFBO0FBRWdCbUIsU0FBQUEsaUJBQUFBLENBQ2QxQyxNQUVBYyxNQUNBLEVBQUE7QUFDQSxFQUFBLE1BQU02QixPQUFVLEdBQUE7QUFBQSxJQUNkLEdBQUc3QixNQUFBQTtBQUFBQSxJQUNILFdBQUEsRUFBYThCLENBQUNULElBQWEsS0FBQSxJQUFBO0FBQUEsSUFDM0Isb0JBQUEsRUFBc0JVLENBQUNWLElBQXdCLEtBQUEsSUFBQTtBQUFBLEdBQ2pELENBQUE7QUFJQSxFQUFNVyxNQUFBQSxTQUFBQSxHQUFZLElBQUloRCxpQkFBb0NpRCxDQUFBQSxRQUFBQSxDQUFTLFVBQVVuRCxhQUFjSSxDQUFBQSxJQUFJLENBQUMsQ0FBQyxDQUFBLENBQUE7QUFFakcsRUFBTzhDLE9BQUFBLFNBQUFBLENBQVVqQyxNQUFPYixDQUFBQSxJQUFBQSxFQUFNMkMsT0FBTyxDQUFBLENBQUE7QUFDdkM7O0FDaktZL0MsSUFBQUEsYUFBQUEscUJBQUFBLGNBQUwsS0FBQTtBQUNMb0QsRUFBQUEsZUFBQUEsVUFBVyxDQUFBLEdBQUEsaUJBQUEsQ0FBQTtBQUNYQyxFQUFBQSxlQUFBQSxRQUFTLENBQUEsR0FBQSxZQUFBLENBQUE7QUFDVEMsRUFBQUEsZUFBQUEsU0FBVSxDQUFBLEdBQUEsU0FBQSxDQUFBO0FBQ1ZDLEVBQUFBLGVBQUFBLFNBQVUsQ0FBQSxHQUFBLGdCQUFBLENBQUE7QUFDVkMsRUFBQUEsZUFBQUEsVUFBVyxDQUFBLEdBQUEsaUJBQUEsQ0FBQTtBQUxEeEQsRUFBQUEsT0FBQUEsY0FBQUEsQ0FBQUE7QUFBQUEsQ0FBQUEsRUFBQUEsYUFBQUEsSUFBQUEsRUFBQUEsQ0FBQUEsQ0FBQUE7QUFzQkk4QixTQUFBQSxhQUFBQSxDQUNkSCxJQUNBbEIsV0FDQSxFQUFBO0FBQUEsRUFDRXpDLEdBQUFBO0FBQUFBLEVBQ0FJLGdCQUFBQTtBQUFBQSxFQUNBMkQsRUFBQUE7QUFBQUEsRUFDQWhCLFNBQVksR0FBQSxJQUFBO0FBQUEsRUFDWmtCLFNBQUFBO0FBQUFBLEVBQ0EvRCxNQUFBQTtBQUFBQSxFQUNBQyxPQUFBQTtBQUFBQSxFQUNBRixLQUFBQTtBQUFBQSxFQUNBLEdBQUcwQyxPQUFBQTtBQUMrRCxDQUNwRSxFQUFBO0FBQ0EsRUFBQSxNQUFNa0IsV0FBV3BELEdBQU8sRUFBQSxDQUFBO0FBQ3hCLEVBQU1tRCxNQUFBQSxXQUFBQSxHQUFjQSxNQUFNQyxRQUFTeEMsQ0FBQUEsS0FBQUEsQ0FBQUE7QUFFbkMsRUFBTSxNQUFBO0FBQUEsSUFBRWIsTUFBQUE7QUFBQUEsSUFBUW9CLFFBQUFBO0FBQUFBLEdBQVMsR0FBSTlCLE9BQVVpRSxFQUFJLEVBQUE7QUFBQSxJQUN6Qy9ELEdBQUFBO0FBQUFBLElBQ0FDLEtBQUFBO0FBQUFBLElBQ0FFLE9BQUFBO0FBQUFBLElBQ0FELE1BQUFBO0FBQUFBLElBQ0FFLGdCQUFBQTtBQUFBQSxHQUNELENBQUEsQ0FBQTtBQUVEcUYsRUFBUyxRQUFBLENBQUEsTUFBTWpGLE1BQU9hLENBQUFBLEtBQUFBLEVBQU8sTUFBTTtBQUNqQyxJQUFJLElBQUEsQ0FBQ3VDLGFBQWlCLElBQUEsQ0FBQzhCLFlBQVk5QixXQUFZLEVBQUEsRUFBRyxhQUFhLENBQUcsRUFBQTtBQUNoRUMsTUFBQUEsUUFBQUEsQ0FBU3hDLFFBQVFPLFFBQVMsRUFBQSxDQUFBO0FBQUEsS0FDNUI7QUFFQSxJQUFBLElBQUlxQyxTQUFXLEVBQUE7QUFDYjBCLE1BQUFBLGFBQUFBLENBQWlCMUIsU0FBUyxDQUFFMkIsQ0FBQUEsT0FBQUEsQ0FBUSxDQUFDLENBQUNDLEtBQUFBLEVBQU9DLFFBQVEsQ0FBTSxLQUFBO0FBQ3pEbEMsUUFBWSxXQUFBLEVBQUEsQ0FBR21DLFdBQVlGLENBQUFBLEtBQUFBLEVBQU9DLFFBQVMsQ0FBQSxDQUFBO0FBQUEsT0FDNUMsQ0FBQSxDQUFBO0FBQUEsS0FDSDtBQUVBLElBQUEsSUFBSS9DLFNBQVcsRUFBQTtBQUNiYSxNQUFZLFdBQUEsRUFBQSxDQUFHWixJQUFLZ0QsQ0FBQUEsT0FBQUEsQ0FBUXJDLEVBQUUsQ0FBQSxFQUFHcUMsUUFBUXZELFdBQVcsQ0FBQSxFQUFJRSxPQUFXLElBQUEsRUFBc0IsQ0FBQSxDQUFBO0FBQUEsS0FDM0Y7QUFBQSxHQUNELENBQUEsQ0FBQTtBQUVELEVBQU8sT0FBQTtBQUFBLElBQ0xuQyxNQUFBQTtBQUFBQSxJQUNBcUQsUUFBQUE7QUFBQUEsSUFDQWpDLFFBQUFBO0FBQUFBLElBQ0FnQyxXQUFBQTtBQUFBQSxHQUNGLENBQUE7QUFDRjs7QUN6RUEsTUFBTXFDLGVBQWtCLEdBQUE7QUFBQSxFQUN0QkMsTUFBUUEsRUFBQUEsQ0FBQ0MsT0FBNENDLEtBQUFBLE9BQUFBLENBQVFELE9BQU8sQ0FBQTtBQUFBLEVBQ3BFRSxNQUFRQSxFQUFBQSxDQUFDRixPQUFxQzdFLEtBQUFBLEtBQUFBLENBQU02RSxPQUFPLENBQUE7QUFBQSxFQUMzRGIsT0FBU0EsRUFBQUEsQ0FBQ2EsT0FBa0I3RSxLQUFBQSxLQUFBQSxDQUFNNkUsT0FBTyxDQUFBO0FBQUEsRUFDekNHLFFBQVVBLEVBQUFBLENBQUNILE9BQW9CQyxLQUFBQSxPQUFBQSxDQUFRRCxPQUFPLENBQUE7QUFBQSxFQUM5Q0ksTUFBUUEsRUFBQUEsQ0FBQ0osT0FBb0JDLEtBQUFBLE9BQUFBLENBQVFELE9BQU8sQ0FBQTtBQUFBLEVBQzVDSyxNQUFRQSxFQUFBQSxDQUFDTCxPQUFvQkMsS0FBQUEsT0FBQUEsQ0FBUUQsT0FBTyxDQUFBO0FBQUEsRUFDNUNNLFFBQVVBLEVBQUFBLENBQUNOLE9BQW9CN0UsS0FBQUEsS0FBQUEsQ0FBTTZFLE9BQU8sQ0FBQTtBQUFBLEVBQzVDbEQsTUFBUUEsRUFBQUEsQ0FBQ2tELE9BQW9CN0UsS0FBQUEsS0FBQUEsQ0FBTTZFLE9BQU8sQ0FBQTtBQUM1QyxDQUFBLENBQUE7QUFzRmdCTyxTQUFBQSxxQkFBQUEsQ0FBc0JDLE1BQTBCbEUsRUFBQUEsV0FBQUEsRUFBK0JFLE9BQWlFLEVBQUE7QUFDOUosRUFBT21CLE9BQUFBLGFBQUFBLENBQ0w2QyxRQUNBbEUsV0FDQSxFQUFBO0FBQUEsSUFDRXJDLGdCQUFrQixFQUFBLElBQUE7QUFBQSxJQUNsQixHQUFJdUMsV0FBVyxFQUFDO0FBQUEsSUFDaEJvQixFQUFJLEVBQUEsVUFBQTtBQUFBLEdBRVIsQ0FBQSxDQUFBO0FBQ0YsQ0FBQTtBQUVhNkMsTUFBQUEsa0JBQUFBLG1CQUNYLGlCQUFBLENBQUEsVUFBQSxFQUNBWCxlQUNGOztBQy9HQSxNQUFNWSxjQUFpQixHQUFBO0FBQUEsRUFDckJDLE1BQVFBLEVBQUFBLENBQUN2QyxJQUFjakQsS0FBQUEsS0FBQUEsQ0FBTWlELElBQUksQ0FBQTtBQUFBLEVBQ2pDd0MsSUFBTUEsRUFBQUEsQ0FBQ3hDLElBQWNqRCxLQUFBQSxLQUFBQSxDQUFNaUQsSUFBSSxDQUFBO0FBQUEsRUFDL0JrQyxRQUFVQSxFQUFBQSxDQUFDbEMsSUFBY2pELEtBQUFBLEtBQUFBLENBQU1pRCxJQUFJLENBQUE7QUFBQSxFQUNuQ3lDLFlBQWNBLEVBQUFBLENBQUN6QyxJQUFjakQsS0FBQUEsS0FBQUEsQ0FBTWlELElBQUksQ0FBQTtBQUFBLEVBQ3ZDMEMsV0FBYUEsRUFBQUEsQ0FBQzFDLElBQWNqRCxLQUFBQSxLQUFBQSxDQUFNaUQsSUFBSSxDQUFBO0FBQ3hDLENBQUEsQ0FBQTtBQTREZ0IyQyxTQUFBQSxhQUFBQSxDQUFjUCxNQUEwQmxFLEVBQUFBLFdBQUFBLEVBQStCRSxPQUErRCxFQUFBO0FBQ3BKLEVBQU9tQixPQUFBQSxhQUFBQSxDQUNMNkMsUUFDQWxFLFdBQ0EsRUFBQTtBQUFBLElBQ0VyQyxnQkFBa0IsRUFBQSxJQUFBO0FBQUEsSUFDbEIsR0FBSXVDLFdBQVcsRUFBQztBQUFBLElBQ2hCb0IsRUFBSSxFQUFBLFNBQUE7QUFBQSxHQUVSLENBQUEsQ0FBQTtBQUNGLENBQUE7QUFFYW9ELE1BQUFBLFVBQUFBLG1CQUNYLGlCQUFBLENBQUEsU0FBQSxFQUNBTixjQUNGOztBQ2hGQSxNQUFNTyxhQUFnQixHQUFBO0FBQUEsRUFDcEJDLE1BQVFBLEVBQUFBLENBQUM5QyxJQUF5Q2pELEtBQUFBLEtBQUFBLENBQU1pRCxJQUFJLENBQUE7QUFBQSxFQUM1RCtDLFFBQVFBLE1BQU0sSUFBQTtBQUNoQixDQUFBLENBQUE7QUFzQ2dCQyxTQUFBQSxnQkFBQUEsQ0FBaUJaLE1BQTBCbEUsRUFBQUEsV0FBQUEsRUFBK0JFLE9BQXFFLEVBQUE7QUFDN0osRUFBT21CLE9BQUFBLGFBQUFBLENBQ0w2QyxRQUNBbEUsV0FDQSxFQUFBO0FBQUEsSUFDRXJDLGdCQUFrQixFQUFBLElBQUE7QUFBQSxJQUNsQixHQUFJdUMsV0FBVyxFQUFDO0FBQUEsSUFDaEJvQixFQUFJLEVBQUEsUUFBQTtBQUFBLEdBRVIsQ0FBQSxDQUFBO0FBQ0YsQ0FBQTtBQUVheUQsTUFBQUEsYUFBQUEsbUJBQ1gsaUJBQUEsQ0FBQSxRQUFBLEVBQ0FKLGFBQ0Y7O0FDekRBLE1BQU1LLGlCQUFpQixFQUFDLENBQUE7QUE0Q1JDLFNBQUFBLG9CQUFBQSxDQUFxQmYsTUFBMEJsRSxFQUFBQSxXQUFBQSxFQUErQkUsT0FBK0QsRUFBQTtBQUMzSixFQUFPbUIsT0FBQUEsYUFBQUEsQ0FDTDZDLFFBQ0FsRSxXQUNBLEVBQUE7QUFBQSxJQUNFckMsZ0JBQWtCLEVBQUEsSUFBQTtBQUFBLElBQ2xCLEdBQUl1QyxXQUFXLEVBQUM7QUFBQSxJQUNoQm9CLEVBQUksRUFBQSxTQUFBO0FBQUEsR0FFUixDQUFBLENBQUE7QUFDRixDQUFBO0FBRWE0RCxNQUFBQSxpQkFBQUEsbUJBQ1gsaUJBQUEsQ0FBQSxTQUFBLEVBQ0FGLGNBQ0Y7O0FDMURBLE1BQU1HLGVBQWtCLEdBQUE7QUFBQSxFQUN0QkMsT0FBT0EsTUFBTSxJQUFBO0FBQUEsRUFDYkMsUUFBVUEsRUFBQUEsQ0FBQzNCLE9BQW9CQyxLQUFBQSxPQUFBQSxDQUFRRCxPQUFPLENBQUE7QUFBQSxFQUM5QzRCLEtBQU9BLEVBQUFBLENBQUN4RCxJQUFnQmpELEtBQUFBLEtBQUFBLENBQU1pRCxJQUFJLENBQUE7QUFBQSxFQUNsQ2lDLE1BQVFBLEVBQUFBLENBQUNMLE9BQWtCN0UsS0FBQUEsS0FBQUEsQ0FBTTZFLE9BQU8sQ0FBQTtBQUMxQyxDQUFBLENBQUE7QUErQmdCNkIsU0FBQUEscUJBQUFBLENBQXNCckIsTUFBMEJsRSxFQUFBQSxXQUFBQSxFQUErQkUsT0FBaUUsRUFBQTtBQUM5SixFQUFPbUIsT0FBQUEsYUFBQUEsQ0FDTDZDLFFBQ0FsRSxXQUNBLEVBQUE7QUFBQSxJQUNFckMsZ0JBQWtCLEVBQUEsSUFBQTtBQUFBLElBQ2xCLEdBQUl1QyxXQUFXLEVBQUM7QUFBQSxJQUNoQm9CLEVBQUksRUFBQSxVQUFBO0FBQUEsR0FFUixDQUFBLENBQUE7QUFDRixDQUFBO0FBRWFrRSxNQUFBQSxrQkFBQUEsbUJBQ1gsaUJBQUEsQ0FBQSxVQUFBLEVBQ0FMLGVBQ0Y7Ozs7In0=