obsidian-dev-utils 80.0.1 → 80.0.2
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/CHANGELOG.md +4 -0
- package/dist/lib/cjs/library.cjs +1 -1
- package/dist/lib/cjs/script-utils/linters/over-exposure.cjs +69 -3
- package/dist/lib/cjs/script-utils/linters/over-exposure.d.cts +7 -1
- package/dist/lib/esm/library.mjs +1 -1
- package/dist/lib/esm/script-utils/linters/over-exposure.d.mts +7 -1
- package/dist/lib/esm/script-utils/linters/over-exposure.mjs +70 -3
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
package/dist/lib/cjs/library.cjs
CHANGED
|
@@ -130,7 +130,7 @@ __export(library_exports, {
|
|
|
130
130
|
LIBRARY_VERSION: () => LIBRARY_VERSION
|
|
131
131
|
});
|
|
132
132
|
module.exports = __toCommonJS(library_exports);
|
|
133
|
-
const LIBRARY_VERSION = "80.0.
|
|
133
|
+
const LIBRARY_VERSION = "80.0.2";
|
|
134
134
|
const LIBRARY_NAME = "obsidian-dev-utils";
|
|
135
135
|
const LIBRARY_STYLES = ".obsidian-dev-utils.code-highlighter-component textarea, .obsidian-dev-utils.code-highlighter-component pre, .obsidian-dev-utils.code-highlighter-component code {\n font-family: var(--font-monospace);\n line-height: var(--line-height-normal);\n margin: 0;\n}\n.obsidian-dev-utils.code-highlighter-component textarea, .obsidian-dev-utils.code-highlighter-component code {\n font-size: var(--code-size);\n}\n.obsidian-dev-utils.code-highlighter-component textarea {\n background: transparent;\n color: transparent;\n z-index: 2;\n width: 20em;\n height: 10em;\n}\n.obsidian-dev-utils.code-highlighter-component pre {\n position: absolute;\n pointer-events: none;\n border: var(--input-border-width) solid transparent;\n overflow: auto;\n inset: 0;\n padding: var(--size-4-1) var(--size-4-2);\n z-index: 1;\n}\n.obsidian-dev-utils.code-highlighter-component pre::after {\n content: \"\";\n display: block;\n height: var(--bottom-gap, 0);\n}\n.obsidian-dev-utils.code-highlighter-component pre.is-placeholder {\n opacity: 0.6;\n}\n.obsidian-dev-utils.code-highlighter-component code {\n display: block;\n padding: 0;\n}\n\n.obsidian-dev-utils input[type=url] {\n height: var(--input-height);\n}\n.obsidian-dev-utils input[type=month],\n.obsidian-dev-utils input[type=tel],\n.obsidian-dev-utils input[type=time],\n.obsidian-dev-utils input[type=url],\n.obsidian-dev-utils input[type=week] {\n -webkit-app-region: no-drag;\n background: var(--background-modifier-form-field);\n border: var(--input-border-width) solid var(--background-modifier-border);\n color: var(--text-normal);\n font-family: inherit;\n padding: var(--size-4-1) var(--size-4-2);\n font-size: var(--font-ui-small);\n border-radius: var(--input-radius);\n outline: none;\n}\n@media (hover: hover) {\n .obsidian-dev-utils input[type=month]:hover,\n .obsidian-dev-utils input[type=tel]:hover,\n .obsidian-dev-utils input[type=time]:hover,\n .obsidian-dev-utils input[type=url]:hover,\n .obsidian-dev-utils input[type=week]:hover {\n border-color: var(--background-modifier-border-hover);\n transition: box-shadow 0.15s ease-in-out, border 0.15s ease-in-out;\n }\n}\n.obsidian-dev-utils input[type=month]:active, .obsidian-dev-utils input[type=month]:focus,\n.obsidian-dev-utils input[type=tel]:active,\n.obsidian-dev-utils input[type=tel]:focus,\n.obsidian-dev-utils input[type=time]:active,\n.obsidian-dev-utils input[type=time]:focus,\n.obsidian-dev-utils input[type=url]:active,\n.obsidian-dev-utils input[type=url]:focus,\n.obsidian-dev-utils input[type=week]:active,\n.obsidian-dev-utils input[type=week]:focus {\n border-color: var(--background-modifier-border-focus);\n transition: box-shadow 0.15s ease-in-out, border 0.15s ease-in-out;\n}\n.obsidian-dev-utils input[type=month]:active, .obsidian-dev-utils input[type=month]:focus, .obsidian-dev-utils input[type=month]:focus-visible,\n.obsidian-dev-utils input[type=tel]:active,\n.obsidian-dev-utils input[type=tel]:focus,\n.obsidian-dev-utils input[type=tel]:focus-visible,\n.obsidian-dev-utils input[type=time]:active,\n.obsidian-dev-utils input[type=time]:focus,\n.obsidian-dev-utils input[type=time]:focus-visible,\n.obsidian-dev-utils input[type=url]:active,\n.obsidian-dev-utils input[type=url]:focus,\n.obsidian-dev-utils input[type=url]:focus-visible,\n.obsidian-dev-utils input[type=week]:active,\n.obsidian-dev-utils input[type=week]:focus,\n.obsidian-dev-utils input[type=week]:focus-visible {\n box-shadow: 0 0 0 2px var(--background-modifier-border-focus);\n}\n.obsidian-dev-utils input[type=month]::placeholder,\n.obsidian-dev-utils input[type=tel]::placeholder,\n.obsidian-dev-utils input[type=time]::placeholder,\n.obsidian-dev-utils input[type=url]::placeholder,\n.obsidian-dev-utils input[type=week]::placeholder {\n color: var(--text-faint);\n}\n.mod-rtl input[type=month],\n.mod-rtl input[type=time],\n.mod-rtl input[type=week],\n.is-rtl input[type=month],\n.is-rtl input[type=time],\n.is-rtl input[type=week],\n.rtl input[type=month],\n.rtl input[type=time],\n.rtl input[type=week] {\n direction: rtl;\n}\n.mod-rtl input[type=month]::-webkit-calendar-picker-indicator,\n.mod-rtl input[type=time]::-webkit-calendar-picker-indicator,\n.mod-rtl input[type=week]::-webkit-calendar-picker-indicator,\n.is-rtl input[type=month]::-webkit-calendar-picker-indicator,\n.is-rtl input[type=time]::-webkit-calendar-picker-indicator,\n.is-rtl input[type=week]::-webkit-calendar-picker-indicator,\n.rtl input[type=month]::-webkit-calendar-picker-indicator,\n.rtl input[type=time]::-webkit-calendar-picker-indicator,\n.rtl input[type=week]::-webkit-calendar-picker-indicator {\n right: var(--size-4-1);\n left: auto;\n}\n\n.obsidian-dev-utils input[type=month],\n.obsidian-dev-utils input[type=time],\n.obsidian-dev-utils input[type=week] {\n font-variant-numeric: tabular-nums;\n position: relative;\n}\n.obsidian-dev-utils input[type=month]::-webkit-datetime-edit-text,\n.obsidian-dev-utils input[type=time]::-webkit-datetime-edit-text,\n.obsidian-dev-utils input[type=week]::-webkit-datetime-edit-text {\n color: var(--text-faint);\n padding-inline-end: 0;\n}\n.obsidian-dev-utils input[type=month]::-webkit-calendar-picker-indicator,\n.obsidian-dev-utils input[type=time]::-webkit-calendar-picker-indicator,\n.obsidian-dev-utils input[type=week]::-webkit-calendar-picker-indicator {\n position: absolute;\n left: var(--size-4-1);\n right: auto;\n opacity: 0.5;\n}\n.obsidian-dev-utils input[type=month]::-webkit-datetime-edit-month-field:active, .obsidian-dev-utils input[type=month]::-webkit-datetime-edit-month-field:focus, .obsidian-dev-utils input[type=month]::-webkit-datetime-edit-day-field:active, .obsidian-dev-utils input[type=month]::-webkit-datetime-edit-day-field:focus, .obsidian-dev-utils input[type=month]::-webkit-datetime-edit-year-field:active, .obsidian-dev-utils input[type=month]::-webkit-datetime-edit-year-field:focus,\n.obsidian-dev-utils input[type=time]::-webkit-datetime-edit-month-field:active,\n.obsidian-dev-utils input[type=time]::-webkit-datetime-edit-month-field:focus,\n.obsidian-dev-utils input[type=time]::-webkit-datetime-edit-day-field:active,\n.obsidian-dev-utils input[type=time]::-webkit-datetime-edit-day-field:focus,\n.obsidian-dev-utils input[type=time]::-webkit-datetime-edit-year-field:active,\n.obsidian-dev-utils input[type=time]::-webkit-datetime-edit-year-field:focus,\n.obsidian-dev-utils input[type=week]::-webkit-datetime-edit-month-field:active,\n.obsidian-dev-utils input[type=week]::-webkit-datetime-edit-month-field:focus,\n.obsidian-dev-utils input[type=week]::-webkit-datetime-edit-day-field:active,\n.obsidian-dev-utils input[type=week]::-webkit-datetime-edit-day-field:focus,\n.obsidian-dev-utils input[type=week]::-webkit-datetime-edit-year-field:active,\n.obsidian-dev-utils input[type=week]::-webkit-datetime-edit-year-field:focus {\n background-color: var(--text-selection);\n color: var(--text-normal);\n cursor: text;\n}\n.mod-rtl .obsidian-dev-utils input[type=month], .is-rtl .obsidian-dev-utils input[type=month], .rtl .obsidian-dev-utils input[type=month],\n.mod-rtl .obsidian-dev-utils input[type=time],\n.is-rtl .obsidian-dev-utils input[type=time],\n.rtl .obsidian-dev-utils input[type=time],\n.mod-rtl .obsidian-dev-utils input[type=week],\n.is-rtl .obsidian-dev-utils input[type=week],\n.rtl .obsidian-dev-utils input[type=week] {\n direction: rtl;\n}\n.mod-rtl .obsidian-dev-utils input[type=month]::-webkit-calendar-picker-indicator, .is-rtl .obsidian-dev-utils input[type=month]::-webkit-calendar-picker-indicator, .rtl .obsidian-dev-utils input[type=month]::-webkit-calendar-picker-indicator,\n.mod-rtl .obsidian-dev-utils input[type=time]::-webkit-calendar-picker-indicator,\n.is-rtl .obsidian-dev-utils input[type=time]::-webkit-calendar-picker-indicator,\n.rtl .obsidian-dev-utils input[type=time]::-webkit-calendar-picker-indicator,\n.mod-rtl .obsidian-dev-utils input[type=week]::-webkit-calendar-picker-indicator,\n.is-rtl .obsidian-dev-utils input[type=week]::-webkit-calendar-picker-indicator,\n.rtl .obsidian-dev-utils input[type=week]::-webkit-calendar-picker-indicator {\n left: auto;\n right: var(--size-4-1);\n}\n\nbody:not(.is-ios):not(.is-android) .obsidian-dev-utils input[type=month],\nbody:not(.is-ios):not(.is-android) .obsidian-dev-utils input[type=time],\nbody:not(.is-ios):not(.is-android) .obsidian-dev-utils input[type=week] {\n padding-inline-start: var(--size-4-6);\n}\n\n.obsidian-dev-utils input[type=time]::-webkit-calendar-picker-indicator {\n margin-inline-start: 0;\n}\n\n.obsidian-dev-utilsprogress.loop {\n min-width: 200px;\n}\n\n.obsidian-dev-utils.modal-container .ok-button {\n margin-right: 10px;\n margin-top: 20px;\n}\n\n.obsidian-dev-utils .multiple-dropdown-component select,\n.obsidian-dev-utils .multiple-dropdown-component select:focus,\n.obsidian-dev-utils .multiple-dropdown-component .dropdown {\n height: auto;\n padding-top: 3px;\n}\n.obsidian-dev-utils .multiple-dropdown-component select option:checked,\n.obsidian-dev-utils .multiple-dropdown-component select:focus option:checked,\n.obsidian-dev-utils .multiple-dropdown-component .dropdown option:checked {\n background-color: #1967d2;\n color: #fff;\n}\n\n.obsidian-dev-utils.plugin-settings-tab a:focus {\n outline: 2px solid var(--link-color);\n}\n\n.obsidian-dev-utils.prompt-modal .text-box {\n width: 100%;\n}\n\n.obsidian-dev-utils.tri-state-checkbox-component input[type=checkbox]:indeterminate {\n appearance: checkbox;\n}\n\n.obsidian-dev-utils :invalid {\n box-shadow: 0 0 0 2px var(--text-error);\n}\n.obsidian-dev-utils input.metadata-input-text:active:invalid, .obsidian-dev-utils input.metadata-input-text:focus-visible:invalid, .obsidian-dev-utils input.metadata-input-text:focus:invalid,\n.obsidian-dev-utils input[type=date]:active:invalid,\n.obsidian-dev-utils input[type=date]:focus-visible:invalid,\n.obsidian-dev-utils input[type=date]:focus:invalid,\n.obsidian-dev-utils input[type=datetime-local]:active:invalid,\n.obsidian-dev-utils input[type=datetime-local]:focus-visible:invalid,\n.obsidian-dev-utils input[type=datetime-local]:focus:invalid,\n.obsidian-dev-utils input[type=email]:active:invalid,\n.obsidian-dev-utils input[type=email]:focus-visible:invalid,\n.obsidian-dev-utils input[type=email]:focus:invalid,\n.obsidian-dev-utils input[type=number]:active:invalid,\n.obsidian-dev-utils input[type=number]:focus-visible:invalid,\n.obsidian-dev-utils input[type=number]:focus:invalid,\n.obsidian-dev-utils input[type=password]:active:invalid,\n.obsidian-dev-utils input[type=password]:focus-visible:invalid,\n.obsidian-dev-utils input[type=password]:focus:invalid,\n.obsidian-dev-utils input[type=search]:active:invalid,\n.obsidian-dev-utils input[type=search]:focus-visible:invalid,\n.obsidian-dev-utils input[type=search]:focus:invalid,\n.obsidian-dev-utils input[type=text]:active:invalid,\n.obsidian-dev-utils input[type=text]:focus-visible:invalid,\n.obsidian-dev-utils input[type=text]:focus:invalid,\n.obsidian-dev-utils textarea:active:invalid,\n.obsidian-dev-utils textarea:focus-visible:invalid,\n.obsidian-dev-utils textarea:focus:invalid {\n box-shadow: 0 0 0 2px var(--text-error);\n}\n.obsidian-dev-utils.setting-component-wrapper {\n position: relative;\n display: inline-flex;\n}\n.obsidian-dev-utils.overlay-validator {\n caret-color: transparent;\n cursor: default;\n position: absolute;\n background-color: transparent;\n border: none;\n outline: none;\n pointer-events: none;\n z-index: 9999;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n}\n.obsidian-dev-utils.tooltip.tooltip-validator {\n position: absolute;\n top: calc(100% + 8px);\n width: max-content;\n}\n\n/*# sourceMappingURL=data:application/json;charset=utf-8,%7B%22version%22:3,%22sourceRoot%22:%22%22,%22sources%22:%5B%22../src/styles/code-highlighter-component.scss%22,%22../src/styles/input.scss%22,%22../src/styles/input-time.scss%22,%22../src/styles/loop.scss%22,%22../src/styles/modal-container.scss%22,%22../src/styles/multiple-dropdown-component.scss%22,%22../src/styles/plugin-settings-tab.scss%22,%22../src/styles/prompt-modal.scss%22,%22../src/styles/tri-state-checkbox-component.scss%22,%22../src/styles/validation.scss%22%5D,%22names%22:%5B%5D,%22mappings%22:%22AAEI;EACE;EACA;EACA;;AAGF;EACE;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;;AAGF;EACE;;AAGF;EACE;EACA;;;ACzCJ;EACE;;AAGF;AAAA;AAAA;AAAA;AAAA;EAKE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGE;EACE;AAAA;AAAA;AAAA;AAAA;IACE;IACA,YACE;;;AAMR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAEE;EACA,YACE;;AAIJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAGE;;AAGF;AAAA;AAAA;AAAA;AAAA;EACE;;AASE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAGE;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;EACA;;;AC7DV;AAAA;AAAA;EAGE;EACA;;AAEA;AAAA;AAAA;EACE;EACA;;AAGF;AAAA;AAAA;EACE;EACA;EACA;EACA;;AAMA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAEE;EACA;EACA;;AAIK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAGP;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;EACA;;;AAKF;AAAA;AAAA;EACE;;;AAMJ;EACE;;;ACjDJ;EACE;;;ACAA;EACE;EACA;;;ACFF;AAAA;AAAA;EAGE;EACA;;AAEA;AAAA;AAAA;EACE;EACA;;;ACRJ;EACE;;;ACDF;EACE;;;ACDF;EACE;;;ACEJ;EAJA;;AAoBI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EApBJ;;AA0BA;EACE;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA%22,%22file%22:%22styles.css%22,%22sourcesContent%22:%5B%22.obsidian-dev-utils%20%7B%5Cn%20%20&.code-highlighter-component%20%7B%5Cn%20%20%20%20textarea,%20pre,%20code%20%7B%5Cn%20%20%20%20%20%20font-family:%20var(--font-monospace);%5Cn%20%20%20%20%20%20line-height:%20var(--line-height-normal);%5Cn%20%20%20%20%20%20margin:%200;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20textarea,%20code%20%7B%5Cn%20%20%20%20%20%20font-size:%20var(--code-size);%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20textarea%20%7B%5Cn%20%20%20%20%20%20background:%20transparent;%5Cn%20%20%20%20%20%20color:%20transparent;%5Cn%20%20%20%20%20%20z-index:%202;%5Cn%20%20%20%20%20%20width:%2020em;%5Cn%20%20%20%20%20%20height:%2010em;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20pre%20%7B%5Cn%20%20%20%20%20%20position:%20absolute;%5Cn%20%20%20%20%20%20pointer-events:%20none;%5Cn%20%20%20%20%20%20border:%20var(--input-border-width)%20solid%20transparent;%5Cn%20%20%20%20%20%20overflow:%20auto;%5Cn%20%20%20%20%20%20inset:%200;%5Cn%20%20%20%20%20%20padding:%20var(--size-4-1)%20var(--size-4-2);%5Cn%20%20%20%20%20%20z-index:%201;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20pre::after%20%7B%5Cn%20%20%20%20%20%20content:%20%5C%22%5C%22;%5Cn%20%20%20%20%20%20display:%20block;%5Cn%20%20%20%20%20%20height:%20var(--bottom-gap,%200);%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20pre.is-placeholder%20%7B%5Cn%20%20%20%20%20%20opacity:%200.6;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20code%20%7B%5Cn%20%20%20%20%20%20display:%20block;%5Cn%20%20%20%20%20%20padding:%200;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20input%5Btype='url'%5D%20%7B%5Cn%20%20%20%20height:%20var(--input-height)%5Cn%20%20%7D%5Cn%5Cn%20%20input%5Btype='month'%5D,%5Cn%20%20input%5Btype='tel'%5D,%5Cn%20%20input%5Btype='time'%5D,%5Cn%20%20input%5Btype='url'%5D,%5Cn%20%20input%5Btype='week'%5D%20%7B%5Cn%20%20%20%20-webkit-app-region:%20no-drag;%5Cn%20%20%20%20background:%20var(--background-modifier-form-field);%5Cn%20%20%20%20border:%20var(--input-border-width)%20solid%20var(--background-modifier-border);%5Cn%20%20%20%20color:%20var(--text-normal);%5Cn%20%20%20%20font-family:%20inherit;%5Cn%20%20%20%20padding:%20var(--size-4-1)%20var(--size-4-2);%5Cn%20%20%20%20font-size:%20var(--font-ui-small);%5Cn%20%20%20%20border-radius:%20var(--input-radius);%5Cn%20%20%20%20outline:%20none;%5Cn%5Cn%20%20%20%20@at-root%20%7B%5Cn%20%20%20%20%20%20@media%20(hover:%20hover)%20%7B%5Cn%20%20%20%20%20%20%20%20&:hover%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20border-color:%20var(--background-modifier-border-hover);%5Cn%20%20%20%20%20%20%20%20%20%20transition:%5Cn%20%20%20%20%20%20%20%20%20%20%20%20box-shadow%200.15s%20ease-in-out,%5Cn%20%20%20%20%20%20%20%20%20%20%20%20border%200.15s%20ease-in-out;%5Cn%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20&:active,%5Cn%20%20%20%20&:focus%20%7B%5Cn%20%20%20%20%20%20border-color:%20var(--background-modifier-border-focus);%5Cn%20%20%20%20%20%20transition:%5Cn%20%20%20%20%20%20%20%20box-shadow%200.15s%20ease-in-out,%5Cn%20%20%20%20%20%20%20%20border%200.15s%20ease-in-out;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20&:active,%5Cn%20%20%20%20&:focus,%5Cn%20%20%20%20&:focus-visible%20%7B%5Cn%20%20%20%20%20%20box-shadow:%200%200%200%202px%20var(--background-modifier-border-focus);%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20&::placeholder%20%7B%5Cn%20%20%20%20%20%20color:%20var(--text-faint);%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20@at-root%20%7B%5Cn%20%20%20%20.mod-rtl,%5Cn%20%20%20%20.is-rtl,%5Cn%20%20%20%20.rtl%20%7B%5Cn%20%20%20%20%20%20&%20%7B%5Cn%20%20%20%20%20%20%20%20input%5Btype='month'%5D,%5Cn%20%20%20%20%20%20%20%20input%5Btype='time'%5D,%5Cn%20%20%20%20%20%20%20%20input%5Btype='week'%5D%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20direction:%20rtl;%5Cn%5Cn%20%20%20%20%20%20%20%20%20%20&::-webkit-calendar-picker-indicator%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20right:%20var(--size-4-1);%5Cn%20%20%20%20%20%20%20%20%20%20%20%20left:%20auto;%5Cn%20%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20input%5Btype='month'%5D,%5Cn%20%20input%5Btype='time'%5D,%5Cn%20%20input%5Btype='week'%5D%20%7B%5Cn%20%20%20%20font-variant-numeric:%20tabular-nums;%5Cn%20%20%20%20position:%20relative;%5Cn%5Cn%20%20%20%20&::-webkit-datetime-edit-text%20%7B%5Cn%20%20%20%20%20%20color:%20var(--text-faint);%5Cn%20%20%20%20%20%20padding-inline-end:%200;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20&::-webkit-calendar-picker-indicator%20%7B%5Cn%20%20%20%20%20%20position:%20absolute;%5Cn%20%20%20%20%20%20left:%20var(--size-4-1);%5Cn%20%20%20%20%20%20right:%20auto;%5Cn%20%20%20%20%20%20opacity:%200.5;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20&::-webkit-datetime-edit-month-field,%5Cn%20%20%20%20&::-webkit-datetime-edit-day-field,%5Cn%20%20%20%20&::-webkit-datetime-edit-year-field%20%7B%5Cn%20%20%20%20%20%20&:active,%5Cn%20%20%20%20%20%20&:focus%20%7B%5Cn%20%20%20%20%20%20%20%20background-color:%20var(--text-selection);%5Cn%20%20%20%20%20%20%20%20color:%20var(--text-normal);%5Cn%20%20%20%20%20%20%20%20cursor:%20text;%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20@at-root%20.mod-rtl%20&,%5Cn%20%20%20%20%20%20.is-rtl%20&,%5Cn%20%20%20%20%20%20.rtl%20&%20%7B%5Cn%20%20%20%20%20%20direction:%20rtl;%5Cn%5Cn%20%20%20%20%20%20&::-webkit-calendar-picker-indicator%20%7B%5Cn%20%20%20%20%20%20%20%20left:%20auto;%5Cn%20%20%20%20%20%20%20%20right:%20var(--size-4-1);%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20@at-root%20%7B%5Cn%20%20%20%20%20%20body:not(.is-ios):not(.is-android)%20&%20%7B%5Cn%20%20%20%20%20%20%20%20padding-inline-start:%20var(--size-4-6);%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20input%5Btype='time'%5D%20%7B%5Cn%20%20%20%20&::-webkit-calendar-picker-indicator%20%7B%5Cn%20%20%20%20%20%20margin-inline-start:%200;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20&progress.loop%20%7B%5Cn%20%20%20%20min-width:%20200px;%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20&.modal-container%20%7B%5Cn%20%20%20%20.ok-button%20%7B%5Cn%20%20%20%20%20%20margin-right:%2010px;%5Cn%20%20%20%20%20%20margin-top:%2020px;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20.multiple-dropdown-component%20%7B%5Cn%20%20%20%20select,%5Cn%20%20%20%20select:focus,%5Cn%20%20%20%20.dropdown%20%7B%5Cn%20%20%20%20%20%20height:%20auto;%5Cn%20%20%20%20%20%20padding-top:%203px;%5Cn%5Cn%20%20%20%20%20%20option:checked%20%7B%5Cn%20%20%20%20%20%20%20%20background-color:%20%231967d2;%5Cn%20%20%20%20%20%20%20%20color:%20%23fff;%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20&.plugin-settings-tab%20%7B%5Cn%20%20%20%20a:focus%20%7B%5Cn%20%20%20%20%20%20outline:%202px%20solid%20var(--link-color);%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20&.prompt-modal%20%7B%5Cn%20%20%20%20.text-box%20%7B%5Cn%20%20%20%20%20%20width:%20100%25;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cr%5Cn%20%20&.tri-state-checkbox-component%20%7B%5Cr%5Cn%20%20%20%20input%5Btype='checkbox'%5D:indeterminate%20%7B%5Cr%5Cn%20%20%20%20%20%20appearance:%20checkbox;%5Cr%5Cn%20%20%20%20%7D%5Cr%5Cn%20%20%7D%5Cr%5Cn%7D%5Cr%5Cn%22,%22@mixin%20invalid%20%7B%5Cn%20%20box-shadow:%200%200%200%202px%20var(--text-error);%5Cn%7D%5Cn%5Cn.obsidian-dev-utils%20%7B%5Cn%20%20:invalid%20%7B%5Cn%20%20%20%20@include%20invalid;%5Cn%20%20%7D%5Cn%5Cn%20%20input.metadata-input-text,%5Cn%20%20input%5Btype='date'%5D,%5Cn%20%20input%5Btype='datetime-local'%5D,%5Cn%20%20input%5Btype='email'%5D,%5Cn%20%20input%5Btype='number'%5D,%5Cn%20%20input%5Btype='password'%5D,%5Cn%20%20input%5Btype='search'%5D,%5Cn%20%20input%5Btype='text'%5D,%5Cn%20%20textarea%20%7B%5Cn%20%20%20%20&:active,%5Cn%20%20%20%20&:focus-visible,%5Cn%20%20%20%20&:focus%20%7B%5Cn%20%20%20%20%20%20&:invalid%20%7B%5Cn%20%20%20%20%20%20%20%20@include%20invalid;%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20&.setting-component-wrapper%20%7B%5Cn%20%20%20%20position:%20relative;%5Cn%20%20%20%20display:%20inline-flex;%5Cn%20%20%7D%5Cn%5Cn%20%20&.overlay-validator%20%7B%5Cn%20%20%20%20caret-color:%20transparent;%5Cn%20%20%20%20cursor:%20default;%5Cn%20%20%20%20position:%20absolute;%5Cn%20%20%20%20background-color:%20transparent;%5Cn%20%20%20%20border:%20none;%5Cn%20%20%20%20outline:%20none;%5Cn%20%20%20%20pointer-events:%20none;%5Cn%20%20%20%20z-index:%209999;%5Cn%20%20%20%20left:%200;%5Cn%20%20%20%20top:%200;%5Cn%20%20%20%20width:%20100%25;%5Cn%20%20%20%20height:%20100%25;%5Cn%20%20%7D%5Cn%5Cn%20%20&.tooltip.tooltip-validator%20%7B%5Cn%20%20%20%20position:%20absolute;%5Cn%20%20%20%20top:%20calc(100%25%20+%208px);%5Cn%20%20%20%20width:%20max-content;%5Cn%20%20%7D%5Cn%7D%5Cn%22%5D%7D */\n";
|
|
136
136
|
// Annotate the CommonJS export names for ESM import in node:
|
|
@@ -283,7 +283,8 @@ function analyzeMember(node, context) {
|
|
|
283
283
|
return;
|
|
284
284
|
}
|
|
285
285
|
const sourceFile = member.getSourceFile();
|
|
286
|
-
const
|
|
286
|
+
const directReferences = collectReferences(context.languageService.findReferences(sourceFile.fileName, nameNode.getStart())).filter((reference) => !isDeclarationItself(reference, nameNode));
|
|
287
|
+
const references = [...directReferences, ...collectStringLiteralReferences(nameNode, declaringClass, context)];
|
|
287
288
|
const nonTestReferences = references.filter((reference) => !isTestFile((0, import_check_project_types.toCanonical)(reference.fileName)));
|
|
288
289
|
const neededForSrc = computeNeededExposure(nonTestReferences, declaringClass, context);
|
|
289
290
|
const neededWithTests = computeNeededExposure(references, declaringClass, context);
|
|
@@ -372,6 +373,24 @@ function buildFinding(node, nameNode, currentExposure, suggestedExposure, flags)
|
|
|
372
373
|
wasFixed: false
|
|
373
374
|
};
|
|
374
375
|
}
|
|
376
|
+
function buildStringLiteralIndex(program) {
|
|
377
|
+
const index = /* @__PURE__ */ new Map();
|
|
378
|
+
for (const sourceFile of program.getSourceFiles()) {
|
|
379
|
+
if (sourceFile.isDeclarationFile) {
|
|
380
|
+
continue;
|
|
381
|
+
}
|
|
382
|
+
collectInNode(sourceFile);
|
|
383
|
+
}
|
|
384
|
+
return index;
|
|
385
|
+
function collectInNode(node) {
|
|
386
|
+
if ((0, import_typescript.isStringLiteralLike)(node)) {
|
|
387
|
+
const occurrences = index.get(node.text) ?? [];
|
|
388
|
+
occurrences.push({ node, sourceFile: node.getSourceFile() });
|
|
389
|
+
index.set(node.text, occurrences);
|
|
390
|
+
}
|
|
391
|
+
node.forEachChild(collectInNode);
|
|
392
|
+
}
|
|
393
|
+
}
|
|
375
394
|
function collectReferences(referencedSymbols) {
|
|
376
395
|
const references = [];
|
|
377
396
|
for (const referencedSymbol of referencedSymbols ?? []) {
|
|
@@ -381,6 +400,20 @@ function collectReferences(referencedSymbols) {
|
|
|
381
400
|
}
|
|
382
401
|
return references;
|
|
383
402
|
}
|
|
403
|
+
function collectStringLiteralReferences(nameNode, declaringClass, context) {
|
|
404
|
+
const occurrences = context.stringLiteralOccurrencesByText.get(nameNode.getText());
|
|
405
|
+
if (!occurrences || occurrences.length === 0) {
|
|
406
|
+
return [];
|
|
407
|
+
}
|
|
408
|
+
const keySet = getClassKeySet(declaringClass, context.checker);
|
|
409
|
+
const references = [];
|
|
410
|
+
for (const occurrence of occurrences) {
|
|
411
|
+
if (isKeyReferenceToClass(occurrence.node, keySet, context.checker)) {
|
|
412
|
+
references.push({ fileName: occurrence.sourceFile.fileName, start: occurrence.node.getStart() });
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
return references;
|
|
416
|
+
}
|
|
384
417
|
function computeExportRemovalEdit(declaration) {
|
|
385
418
|
const sourceFile = declaration.getSourceFile();
|
|
386
419
|
const modifiers = (0, import_typescript.getModifiers)(declaration);
|
|
@@ -520,6 +553,11 @@ function getClassAtPosition(program, fileName, position) {
|
|
|
520
553
|
(0, import_type_guards.assertNonNullable)(node, `No node found at position ${String(position)} in ${fileName}`);
|
|
521
554
|
return getEnclosingClass(node);
|
|
522
555
|
}
|
|
556
|
+
function getClassKeySet(declaringClass, checker) {
|
|
557
|
+
const classSymbol = declaringClass.name ? checker.getSymbolAtLocation(declaringClass.name) : void 0;
|
|
558
|
+
const classType = classSymbol ? checker.getDeclaredTypeOfSymbol(classSymbol) : checker.getTypeAtLocation(declaringClass);
|
|
559
|
+
return new Set(classType.getProperties().map((property) => property.name));
|
|
560
|
+
}
|
|
523
561
|
function getCurrentMemberExposure(modifierKinds) {
|
|
524
562
|
if (modifierKinds.has(import_typescript.SyntaxKind.PrivateKeyword)) {
|
|
525
563
|
return "private";
|
|
@@ -554,6 +592,22 @@ function getModifierKinds(node) {
|
|
|
554
592
|
}
|
|
555
593
|
return kinds;
|
|
556
594
|
}
|
|
595
|
+
function getStringLiteralConstituents(type) {
|
|
596
|
+
if (type.isStringLiteral()) {
|
|
597
|
+
return [type.value];
|
|
598
|
+
}
|
|
599
|
+
if (type.isUnion()) {
|
|
600
|
+
const literals = [];
|
|
601
|
+
for (const constituent of type.types) {
|
|
602
|
+
if (!constituent.isStringLiteral()) {
|
|
603
|
+
return null;
|
|
604
|
+
}
|
|
605
|
+
literals.push(constituent.value);
|
|
606
|
+
}
|
|
607
|
+
return literals;
|
|
608
|
+
}
|
|
609
|
+
return null;
|
|
610
|
+
}
|
|
557
611
|
function hasTsDocComment(node) {
|
|
558
612
|
const sourceFile = node.getSourceFile();
|
|
559
613
|
const fullText = sourceFile.getFullText();
|
|
@@ -588,6 +642,17 @@ function isDerivedFrom(derived, base, checker) {
|
|
|
588
642
|
}
|
|
589
643
|
return false;
|
|
590
644
|
}
|
|
645
|
+
function isKeyReferenceToClass(node, keySet, checker) {
|
|
646
|
+
const contextualType = checker.getContextualType(node);
|
|
647
|
+
if (!contextualType) {
|
|
648
|
+
return false;
|
|
649
|
+
}
|
|
650
|
+
const literals = getStringLiteralConstituents(contextualType);
|
|
651
|
+
if (!literals) {
|
|
652
|
+
return false;
|
|
653
|
+
}
|
|
654
|
+
return literals.every((literal) => keySet.has(literal));
|
|
655
|
+
}
|
|
591
656
|
function isOwnSourceFile(filePath, srcFolder) {
|
|
592
657
|
return filePath.startsWith(`${srcFolder}/`) && filePath.endsWith(".ts") && !filePath.endsWith(".d.ts");
|
|
593
658
|
}
|
|
@@ -613,7 +678,8 @@ function runOverExposureAnalysis(params) {
|
|
|
613
678
|
findings: [],
|
|
614
679
|
languageService,
|
|
615
680
|
program,
|
|
616
|
-
shouldForce: params.shouldForce ?? false
|
|
681
|
+
shouldForce: params.shouldForce ?? false,
|
|
682
|
+
stringLiteralOccurrencesByText: buildStringLiteralIndex(program)
|
|
617
683
|
};
|
|
618
684
|
const sourceFilesToAnalyze = program.getSourceFiles().filter((sourceFile) => {
|
|
619
685
|
const filePath = (0, import_check_project_types.toCanonical)(sourceFile.fileName);
|
|
@@ -649,4 +715,4 @@ function toDisplayPath(filePath, baseFolder) {
|
|
|
649
715
|
findOverExposure,
|
|
650
716
|
formatOverExposureFindings
|
|
651
717
|
});
|
|
652
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy9saW50ZXJzL292ZXItZXhwb3N1cmUudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBPdmVyLWV4cG9zdXJlIGFuYWx5emVyLlxuICpcbiAqIEZpbmRzIGRlY2xhcmF0aW9ucyBleHBvc2VkIG1vcmUgYnJvYWRseSB0aGFuIHRoZWlyIHJlZmVyZW5jZXMgcmVxdWlyZSwgc28gdGhlIGV4cG9zdXJlIGNhbiBiZVxuICogdGlnaHRlbmVkOlxuICpcbiAqIC0gYGV4cG9ydGBlZCBzeW1ib2xzIHJlZmVyZW5jZWQgb25seSB3aXRoaW4gdGhlaXIgb3duIGZpbGUgXHUyMDE0IHRoZSBgZXhwb3J0YCBjYW4gYmUgZHJvcHBlZC5cbiAqIC0gYHB1YmxpY2AgY2xhc3MgbWVtYmVycyByZWZlcmVuY2VkIG9ubHkgaW5zaWRlIHRoZWlyIG93biBjbGFzcyBcdTIwMTQgdGhleSBjYW4gYmUgYHByaXZhdGVgLlxuICogLSBgcHVibGljYCBjbGFzcyBtZW1iZXJzIHJlZmVyZW5jZWQgb25seSBpbnNpZGUgdGhlaXIgb3duIGNsYXNzIGFuZCBpdHMgc3ViY2xhc3NlcyBcdTIwMTQgdGhleSBjYW4gYmVcbiAqICAgYHByb3RlY3RlZGAuXG4gKiAtIGBwcm90ZWN0ZWRgIGNsYXNzIG1lbWJlcnMgcmVmZXJlbmNlZCBvbmx5IGluc2lkZSB0aGVpciBvd24gY2xhc3MgXHUyMDE0IHRoZXkgY2FuIGJlIGBwcml2YXRlYC5cbiAqXG4gKiBUaGUgYW5hbHlzaXMgaXMgd2hvbGUtcHJvZ3JhbSBhbmQgdHlwZS1hd2FyZTogaXQgdXNlcyB0aGUgVHlwZVNjcmlwdCBsYW5ndWFnZSBzZXJ2aWNlJ3NcbiAqIGZpbmQtYWxsLXJlZmVyZW5jZXMgdG8gbG9jYXRlIGV2ZXJ5IHVzZSBvZiBlYWNoIGRlY2xhcmF0aW9uLCB0aGVuIGNsYXNzaWZpZXMgdGhlIHRpZ2h0ZXN0XG4gKiBleHBvc3VyZSB0aGF0IHN0aWxsIGNvdmVycyBhbGwgcmVmZXJlbmNlcy4gTWVtYmVycyBpbnZva2VkIGJ5IHRoZSBmcmFtZXdvcmsgdmlhIHJlZ2lzdHJhdGlvblxuICogcmF0aGVyIHRoYW4gYnkgdmlzaWJsZSByZWZlcmVuY2VzIChPYnNpZGlhbiBsaWZlY3ljbGUgaG9va3MsIHNldHRpbmdzLXRhYiBgZGlzcGxheWAsIGV0Yy4pIGFyZVxuICogZXhjbHVkZWQgdmlhIHtAbGluayBMSUZFQ1lDTEVfQUxMT1dMSVNUfSwgYXMgYXJlIGBvdmVycmlkZWAgYW5kIGBzdGF0aWNgIG1lbWJlcnMgd2hvc2UgZXhwb3N1cmUgaXNcbiAqIGNvbnN0cmFpbmVkIGJ5IGEgYmFzZSBkZWNsYXJhdGlvbi4gRUNNQVNjcmlwdCBoYXJkLXByaXZhdGUgbWVtYmVycyAoYCNuYW1lYCkgYXJlIGFsc28gZXhjbHVkZWQgXHUyMDE0XG4gKiB0aGV5IGFyZSBhbHJlYWR5IG1heGltYWxseSBwcml2YXRlIGFuZCBjYW5ub3QgY2FycnkgYSB2aXNpYmlsaXR5IG1vZGlmaWVyLiBBIGRlY2xhcmF0aW9uIGNhcnJ5aW5nXG4gKiBhIFRTRG9jIChgLyoqIFx1MjAyNiAqXFwvYCkgZG9jdW1lbnRhdGlvbiBjb21tZW50IGlzIGxpa2V3aXNlIGV4Y2x1ZGVkIFx1MjAxNCB3aGV0aGVyIGEgdG9wLWxldmVsIGBleHBvcnRgIG9yXG4gKiBhIGNsYXNzIG1lbWJlciwgZG9jdW1lbnRpbmcgaXQgaXMgYSBkZWxpYmVyYXRlIHNpZ25hbCB0aGF0IGl0IGlzIHBhcnQgb2YgdGhlIGludGVuZGVkIHB1YmxpYyBBUEksXG4gKiByZWdhcmRsZXNzIG9mIHdoZXJlIGl0IGN1cnJlbnRseSBoYXBwZW5zIHRvIGJlIHJlZmVyZW5jZWQuXG4gKlxuICogQSBtZW1iZXIgcmVmZXJlbmNlZCBvbmx5IGZyb20gdGVzdCBmaWxlcyBpcyByZXBvcnRlZCB3aXRoIHtAbGluayBPdmVyRXhwb3N1cmVGaW5kaW5nLmlzRm9yY2VkQnlUZXN0T25seX1cbiAqIHNldCwgc3VyZmFjaW5nIG1lbWJlcnMgd2lkZW5lZCBwdXJlbHkgZm9yIHRlc3RhYmlsaXR5IFx1MjAxNCB0aGUgY2Fub25pY2FsIGNhc2UgZm9yIGV4dHJhY3RpbmcgbG9naWNcbiAqIGludG8gYW4gaW5kZXBlbmRlbnRseSB0ZXN0YWJsZSBjb21wb25lbnQgaW5zdGVhZC5cbiAqXG4gKiBCZXlvbmQgcmVwb3J0aW5nLCBwYXNzaW5nIGBzaG91bGRGaXhgIHRvIHtAbGluayBmaW5kT3ZlckV4cG9zdXJlfSAvIHtAbGluayBhbmFseXplT3ZlckV4cG9zdXJlfVxuICogcmV3cml0ZXMgdGhlIHNvdXJjZSBpbiBwbGFjZTogZHJvcHBpbmcgdGhlIGBleHBvcnRgIGtleXdvcmQsIG9yIHJlcGxhY2luZy9pbnNlcnRpbmcgYSBgcHJpdmF0ZWBcbiAqIG9yIGBwcm90ZWN0ZWRgIG1vZGlmaWVyLiBFYWNoIGZpbmRpbmcgdGhlbiBjYXJyaWVzIHtAbGluayBPdmVyRXhwb3N1cmVGaW5kaW5nLndhc0ZpeGVkfSAvXG4gKiB7QGxpbmsgT3ZlckV4cG9zdXJlRmluZGluZy5za2lwUmVhc29ufS4gQ2hhbmdlcyB0aGF0IGNhbm5vdCBiZSBzYWZlbHkgYXV0b21hdGVkIFx1MjAxNCB0aG9zZSBmb3JjZWRcbiAqIG9ubHkgYnkgdGVzdCByZWZlcmVuY2VzLCBkZWNvcmF0ZWQgbWVtYmVycywgb3IgYW4gYGV4cG9ydGAgc2hhcmVkIHdpdGggYSBzdGlsbC1leHBvcnRlZCBzaWJsaW5nIFx1MjAxNFxuICogYXJlIHJlcG9ydGVkIGFzIHNraXBwZWQgYW5kIGxlZnQgdW50b3VjaGVkLlxuICpcbiAqIEFkZGl0aW9uYWxseSBwYXNzaW5nIGBzaG91bGRGb3JjZWAgKG9ubHkgbWVhbmluZ2Z1bCB0b2dldGhlciB3aXRoIGBzaG91bGRGaXhgKSB0aWdodGVucyB0aGVcbiAqIGRlY2xhcmF0aW9ucyBoZWxkIHdpZGUgcHVyZWx5IGJ5IHRlc3QgcmVmZXJlbmNlcyB0b28gXHUyMDE0IHRoZSBwcm9kdWN0aW9uIGhhbGYgb2YgdGhlIGNhbm9uaWNhbFxuICogdGVzdC1vbmx5IG1pZ3JhdGlvbjogdGhlIG1lbWJlciBiZWNvbWVzIGBwcml2YXRlYCAvIHRoZSBgZXhwb3J0YCBpcyBkcm9wcGVkLCBsZWF2aW5nIG9ubHkgdGhlXG4gKiB0ZXN0IHRvIHN3aXRjaCB0byBhIGNhc3QtYmFzZWQgYWNjZXNzLiBEZWNvcmF0ZWQgbWVtYmVycyBhbmQgZXhwb3J0cyBzaGFyZWQgd2l0aCBhIHN0aWxsLWV4cG9ydGVkXG4gKiBzaWJsaW5nIHN0YXkgc2tpcHBlZCBldmVuIHVuZGVyIGBzaG91bGRGb3JjZWAsIGJlY2F1c2Ugbm8gZWRpdCBjYW4gYmUgYXBwbGllZCBzYWZlbHkuXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBDbGFzc0RlY2xhcmF0aW9uLFxuICBDbGFzc0xpa2VEZWNsYXJhdGlvbixcbiAgQ29tcGlsZXJPcHRpb25zLFxuICBFbnVtRGVjbGFyYXRpb24sXG4gIEZ1bmN0aW9uRGVjbGFyYXRpb24sXG4gIEdldEFjY2Vzc29yRGVjbGFyYXRpb24sXG4gIEludGVyZmFjZURlY2xhcmF0aW9uLFxuICBJU2NyaXB0U25hcHNob3QsXG4gIExhbmd1YWdlU2VydmljZSxcbiAgTGFuZ3VhZ2VTZXJ2aWNlSG9zdCxcbiAgTWV0aG9kRGVjbGFyYXRpb24sXG4gIE5vZGUsXG4gIFByb2dyYW0sXG4gIFByb3BlcnR5RGVjbGFyYXRpb24sXG4gIFJlZmVyZW5jZWRTeW1ib2wsXG4gIFNldEFjY2Vzc29yRGVjbGFyYXRpb24sXG4gIFR5cGVBbGlhc0RlY2xhcmF0aW9uLFxuICBUeXBlQ2hlY2tlcixcbiAgVmFyaWFibGVTdGF0ZW1lbnRcbn0gZnJvbSAndHlwZXNjcmlwdCc7XG5cbmltcG9ydCB7XG4gIGNhbkhhdmVNb2RpZmllcnMsXG4gIGNyZWF0ZURvY3VtZW50UmVnaXN0cnksXG4gIGNyZWF0ZUxhbmd1YWdlU2VydmljZSxcbiAgZ2V0RGVjb3JhdG9ycyxcbiAgZ2V0RGVmYXVsdExpYkZpbGVQYXRoLFxuICBnZXRMZWFkaW5nQ29tbWVudFJhbmdlcyxcbiAgZ2V0TW9kaWZpZXJzLFxuICBpc0NsYXNzRGVjbGFyYXRpb24sXG4gIGlzQ2xhc3NMaWtlLFxuICBpc0VudW1EZWNsYXJhdGlvbixcbiAgaXNGdW5jdGlvbkRlY2xhcmF0aW9uLFxuICBpc0dldEFjY2Vzc29yRGVjbGFyYXRpb24sXG4gIGlzSWRlbnRpZmllcixcbiAgaXNJbnRlcmZhY2VEZWNsYXJhdGlvbixcbiAgaXNNZXRob2REZWNsYXJhdGlvbixcbiAgaXNQcml2YXRlSWRlbnRpZmllcixcbiAgaXNQcm9wZXJ0eURlY2xhcmF0aW9uLFxuICBpc1NldEFjY2Vzc29yRGVjbGFyYXRpb24sXG4gIGlzU291cmNlRmlsZSxcbiAgaXNUeXBlQWxpYXNEZWNsYXJhdGlvbixcbiAgaXNWYXJpYWJsZVN0YXRlbWVudCxcbiAgU2NyaXB0U25hcHNob3QsXG4gIFN5bnRheEtpbmQsXG4gIHN5c1xufSBmcm9tICd0eXBlc2NyaXB0JztcblxuaW1wb3J0IHsgYXNzZXJ0Tm9uTnVsbGFibGUgfSBmcm9tICcuLi8uLi90eXBlLWd1YXJkcy50cyc7XG5pbXBvcnQge1xuICBwYXJzZVRzQ29uZmlnLFxuICB0b0Nhbm9uaWNhbFxufSBmcm9tICcuLi9jaGVjay1wcm9qZWN0LXR5cGVzLnRzJztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgYW5hbHl6ZU92ZXJFeHBvc3VyZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQW5hbHl6ZU92ZXJFeHBvc3VyZVBhcmFtcyB7XG4gIC8qKiBUaGUgbGFuZ3VhZ2Ugc2VydmljZSB0byBxdWVyeSBmb3IgcmVmZXJlbmNlcyBhbmQgdHlwZXMuICovXG4gIHJlYWRvbmx5IGxhbmd1YWdlU2VydmljZTogTGFuZ3VhZ2VTZXJ2aWNlO1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBjYWxsYmFjayBpbnZva2VkIG9uY2UgcGVyIGFuYWx5emVkIHNvdXJjZSBmaWxlLCBiZWZvcmUgdGhhdCBmaWxlIGlzIHByb2Nlc3NlZC4gVGhlXG4gICAqIHdob2xlLXByb2dyYW0gcmVmZXJlbmNlIGFuYWx5c2lzIGlzIHNsb3csIHNvIHRoaXMgbGV0cyBjYWxsZXJzIHJlcG9ydCBsaXZlIHByb2dyZXNzIGluc3RlYWQgb2ZcbiAgICogYXBwZWFyaW5nIHRvIGhhbmcuXG4gICAqL1xuICBvblByb2dyZXNzPyh0aGlzOiB2b2lkLCBwcm9ncmVzczogT3ZlckV4cG9zdXJlUHJvZ3Jlc3MpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBXaGVuIGB0cnVlYCwgZWFjaCBmaXhhYmxlIGZpbmRpbmcgaXMgdGlnaHRlbmVkIGluIHBsYWNlIHZpYSB7QGxpbmsgd3JpdGVGaWxlfSAod2hpY2ggbXVzdCB0aGVuXG4gICAqIGJlIHByb3ZpZGVkKSwgYW5kIHRoZSByZXR1cm5lZCBmaW5kaW5ncyBjYXJyeSB7QGxpbmsgT3ZlckV4cG9zdXJlRmluZGluZy53YXNGaXhlZH0gL1xuICAgKiB7QGxpbmsgT3ZlckV4cG9zdXJlRmluZGluZy5za2lwUmVhc29ufS4gV2hlbiBgZmFsc2VgIG9yIG9taXR0ZWQsIHRoZSBhbmFseXNpcyBvbmx5IHJlcG9ydHMuXG4gICAqL1xuICByZWFkb25seSBzaG91bGRGaXg/OiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBXaGVuIGB0cnVlYCAob25seSBtZWFuaW5nZnVsIHRvZ2V0aGVyIHdpdGgge0BsaW5rIHNob3VsZEZpeH0pLCBkZWNsYXJhdGlvbnMgaGVsZCB3aWRlIHB1cmVseSBieVxuICAgKiB0ZXN0IHJlZmVyZW5jZXMgYXJlIHRpZ2h0ZW5lZCB0b28sIGluc3RlYWQgb2YgYmVpbmcgc2tpcHBlZCB3aXRoIGEgYHRlc3Qtb25seWBcbiAgICoge0BsaW5rIE92ZXJFeHBvc3VyZUZpbmRpbmcuc2tpcFJlYXNvbn0uIERlY29yYXRlZCBtZW1iZXJzIGFuZCBleHBvcnRzIHNoYXJlZCB3aXRoIGFcbiAgICogc3RpbGwtZXhwb3J0ZWQgc2libGluZyBzdGF5IHNraXBwZWQgcmVnYXJkbGVzcywgYmVjYXVzZSBubyBlZGl0IGNhbiBiZSBhcHBsaWVkIHNhZmVseS5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEZvcmNlPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQWJzb2x1dGUgKGNhbm9uaWNhbCkgcGF0aCBvZiB0aGUgcHJvamVjdCdzIGBzcmNgIGZvbGRlci4gT25seSBkZWNsYXJhdGlvbnMgaW4gbm9uLXRlc3QgZmlsZXNcbiAgICogdW5kZXIgdGhpcyBmb2xkZXIgYXJlIGFuYWx5emVkOyBkZWNsYXJhdGlvbnMgZWxzZXdoZXJlICh0ZXN0IGZpbGVzLCBkZXBlbmRlbmNpZXMpIGFyZSBpZ25vcmVkXG4gICAqIGJ1dCBzdGlsbCBjb3VudGVkIGFzIHJlZmVyZW5jZSBzaXRlcy5cbiAgICovXG4gIHJlYWRvbmx5IHNyY0ZvbGRlcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXcml0ZXMgdGhlIHRpZ2h0ZW5lZCBjb250ZW50cyBvZiBhIGNoYW5nZWQgZmlsZSBiYWNrIHRvIGRpc2suIFJlcXVpcmVkIHdoZW4ge0BsaW5rIHNob3VsZEZpeH1cbiAgICogaXMgYHRydWVgOyBpZ25vcmVkIG90aGVyd2lzZS5cbiAgICpcbiAgICogQHBhcmFtIHBhdGggLSBBYnNvbHV0ZSBwYXRoIG9mIHRoZSBmaWxlIHRvIHdyaXRlIChvcmlnaW5hbCBjYXNpbmcsIGFzIHN0b3JlZCBpbiB0aGUgcHJvZ3JhbSkuXG4gICAqIEBwYXJhbSBjb250ZW50IC0gVGhlIGZ1bGwgbmV3IGZpbGUgY29udGVudHMuXG4gICAqL1xuICB3cml0ZUZpbGU/KHRoaXM6IHZvaWQsIHBhdGg6IHN0cmluZywgY29udGVudDogc3RyaW5nKTogdm9pZDtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgY3JlYXRlTGFuZ3VhZ2VTZXJ2aWNlSG9zdH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlTGFuZ3VhZ2VTZXJ2aWNlSG9zdFBhcmFtcyB7XG4gIC8qKiBUaGUgY29tcGlsZXIgb3B0aW9ucy4gKi9cbiAgcmVhZG9ubHkgY29tcGlsZXJPcHRpb25zOiBDb21waWxlck9wdGlvbnM7XG5cbiAgLyoqIFRoZSBmaWxlcyB0byBpbmNsdWRlIGluIHRoZSBwcm9ncmFtLiAqL1xuICByZWFkb25seSBmaWxlTmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdO1xuXG4gIC8qKiBUaGUgZmlsZS1zeXN0ZW0gb3BlcmF0aW9ucyB1c2VkIHRvIHJlYWQgc291cmNlcy4gKi9cbiAgcmVhZG9ubHkgZmlsZVN5c3RlbTogT3ZlckV4cG9zdXJlRmlsZVN5c3RlbTtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgY3JlYXRlUHJvamVjdExhbmd1YWdlU2VydmljZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlUHJvamVjdExhbmd1YWdlU2VydmljZVBhcmFtcyB7XG4gIC8qKiBBYnNvbHV0ZSBwYXRoIHRvIHRoZSBwcm9qZWN0J3MgYHRzY29uZmlnLmpzb25gLiAqL1xuICByZWFkb25seSB0c0NvbmZpZ1BhdGg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgZXhwb3N1cmUgbGV2ZWwgYSBkZWNsYXJhdGlvbiBjdXJyZW50bHkgaGFzLlxuICovXG5leHBvcnQgdHlwZSBDdXJyZW50RXhwb3N1cmUgPSAnZXhwb3J0JyB8ICdwcm90ZWN0ZWQnIHwgJ3B1YmxpYyc7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGZpbmRPdmVyRXhwb3N1cmV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZpbmRPdmVyRXhwb3N1cmVQYXJhbXMge1xuICAvKipcbiAgICogT3B0aW9uYWwgY2FsbGJhY2sgaW52b2tlZCBvbmNlIHBlciBhbmFseXplZCBzb3VyY2UgZmlsZSwgZm9yIGxpdmUgcHJvZ3Jlc3MgcmVwb3J0aW5nLiBGb3J3YXJkZWRcbiAgICogdG8ge0BsaW5rIGFuYWx5emVPdmVyRXhwb3N1cmV9LlxuICAgKi9cbiAgb25Qcm9ncmVzcz8odGhpczogdm9pZCwgcHJvZ3Jlc3M6IE92ZXJFeHBvc3VyZVByb2dyZXNzKTogdm9pZDtcblxuICAvKiogQWJzb2x1dGUgcGF0aCB0byB0aGUgcHJvamVjdCByb290ICh0aGUgZm9sZGVyIGNvbnRhaW5pbmcgYHRzY29uZmlnLmpzb25gIGFuZCBgc3JjYCkuICovXG4gIHJlYWRvbmx5IHByb2plY3RGb2xkZXI6IHN0cmluZztcblxuICAvKipcbiAgICogV2hlbiBgdHJ1ZWAsIGZpeGFibGUgZmluZGluZ3MgYXJlIHRpZ2h0ZW5lZCBpbiBwbGFjZSBvbiBkaXNrICh0aGUgYGV4cG9ydGAga2V5d29yZCBpcyBkcm9wcGVkLFxuICAgKiBvciBhIGBwcml2YXRlYCAvIGBwcm90ZWN0ZWRgIG1vZGlmaWVyIGlzIGluc2VydGVkL3JlcGxhY2VkKS4gV2hlbiBgZmFsc2VgIG9yIG9taXR0ZWQsIHRoZVxuICAgKiBwcm9qZWN0IGlzIG9ubHkgYW5hbHl6ZWQuXG4gICAqL1xuICByZWFkb25seSBzaG91bGRGaXg/OiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBXaGVuIGB0cnVlYCAob25seSBtZWFuaW5nZnVsIHRvZ2V0aGVyIHdpdGgge0BsaW5rIHNob3VsZEZpeH0pLCBkZWNsYXJhdGlvbnMgaGVsZCB3aWRlIHB1cmVseSBieVxuICAgKiB0ZXN0IHJlZmVyZW5jZXMgYXJlIHRpZ2h0ZW5lZCB0b28sIGluc3RlYWQgb2YgYmVpbmcgc2tpcHBlZC4gRGVjb3JhdGVkIG1lbWJlcnMgYW5kIGV4cG9ydHNcbiAgICogc2hhcmVkIHdpdGggYSBzdGlsbC1leHBvcnRlZCBzaWJsaW5nIHN0YXkgc2tpcHBlZCByZWdhcmRsZXNzLiBGb3J3YXJkZWQgdG9cbiAgICoge0BsaW5rIGFuYWx5emVPdmVyRXhwb3N1cmV9LlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRm9yY2U/OiBib29sZWFuIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBmb3JtYXRPdmVyRXhwb3N1cmVGaW5kaW5nc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRm9ybWF0T3ZlckV4cG9zdXJlRmluZGluZ3NPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoZW4gc2V0LCBmaWxlIHBhdGhzIGluIHRoZSByZXBvcnQgYXJlIHJlbmRlcmVkIHJlbGF0aXZlIHRvIHRoaXMgZm9sZGVyICh0eXBpY2FsbHkgdGhlIGN1cnJlbnRcbiAgICogd29ya2luZyBkaXJlY3RvcnkpIGluc3RlYWQgb2YgYXMgYWJzb2x1dGUgcGF0aHMuIFBhdGhzIG91dHNpZGUgdGhlIGZvbGRlciBzdGF5IGFic29sdXRlLlxuICAgKi9cbiAgcmVhZG9ubHkgYmFzZUZvbGRlcj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgc3Vic2V0IG9mIGZpbGUtc3lzdGVtIG9wZXJhdGlvbnMgdGhlIGxhbmd1YWdlLXNlcnZpY2UgaG9zdCBuZWVkcy4gSW5qZWN0aW5nIHRoaXMgKHJhdGhlciB0aGFuXG4gKiBhbHdheXMgdXNpbmcgYHR5cGVzY3JpcHRgJ3MgYHN5c2ApIGxldHMgdGVzdHMgZHJpdmUgdGhlIGFuYWx5emVyIGFnYWluc3QgaW4tbWVtb3J5IHNvdXJjZXMgd2l0aCBub1xuICogcmVhbCBmaWxlLXN5c3RlbSBhY2Nlc3MuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3ZlckV4cG9zdXJlRmlsZVN5c3RlbSB7XG4gIC8qKlxuICAgKiBAcGFyYW0gcGF0aCAtIERpcmVjdG9yeSBwYXRoLlxuICAgKiBAcmV0dXJucyBgdHJ1ZWAgd2hlbiB0aGUgZGlyZWN0b3J5IGV4aXN0cy5cbiAgICovXG4gIGRpcmVjdG9yeUV4aXN0cyh0aGlzOiB2b2lkLCBwYXRoOiBzdHJpbmcpOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gcGF0aCAtIEZpbGUgcGF0aC5cbiAgICogQHJldHVybnMgYHRydWVgIHdoZW4gdGhlIGZpbGUgZXhpc3RzLlxuICAgKi9cbiAgZmlsZUV4aXN0cyh0aGlzOiB2b2lkLCBwYXRoOiBzdHJpbmcpOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBAcmV0dXJucyBUaGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS5cbiAgICovXG4gIGdldEN1cnJlbnREaXJlY3RvcnkodGhpczogdm9pZCk6IHN0cmluZztcblxuICAvKipcbiAgICogQHBhcmFtIHBhdGggLSBEaXJlY3RvcnkgcGF0aC5cbiAgICogQHJldHVybnMgVGhlIGltbWVkaWF0ZSBzdWJkaXJlY3RvcnkgbmFtZXMuXG4gICAqL1xuICBnZXREaXJlY3Rvcmllcyh0aGlzOiB2b2lkLCBwYXRoOiBzdHJpbmcpOiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogQHBhcmFtIHBhdGggLSBSb290IGRpcmVjdG9yeS5cbiAgICogQHBhcmFtIGV4dGVuc2lvbnMgLSBFeHRlbnNpb25zIHRvIGluY2x1ZGUuXG4gICAqIEBwYXJhbSBleGNsdWRlIC0gUGF0dGVybnMgdG8gZXhjbHVkZS5cbiAgICogQHBhcmFtIGluY2x1ZGUgLSBQYXR0ZXJucyB0byBpbmNsdWRlLlxuICAgKiBAcGFyYW0gZGVwdGggLSBNYXhpbXVtIHJlY3Vyc2lvbiBkZXB0aC5cbiAgICogQHJldHVybnMgVGhlIG1hdGNoaW5nIGZpbGUgcGF0aHMuXG4gICAqL1xuICByZWFkRGlyZWN0b3J5KHRoaXM6IHZvaWQsIHBhdGg6IHN0cmluZywgZXh0ZW5zaW9ucz86IHJlYWRvbmx5IHN0cmluZ1tdLCBleGNsdWRlPzogcmVhZG9ubHkgc3RyaW5nW10sIGluY2x1ZGU/OiByZWFkb25seSBzdHJpbmdbXSwgZGVwdGg/OiBudW1iZXIpOiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogQHBhcmFtIHBhdGggLSBGaWxlIHBhdGguXG4gICAqIEByZXR1cm5zIFRoZSBmaWxlIGNvbnRlbnRzLCBvciBgdW5kZWZpbmVkYCB3aGVuIGFic2VudC5cbiAgICovXG4gIHJlYWRGaWxlKHRoaXM6IHZvaWQsIHBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBBIHNpbmdsZSBvdmVyLWV4cG9zZWQgZGVjbGFyYXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3ZlckV4cG9zdXJlRmluZGluZyB7XG4gIC8qKiAxLWJhc2VkIGNvbHVtbiBvZiB0aGUgZGVjbGFyYXRpb24ncyBuYW1lLiAqL1xuICByZWFkb25seSBjb2x1bW46IG51bWJlcjtcblxuICAvKiogVGhlIGN1cnJlbnQgZXhwb3N1cmUgbGV2ZWwuICovXG4gIHJlYWRvbmx5IGN1cnJlbnRFeHBvc3VyZTogQ3VycmVudEV4cG9zdXJlO1xuXG4gIC8qKiBBYnNvbHV0ZSBwYXRoIG9mIHRoZSBmaWxlIGRlY2xhcmluZyB0aGUgc3ltYm9sLiAqL1xuICByZWFkb25seSBmaWxlUGF0aDogc3RyaW5nO1xuXG4gIC8qKiBgdHJ1ZWAgd2hlbiB0aGUgZGVjbGFyYXRpb24gaGFzIG5vIHJlZmVyZW5jZXMgYXQgYWxsIChiZXNpZGVzIGl0c2VsZikuICovXG4gIHJlYWRvbmx5IGhhc05vUmVmZXJlbmNlczogYm9vbGVhbjtcblxuICAvKipcbiAgICogYHRydWVgIHdoZW4gdGhlIGRlY2xhcmF0aW9uIHdvdWxkIHF1YWxpZnkgZm9yIGEgdGlnaHRlciBleHBvc3VyZSBpZiBub3QgZm9yIHJlZmVyZW5jZXMgY29taW5nXG4gICAqIGV4Y2x1c2l2ZWx5IGZyb20gdGVzdCBmaWxlcyBcdTIwMTQgaS5lLiBpdCBpcyBleHBvc2VkIHB1cmVseSBmb3IgdGVzdGFiaWxpdHkuXG4gICAqL1xuICByZWFkb25seSBpc0ZvcmNlZEJ5VGVzdE9ubHk6IGJvb2xlYW47XG5cbiAgLyoqIGB0cnVlYCBmb3IgYSBjbGFzcyBtZW1iZXIsIGBmYWxzZWAgZm9yIGEgdG9wLWxldmVsIGV4cG9ydC4gKi9cbiAgcmVhZG9ubHkgaXNNZW1iZXI6IGJvb2xlYW47XG5cbiAgLyoqIDEtYmFzZWQgbGluZSBvZiB0aGUgZGVjbGFyYXRpb24ncyBuYW1lLiAqL1xuICByZWFkb25seSBsaW5lOiBudW1iZXI7XG5cbiAgLyoqIFRoZSBkZWNsYXJlZCBuYW1lLiAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEluIGEgZml4IHJ1biwgd2h5IHRoaXMgZmluZGluZyB3YXMgbGVmdCB1bnRvdWNoZWQgaW5zdGVhZCBvZiB0aWdodGVuZWQ7IGBudWxsYCB3aGVuIGl0IHdhc1xuICAgKiBmaXhlZCBvciB3aGVuIHRoZSBhbmFseXNpcyBvbmx5IHJlcG9ydGVkIChgc2hvdWxkRml4YCBvZmYpLlxuICAgKi9cbiAgcmVhZG9ubHkgc2tpcFJlYXNvbjogbnVsbCB8IE92ZXJFeHBvc3VyZVNraXBSZWFzb247XG5cbiAgLyoqIFRoZSBleHBvc3VyZSB0aGUgZGVjbGFyYXRpb24gY291bGQgYmUgdGlnaHRlbmVkIHRvLiAqL1xuICByZWFkb25seSBzdWdnZXN0ZWRFeHBvc3VyZTogU3VnZ2VzdGVkRXhwb3N1cmU7XG5cbiAgLyoqIGB0cnVlYCB3aGVuIGEgZml4IHJ1biB0aWdodGVuZWQgdGhpcyBkZWNsYXJhdGlvbiBpbiBwbGFjZS4gQWx3YXlzIGBmYWxzZWAgaW4gYSByZXBvcnQgcnVuLiAqL1xuICByZWFkb25seSB3YXNGaXhlZDogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQcm9ncmVzcyByZXBvcnRlZCB3aGlsZSBhbmFseXppbmcgYSBwcm9qZWN0LCBvbmUgZXZlbnQgcGVyIGFuYWx5emVkIHNvdXJjZSBmaWxlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE92ZXJFeHBvc3VyZVByb2dyZXNzIHtcbiAgLyoqIE51bWJlciBvZiBzb3VyY2UgZmlsZXMgZnVsbHkgYW5hbHl6ZWQgYmVmb3JlIHRoZSBjdXJyZW50IG9uZSAoMC1iYXNlZCkuICovXG4gIHJlYWRvbmx5IGFuYWx5emVkRmlsZUNvdW50OiBudW1iZXI7XG5cbiAgLyoqIEFic29sdXRlIChjYW5vbmljYWwpIHBhdGggb2YgdGhlIHNvdXJjZSBmaWxlIGFib3V0IHRvIGJlIGFuYWx5emVkLiAqL1xuICByZWFkb25seSBjdXJyZW50RmlsZVBhdGg6IHN0cmluZztcblxuICAvKiogVG90YWwgbnVtYmVyIG9mIHNvdXJjZSBmaWxlcyB0aGF0IHdpbGwgYmUgYW5hbHl6ZWQuICovXG4gIHJlYWRvbmx5IHRvdGFsRmlsZUNvdW50OiBudW1iZXI7XG59XG5cbi8qKlxuICogV2h5IGEgZml4IHJ1biBsZWZ0IGEgZmluZGluZyB1bnRvdWNoZWQ6XG4gKlxuICogLSBgZGVjb3JhdGVkYCBcdTIwMTQgdGhlIG1lbWJlciBjYXJyaWVzIGEgZGVjb3JhdG9yLCBzbyB0aGUgbW9kaWZpZXIgaW5zZXJ0aW9uIHBvaW50IGlzIGFtYmlndW91cy5cbiAqIC0gYHNoYXJlZC1leHBvcnRgIFx1MjAxNCB0aGUgYGV4cG9ydGAga2V5d29yZCBpcyBzaGFyZWQgd2l0aCBhIHN0aWxsLWV4cG9ydGVkIHNpYmxpbmcgZGVjbGFyYXRvci5cbiAqIC0gYHRlc3Qtb25seWAgXHUyMDE0IHRoZSBkZWNsYXJhdGlvbiBpcyBleHBvc2VkIHB1cmVseSBmb3IgdGVzdHMsIHNvIHRpZ2h0ZW5pbmcgd291bGQgYnJlYWsgdGhlIHRlc3QuXG4gKi9cbmV4cG9ydCB0eXBlIE92ZXJFeHBvc3VyZVNraXBSZWFzb24gPSAnZGVjb3JhdGVkJyB8ICdzaGFyZWQtZXhwb3J0JyB8ICd0ZXN0LW9ubHknO1xuXG4vKipcbiAqIFRoZSAodGlnaHRlcikgZXhwb3N1cmUgbGV2ZWwgYSBkZWNsYXJhdGlvbiBjb3VsZCBiZSByZWR1Y2VkIHRvLlxuICovXG5leHBvcnQgdHlwZSBTdWdnZXN0ZWRFeHBvc3VyZSA9ICdmaWxlLWxvY2FsJyB8ICdwcml2YXRlJyB8ICdwcm90ZWN0ZWQnO1xuXG4vKipcbiAqIExpZmVjeWNsZSBhbmQgZnJhbWV3b3JrIG1lbWJlcnMgaW52b2tlZCBieSBPYnNpZGlhbiBvciBhIGJhc2UgY2xhc3MgdmlhIHJlZ2lzdHJhdGlvbiByYXRoZXIgdGhhblxuICogYnkgcmVmZXJlbmNlcyB0aGUgbGFuZ3VhZ2Ugc2VydmljZSBjYW4gc2VlLiBUaWdodGVuaW5nIHRoZXNlIHdvdWxkIGJyZWFrIHRoZSBmcmFtZXdvcmsgY29udHJhY3QsXG4gKiBzbyB0aGV5IGFyZSBuZXZlciByZXBvcnRlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IExJRkVDWUNMRV9BTExPV0xJU1Q6IFJlYWRvbmx5U2V0PHN0cmluZz4gPSBuZXcgU2V0PHN0cmluZz4oW1xuICAnZGlzcGxheScsXG4gICdoaWRlJyxcbiAgJ29uRXh0ZXJuYWxTZXR0aW5nc0NoYW5nZScsXG4gICdvbkxheW91dFJlYWR5JyxcbiAgJ29ubG9hZCcsXG4gICdvbmxvYWRJbXBsJyxcbiAgJ29uTG9hZFNldHRpbmdzJyxcbiAgJ29uU2F2ZVNldHRpbmdzJyxcbiAgJ29udW5sb2FkJyxcbiAgJ29udW5sb2FkSW1wbCdcbl0pO1xuXG5pbnRlcmZhY2UgQW5hbHlzaXNDb250ZXh0IHtcbiAgcmVhZG9ubHkgY2hlY2tlcjogVHlwZUNoZWNrZXI7XG4gIHJlYWRvbmx5IGVkaXRzOiAobnVsbCB8IE92ZXJFeHBvc3VyZVRleHRFZGl0KVtdO1xuICByZWFkb25seSBmaW5kaW5nczogT3ZlckV4cG9zdXJlRmluZGluZ1tdO1xuICByZWFkb25seSBsYW5ndWFnZVNlcnZpY2U6IExhbmd1YWdlU2VydmljZTtcbiAgcmVhZG9ubHkgcHJvZ3JhbTogUHJvZ3JhbTtcbiAgcmVhZG9ubHkgc2hvdWxkRm9yY2U6IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBBbmFseXNpc1Jlc3VsdCB7XG4gIHJlYWRvbmx5IGVkaXRzOiByZWFkb25seSAobnVsbCB8IE92ZXJFeHBvc3VyZVRleHRFZGl0KVtdO1xuICByZWFkb25seSBmaW5kaW5nczogcmVhZG9ubHkgT3ZlckV4cG9zdXJlRmluZGluZ1tdO1xufVxuXG50eXBlIENsYXNzTWVtYmVyRGVjbGFyYXRpb24gPSBHZXRBY2Nlc3NvckRlY2xhcmF0aW9uIHwgTWV0aG9kRGVjbGFyYXRpb24gfCBQcm9wZXJ0eURlY2xhcmF0aW9uIHwgU2V0QWNjZXNzb3JEZWNsYXJhdGlvbjtcblxudHlwZSBFeHBvcnRhYmxlRGVjbGFyYXRpb24gPSBDbGFzc0RlY2xhcmF0aW9uIHwgRW51bURlY2xhcmF0aW9uIHwgRnVuY3Rpb25EZWNsYXJhdGlvbiB8IEludGVyZmFjZURlY2xhcmF0aW9uIHwgVHlwZUFsaWFzRGVjbGFyYXRpb24gfCBWYXJpYWJsZVN0YXRlbWVudDtcblxuaW50ZXJmYWNlIEV4cG9ydEZpbmRpbmdDYW5kaWRhdGUge1xuICByZWFkb25seSBmaW5kaW5nOiBPdmVyRXhwb3N1cmVGaW5kaW5nO1xuICByZWFkb25seSBpc1BsYWluRmlsZUxvY2FsOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgRmluZGluZ0ZsYWdzIHtcbiAgcmVhZG9ubHkgaGFzTm9SZWZlcmVuY2VzOiBib29sZWFuO1xuICByZWFkb25seSBpc0ZvcmNlZEJ5VGVzdE9ubHk6IGJvb2xlYW47XG59XG5cbnR5cGUgTWVtYmVyRXhwb3N1cmUgPSAncHJpdmF0ZScgfCAncHJvdGVjdGVkJyB8ICdwdWJsaWMnO1xuXG4vKipcbiAqIEEgc2luZ2xlIGluLXBsYWNlIHRleHQgcmVwbGFjZW1lbnQgdGhhdCB0aWdodGVucyBhIGRlY2xhcmF0aW9uJ3MgZXhwb3N1cmUuIEEgemVyby1sZW5ndGggZWRpdCBpc1xuICogYW4gaW5zZXJ0aW9uIChlLmcuIGFkZGluZyBhbiBleHBsaWNpdCBgcHJpdmF0ZWAgbW9kaWZpZXIgdG8gYW4gaW1wbGljaXRseS1gcHVibGljYCBtZW1iZXIpLlxuICovXG5pbnRlcmZhY2UgT3ZlckV4cG9zdXJlVGV4dEVkaXQge1xuICByZWFkb25seSBmaWxlTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBsZW5ndGg6IG51bWJlcjtcbiAgcmVhZG9ubHkgbmV3VGV4dDogc3RyaW5nO1xuICByZWFkb25seSBzdGFydDogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgUmVmZXJlbmNlTG9jYXRpb24ge1xuICByZWFkb25seSBmaWxlTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBzdGFydDogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgU291cmNlRmlsZVRleHQge1xuICByZWFkb25seSBmaWxlTmFtZTogc3RyaW5nO1xuICByZWFkb25seSB0ZXh0OiBzdHJpbmc7XG59XG5cbi8vIEEgSlNEb2MvVFNEb2MgY29tbWVudCBvcGVucyB3aXRoIGAvKipgOiB0aGUgY2hhcmFjdGVyIGF0IG9mZnNldCAyIGlzIHRoZSBzZWNvbmQgYCpgLCBhbmQgdG8gZXhjbHVkZSB0aGUgZW1wdHkgYC8qKi9gIGNvbW1lbnQgdGhlIGNoYXJhY3RlciBhdCBvZmZzZXQgMyBtdXN0IG5vdCBiZSB0aGUgY2xvc2luZyBgL2AuXG5jb25zdCBKU0RPQ19TRUNPTkRfQVNURVJJU0tfT0ZGU0VUID0gMjtcbmNvbnN0IEpTRE9DX0ZPVVJUSF9DSEFSQUNURVJfT0ZGU0VUID0gMztcbmNvbnN0IE1FTUJFUl9FWFBPU1VSRV9PUkRFUjogcmVhZG9ubHkgTWVtYmVyRXhwb3N1cmVbXSA9IFsncHJpdmF0ZScsICdwcm90ZWN0ZWQnLCAncHVibGljJ107XG5jb25zdCBTQ09QRV9ERVNDUklQVElPTjogUmVjb3JkPFN1Z2dlc3RlZEV4cG9zdXJlLCBzdHJpbmc+ID0ge1xuICAnZmlsZS1sb2NhbCc6ICd3aXRoaW4gaXRzIG93biBmaWxlJyxcbiAgJ3ByaXZhdGUnOiAnaW5zaWRlIGl0cyBvd24gY2xhc3MnLFxuICAncHJvdGVjdGVkJzogJ2luc2lkZSBpdHMgY2xhc3MgKyBzdWJjbGFzc2VzJ1xufTtcbmNvbnN0IFNLSVBfUkVBU09OX0RFU0NSSVBUSU9OOiBSZWNvcmQ8T3ZlckV4cG9zdXJlU2tpcFJlYXNvbiwgc3RyaW5nPiA9IHtcbiAgJ2RlY29yYXRlZCc6ICdkZWNvcmF0ZWQgbWVtYmVyJyxcbiAgJ3NoYXJlZC1leHBvcnQnOiAnZXhwb3J0IHNoYXJlZCB3aXRoIGEgc3RpbGwtZXhwb3J0ZWQgc2libGluZycsXG4gICd0ZXN0LW9ubHknOiAnZXhwb3NlZCBvbmx5IGZvciB0ZXN0cydcbn07XG5jb25zdCBWSVNJQklMSVRZX01PRElGSUVSX0tJTkRTOiBSZWFkb25seVNldDxTeW50YXhLaW5kPiA9IG5ldyBTZXQ8U3ludGF4S2luZD4oW1N5bnRheEtpbmQuUHJpdmF0ZUtleXdvcmQsIFN5bnRheEtpbmQuUHJvdGVjdGVkS2V5d29yZCwgU3ludGF4S2luZC5QdWJsaWNLZXl3b3JkXSk7XG5jb25zdCBXSElURVNQQUNFX1BBVFRFUk4gPSAvXFxzLztcblxuLyoqXG4gKiBBbmFseXplcyBhIHByb2plY3QgKGFscmVhZHkgbG9hZGVkIGludG8gYSBsYW5ndWFnZSBzZXJ2aWNlKSBmb3Igb3Zlci1leHBvc2VkIGRlY2xhcmF0aW9ucywgYW5kIFx1MjAxNFxuICogd2hlbiB7QGxpbmsgQW5hbHl6ZU92ZXJFeHBvc3VyZVBhcmFtcy5zaG91bGRGaXh9IGlzIHNldCBcdTIwMTQgdGlnaHRlbnMgZXZlcnkgZml4YWJsZSBmaW5kaW5nIGluIHBsYWNlXG4gKiB2aWEge0BsaW5rIEFuYWx5emVPdmVyRXhwb3N1cmVQYXJhbXMud3JpdGVGaWxlfS4gRmluZGluZ3MgdGhhdCBjYW5ub3QgYmUgc2FmZWx5IGF1dG9tYXRlZCAoZXhwb3NlZFxuICogb25seSBmb3IgdGVzdHMsIGRlY29yYXRlZCwgb3Igc2hhcmluZyBhbiBgZXhwb3J0YCBrZXl3b3JkIHdpdGggYSBzdGlsbC1leHBvcnRlZCBzaWJsaW5nKSBjYXJyeSBhXG4gKiB7QGxpbmsgT3ZlckV4cG9zdXJlRmluZGluZy5za2lwUmVhc29ufSBhbmQgYXJlIGxlZnQgdW50b3VjaGVkIFx1MjAxNCB1bmxlc3NcbiAqIHtAbGluayBBbmFseXplT3ZlckV4cG9zdXJlUGFyYW1zLnNob3VsZEZvcmNlfSBpcyBzZXQsIHdoaWNoIGFkZGl0aW9uYWxseSB0aWdodGVucyB0aGUgdGVzdC1vbmx5XG4gKiBmaW5kaW5ncyAoZGVjb3JhdGVkIGFuZCBzaGFyZWQtZXhwb3J0IG9uZXMgc3RpbGwgc3RheSBza2lwcGVkKS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBBbmFseXplT3ZlckV4cG9zdXJlUGFyYW1zfS5cbiAqIEByZXR1cm5zIFRoZSBvdmVyLWV4cG9zZWQgZGVjbGFyYXRpb25zLCBpbiBkaXNjb3Zlcnkgb3JkZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhbmFseXplT3ZlckV4cG9zdXJlKHBhcmFtczogQW5hbHl6ZU92ZXJFeHBvc3VyZVBhcmFtcyk6IE92ZXJFeHBvc3VyZUZpbmRpbmdbXSB7XG4gIGNvbnN0IHJlc3VsdCA9IHJ1bk92ZXJFeHBvc3VyZUFuYWx5c2lzKHBhcmFtcyk7XG4gIGlmICghcGFyYW1zLnNob3VsZEZpeCkge1xuICAgIHJldHVybiBbLi4ucmVzdWx0LmZpbmRpbmdzXTtcbiAgfVxuXG4gIGNvbnN0IHsgd3JpdGVGaWxlIH0gPSBwYXJhbXM7XG4gIGFzc2VydE5vbk51bGxhYmxlKHdyaXRlRmlsZSwgJ3dyaXRlRmlsZSBpcyByZXF1aXJlZCB3aGVuIHNob3VsZEZpeCBpcyB0cnVlLicpO1xuICByZXR1cm4gYXBwbHlPdmVyRXhwb3N1cmVGaXhlcyhyZXN1bHQsIHBhcmFtcy5sYW5ndWFnZVNlcnZpY2UuZ2V0UHJvZ3JhbSgpLCB3cml0ZUZpbGUsIHBhcmFtcy5zaG91bGRGb3JjZSA/PyBmYWxzZSk7XG59XG5cbi8qKlxuICogQnVpbGRzIGEge0BsaW5rIExhbmd1YWdlU2VydmljZUhvc3R9IGJhY2tlZCBieSBhbiBleHBsaWNpdCBmaWxlIGxpc3QgYW5kIGZpbGUgc3lzdGVtLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIENyZWF0ZUxhbmd1YWdlU2VydmljZUhvc3RQYXJhbXN9LlxuICogQHJldHVybnMgVGhlIGxhbmd1YWdlLXNlcnZpY2UgaG9zdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUxhbmd1YWdlU2VydmljZUhvc3QocGFyYW1zOiBDcmVhdGVMYW5ndWFnZVNlcnZpY2VIb3N0UGFyYW1zKTogTGFuZ3VhZ2VTZXJ2aWNlSG9zdCB7XG4gIGNvbnN0IHsgY29tcGlsZXJPcHRpb25zLCBmaWxlTmFtZXMsIGZpbGVTeXN0ZW0gfSA9IHBhcmFtcztcbiAgcmV0dXJuIHtcbiAgICBkaXJlY3RvcnlFeGlzdHM6IChkaXJlY3RvcnkpID0+IGZpbGVTeXN0ZW0uZGlyZWN0b3J5RXhpc3RzKGRpcmVjdG9yeSksXG4gICAgZmlsZUV4aXN0czogKGZpbGUpID0+IGZpbGVTeXN0ZW0uZmlsZUV4aXN0cyhmaWxlKSxcbiAgICBnZXRDb21waWxhdGlvblNldHRpbmdzOiAoKSA9PiBjb21waWxlck9wdGlvbnMsXG4gICAgZ2V0Q3VycmVudERpcmVjdG9yeTogKCkgPT4gZmlsZVN5c3RlbS5nZXRDdXJyZW50RGlyZWN0b3J5KCksXG4gICAgZ2V0RGVmYXVsdExpYkZpbGVOYW1lOiAobGliT3B0aW9ucykgPT4gZ2V0RGVmYXVsdExpYkZpbGVQYXRoKGxpYk9wdGlvbnMpLFxuICAgIGdldERpcmVjdG9yaWVzOiAoZGlyZWN0b3J5KSA9PiBmaWxlU3lzdGVtLmdldERpcmVjdG9yaWVzKGRpcmVjdG9yeSksXG4gICAgZ2V0U2NyaXB0RmlsZU5hbWVzOiAoKSA9PiBbLi4uZmlsZU5hbWVzXSxcbiAgICBnZXRTY3JpcHRTbmFwc2hvdDogKGZpbGVOYW1lKTogSVNjcmlwdFNuYXBzaG90IHwgdW5kZWZpbmVkID0+IHtcbiAgICAgIGNvbnN0IHRleHQgPSBmaWxlU3lzdGVtLnJlYWRGaWxlKGZpbGVOYW1lKTtcbiAgICAgIHJldHVybiB0ZXh0ID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBTY3JpcHRTbmFwc2hvdC5mcm9tU3RyaW5nKHRleHQpO1xuICAgIH0sXG4gICAgZ2V0U2NyaXB0VmVyc2lvbjogKCkgPT4gJzAnLFxuICAgIHJlYWREaXJlY3Rvcnk6IChwYXRoLCBleHRlbnNpb25zLCBleGNsdWRlLCBpbmNsdWRlLCBkZXB0aCkgPT4gZmlsZVN5c3RlbS5yZWFkRGlyZWN0b3J5KHBhdGgsIGV4dGVuc2lvbnMsIGV4Y2x1ZGUsIGluY2x1ZGUsIGRlcHRoKSxcbiAgICByZWFkRmlsZTogKGZpbGUpID0+IGZpbGVTeXN0ZW0ucmVhZEZpbGUoZmlsZSlcbiAgfTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBsYW5ndWFnZSBzZXJ2aWNlIG92ZXIgZXZlcnkgZmlsZSBpbiBhIHByb2plY3QncyBgdHNjb25maWcuanNvbmAuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSB7QGxpbmsgQ3JlYXRlUHJvamVjdExhbmd1YWdlU2VydmljZVBhcmFtc30uXG4gKiBAcmV0dXJucyBBIGxhbmd1YWdlIHNlcnZpY2UgcmVhZHkgZm9yIHtAbGluayBhbmFseXplT3ZlckV4cG9zdXJlfS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVByb2plY3RMYW5ndWFnZVNlcnZpY2UocGFyYW1zOiBDcmVhdGVQcm9qZWN0TGFuZ3VhZ2VTZXJ2aWNlUGFyYW1zKTogTGFuZ3VhZ2VTZXJ2aWNlIHtcbiAgY29uc3QgeyBmaWxlTmFtZXMsIG9wdGlvbnMgfSA9IHBhcnNlVHNDb25maWcocGFyYW1zLnRzQ29uZmlnUGF0aCk7XG4gIHJldHVybiBjcmVhdGVMYW5ndWFnZVNlcnZpY2UoY3JlYXRlTGFuZ3VhZ2VTZXJ2aWNlSG9zdCh7IGNvbXBpbGVyT3B0aW9uczogb3B0aW9ucywgZmlsZU5hbWVzLCBmaWxlU3lzdGVtOiBzeXMgfSksIGNyZWF0ZURvY3VtZW50UmVnaXN0cnkoKSk7XG59XG5cbi8qKlxuICogRmluZHMgb3Zlci1leHBvc2VkIGRlY2xhcmF0aW9ucyBpbiBhIHByb2plY3Qgb24gZGlzay4gV2hlblxuICoge0BsaW5rIEZpbmRPdmVyRXhwb3N1cmVQYXJhbXMuc2hvdWxkRml4fSBpcyBzZXQsIGVhY2ggZml4YWJsZSBmaW5kaW5nIGlzIGFsc28gdGlnaHRlbmVkIGluIHBsYWNlXG4gKiAocmV3cml0aW5nIHRoZSBhZmZlY3RlZCBzb3VyY2UgZmlsZXMgdmlhIGB0eXBlc2NyaXB0YCdzIGBzeXMud3JpdGVGaWxlYCkuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSB7QGxpbmsgRmluZE92ZXJFeHBvc3VyZVBhcmFtc30uXG4gKiBAcmV0dXJucyBUaGUgb3Zlci1leHBvc2VkIGRlY2xhcmF0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRPdmVyRXhwb3N1cmUocGFyYW1zOiBGaW5kT3ZlckV4cG9zdXJlUGFyYW1zKTogT3ZlckV4cG9zdXJlRmluZGluZ1tdIHtcbiAgY29uc3QgcHJvamVjdEZvbGRlciA9IHRvQ2Fub25pY2FsKHBhcmFtcy5wcm9qZWN0Rm9sZGVyKTtcbiAgY29uc3QgbGFuZ3VhZ2VTZXJ2aWNlID0gY3JlYXRlUHJvamVjdExhbmd1YWdlU2VydmljZSh7IHRzQ29uZmlnUGF0aDogYCR7cHJvamVjdEZvbGRlcn0vdHNjb25maWcuanNvbmAgfSk7XG4gIHJldHVybiBhbmFseXplT3ZlckV4cG9zdXJlKHtcbiAgICBsYW5ndWFnZVNlcnZpY2UsXG4gICAgc2hvdWxkRml4OiBwYXJhbXMuc2hvdWxkRml4LFxuICAgIHNob3VsZEZvcmNlOiBwYXJhbXMuc2hvdWxkRm9yY2UsXG4gICAgc3JjRm9sZGVyOiBgJHtwcm9qZWN0Rm9sZGVyfS9zcmNgLFxuICAgIHdyaXRlRmlsZTogKHBhdGgsIGNvbnRlbnQpID0+IHtcbiAgICAgIHN5cy53cml0ZUZpbGUocGF0aCwgY29udGVudCk7XG4gICAgfSxcbiAgICAuLi5wYXJhbXMub25Qcm9ncmVzcyA/IHsgb25Qcm9ncmVzczogcGFyYW1zLm9uUHJvZ3Jlc3MgfSA6IHt9XG4gIH0pO1xufVxuXG4vKipcbiAqIEZvcm1hdHMgb3Zlci1leHBvc3VyZSBmaW5kaW5ncyBhcyBhIGh1bWFuLXJlYWRhYmxlIHJlcG9ydCwgdXNpbmcgdGhlIGdyb3VwZWQgbGF5b3V0IG9mIEVTTGludCdzXG4gKiBgc3R5bGlzaGAgZm9ybWF0dGVyLiBGaW5kaW5ncyBhcmUgZ3JvdXBlZCBieSBmaWxlIGFuZCBzb3J0ZWQgYnkgbGluZTogZWFjaCBmaWxlIGlzIHJlbmRlcmVkIGFzIGFcbiAqIGBwYXRoYCBoZWFkZXIgbGluZSwgZm9sbG93ZWQgYnkgb25lIGluZGVudGVkIGAgIGxpbmU6Y29sdW1uICBjaGFuZ2UgLS0gcmVhc29uYCByb3cgcGVyIGZpbmRpbmcgKHRoZVxuICogYGxpbmU6Y29sdW1uYCBpcyByaWdodC1wYWRkZWQgc28gdGhlIHJvd3MgYWxpZ24gd2l0aGluIGEgZmlsZSkuIFRlcm1pbmFscyBzdWNoIGFzIFZTIENvZGUgcmVuZGVyXG4gKiBlYWNoIGluZGVudGVkIGBsaW5lOmNvbHVtbmAgYXMgYSBjbGlja2FibGUgbGluayBcdTIwMTQgcmVzb2x2ZWQgYWdhaW5zdCB0aGUgZmlsZSBoZWFkZXIgYWJvdmUgaXQgXHUyMDE0IHRoYXRcbiAqIGp1bXBzIHN0cmFpZ2h0IHRvIHRoZSBkZWNsYXJhdGlvbi4gRmlsZSBncm91cHMgYXJlIHNlcGFyYXRlZCBieSBhIGJsYW5rIGxpbmUuIEluIGEgZml4IHJ1biAoZmluZGluZ3NcbiAqIGNhcnJ5aW5nIHtAbGluayBPdmVyRXhwb3N1cmVGaW5kaW5nLndhc0ZpeGVkfSAvIHtAbGluayBPdmVyRXhwb3N1cmVGaW5kaW5nLnNraXBSZWFzb259KSBlYWNoIGNoYW5nZVxuICogcm93IGlzIHN1ZmZpeGVkIHdpdGggYFtmaXhlZF1gIG9yIGBbc2tpcHBlZDogXHUyMDI2XWAsIGFuZCB0aGUgdHJhaWxpbmcgc3VtbWFyeSBhcHBlbmRzIHRoZSBmaXhlZC9za2lwcGVkXG4gKiBjb3VudHMuXG4gKlxuICogQHBhcmFtIGZpbmRpbmdzIC0gVGhlIGZpbmRpbmdzIHRvIGZvcm1hdC5cbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHtAbGluayBGb3JtYXRPdmVyRXhwb3N1cmVGaW5kaW5nc09wdGlvbnN9LlxuICogQHJldHVybnMgVGhlIHJlcG9ydCB0ZXh0LiBFbXB0eS1maW5kaW5nIGlucHV0IHlpZWxkcyBhIHNpbmdsZSBcIm5vIGZpbmRpbmdzXCIgbGluZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdE92ZXJFeHBvc3VyZUZpbmRpbmdzKGZpbmRpbmdzOiByZWFkb25seSBPdmVyRXhwb3N1cmVGaW5kaW5nW10sIG9wdGlvbnM/OiBGb3JtYXRPdmVyRXhwb3N1cmVGaW5kaW5nc09wdGlvbnMpOiBzdHJpbmcge1xuICBpZiAoZmluZGluZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuICdObyBvdmVyLWV4cG9zZWQgZGVjbGFyYXRpb25zIGZvdW5kLlxcbic7XG4gIH1cblxuICBjb25zdCBiYXNlRm9sZGVyID0gb3B0aW9ucz8uYmFzZUZvbGRlciA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogdG9DYW5vbmljYWwob3B0aW9ucy5iYXNlRm9sZGVyKTtcbiAgY29uc3QgbGluZXMgPSBmb3JtYXRGaW5kaW5nQmxvY2tzKGZpbmRpbmdzLCBiYXNlRm9sZGVyKTtcbiAgbGluZXMucHVzaChmb3JtYXRTdW1tYXJ5KGZpbmRpbmdzKSk7XG4gIHJldHVybiBgJHtsaW5lcy5qb2luKCdcXG4nKX1cXG5gO1xufVxuXG5mdW5jdGlvbiBhbmFseXplRXhwb3J0KG5vZGU6IE5vZGUsIGNvbnRleHQ6IEFuYWx5c2lzQ29udGV4dCk6IHZvaWQge1xuICBjb25zdCBzb3VyY2VGaWxlID0gbm9kZS5nZXRTb3VyY2VGaWxlKCk7XG4gIGlmIChub2RlLnBhcmVudCAhPT0gc291cmNlRmlsZSB8fCAhZ2V0TW9kaWZpZXJLaW5kcyhub2RlKS5oYXMoU3ludGF4S2luZC5FeHBvcnRLZXl3b3JkKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGRlY2xhcmF0aW9uID0gYXNFeHBvcnRhYmxlRGVjbGFyYXRpb24obm9kZSk7XG4gIGlmICghZGVjbGFyYXRpb24pIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoaGFzVHNEb2NDb21tZW50KGRlY2xhcmF0aW9uKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGRlY2xGaWxlUGF0aCA9IHRvQ2Fub25pY2FsKHNvdXJjZUZpbGUuZmlsZU5hbWUpO1xuICBjb25zdCBuYW1lTm9kZXMgPSBnZXRFeHBvcnRlZE5hbWVOb2RlcyhkZWNsYXJhdGlvbik7XG4gIGNvbnN0IGNhbmRpZGF0ZXM6IEV4cG9ydEZpbmRpbmdDYW5kaWRhdGVbXSA9IFtdO1xuICBmb3IgKGNvbnN0IG5hbWVOb2RlIG9mIG5hbWVOb2Rlcykge1xuICAgIGNvbnN0IHJlZmVyZW5jZXMgPSBjb2xsZWN0UmVmZXJlbmNlcyhjb250ZXh0Lmxhbmd1YWdlU2VydmljZS5maW5kUmVmZXJlbmNlcyhzb3VyY2VGaWxlLmZpbGVOYW1lLCBuYW1lTm9kZS5nZXRTdGFydCgpKSlcbiAgICAgIC5maWx0ZXIoKHJlZmVyZW5jZSkgPT4gIWlzRGVjbGFyYXRpb25JdHNlbGYocmVmZXJlbmNlLCBuYW1lTm9kZSkpO1xuICAgIGNvbnN0IG90aGVyRmlsZVJlZmVyZW5jZXMgPSByZWZlcmVuY2VzLmZpbHRlcigocmVmZXJlbmNlKSA9PiB0b0Nhbm9uaWNhbChyZWZlcmVuY2UuZmlsZU5hbWUpICE9PSBkZWNsRmlsZVBhdGgpO1xuXG4gICAgaWYgKG90aGVyRmlsZVJlZmVyZW5jZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjYW5kaWRhdGVzLnB1c2goe1xuICAgICAgICBmaW5kaW5nOiBidWlsZEZpbmRpbmcoZGVjbGFyYXRpb24sIG5hbWVOb2RlLCAnZXhwb3J0JywgJ2ZpbGUtbG9jYWwnLCB7IGhhc05vUmVmZXJlbmNlczogcmVmZXJlbmNlcy5sZW5ndGggPT09IDAsIGlzRm9yY2VkQnlUZXN0T25seTogZmFsc2UgfSksXG4gICAgICAgIGlzUGxhaW5GaWxlTG9jYWw6IHRydWVcbiAgICAgIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3Qgbm9uVGVzdFJlZmVyZW5jZXMgPSBvdGhlckZpbGVSZWZlcmVuY2VzLmZpbHRlcigocmVmZXJlbmNlKSA9PiAhaXNUZXN0RmlsZSh0b0Nhbm9uaWNhbChyZWZlcmVuY2UuZmlsZU5hbWUpKSk7XG4gICAgaWYgKG5vblRlc3RSZWZlcmVuY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY2FuZGlkYXRlcy5wdXNoKHtcbiAgICAgICAgZmluZGluZzogYnVpbGRGaW5kaW5nKGRlY2xhcmF0aW9uLCBuYW1lTm9kZSwgJ2V4cG9ydCcsICdmaWxlLWxvY2FsJywgeyBoYXNOb1JlZmVyZW5jZXM6IGZhbHNlLCBpc0ZvcmNlZEJ5VGVzdE9ubHk6IHRydWUgfSksXG4gICAgICAgIGlzUGxhaW5GaWxlTG9jYWw6IGZhbHNlXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBpZiAoY2FuZGlkYXRlcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBjYW5Ecm9wRXhwb3J0ID0gY2FuZGlkYXRlcy5sZW5ndGggPT09IG5hbWVOb2Rlcy5sZW5ndGggJiYgY2FuZGlkYXRlcy5ldmVyeSgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUuaXNQbGFpbkZpbGVMb2NhbCB8fCBjb250ZXh0LnNob3VsZEZvcmNlKTtcbiAgY29uc3QgZXhwb3J0RWRpdCA9IGNhbkRyb3BFeHBvcnQgPyBjb21wdXRlRXhwb3J0UmVtb3ZhbEVkaXQoZGVjbGFyYXRpb24pIDogbnVsbDtcbiAgZm9yIChjb25zdCBjYW5kaWRhdGUgb2YgY2FuZGlkYXRlcykge1xuICAgIHJlY29yZChjb250ZXh0LCBjYW5kaWRhdGUuZmluZGluZywgZXhwb3J0RWRpdCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYW5hbHl6ZU1lbWJlcihub2RlOiBOb2RlLCBjb250ZXh0OiBBbmFseXNpc0NvbnRleHQpOiB2b2lkIHtcbiAgY29uc3QgbWVtYmVyID0gYXNDbGFzc01lbWJlcihub2RlKTtcbiAgaWYgKCFtZW1iZXIgfHwgIWlzQ2xhc3NMaWtlKG5vZGUucGFyZW50KSkge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBuYW1lTm9kZSA9IG1lbWJlci5uYW1lO1xuICBjb25zdCBkZWNsYXJpbmdDbGFzcyA9IG5vZGUucGFyZW50O1xuXG4gIGlmIChpc1ByaXZhdGVJZGVudGlmaWVyKG5hbWVOb2RlKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IG1vZGlmaWVyS2luZHMgPSBnZXRNb2RpZmllcktpbmRzKG1lbWJlcik7XG4gIGlmIChtb2RpZmllcktpbmRzLmhhcyhTeW50YXhLaW5kLlN0YXRpY0tleXdvcmQpIHx8IG1vZGlmaWVyS2luZHMuaGFzKFN5bnRheEtpbmQuT3ZlcnJpZGVLZXl3b3JkKSB8fCBMSUZFQ1lDTEVfQUxMT1dMSVNULmhhcyhuYW1lTm9kZS5nZXRUZXh0KCkpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGhhc1RzRG9jQ29tbWVudChtZW1iZXIpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgY3VycmVudEV4cG9zdXJlID0gZ2V0Q3VycmVudE1lbWJlckV4cG9zdXJlKG1vZGlmaWVyS2luZHMpO1xuICBpZiAoY3VycmVudEV4cG9zdXJlID09PSAncHJpdmF0ZScpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBzb3VyY2VGaWxlID0gbWVtYmVyLmdldFNvdXJjZUZpbGUoKTtcbiAgY29uc3QgcmVmZXJlbmNlcyA9IGNvbGxlY3RSZWZlcmVuY2VzKGNvbnRleHQubGFuZ3VhZ2VTZXJ2aWNlLmZpbmRSZWZlcmVuY2VzKHNvdXJjZUZpbGUuZmlsZU5hbWUsIG5hbWVOb2RlLmdldFN0YXJ0KCkpKVxuICAgIC5maWx0ZXIoKHJlZmVyZW5jZSkgPT4gIWlzRGVjbGFyYXRpb25JdHNlbGYocmVmZXJlbmNlLCBuYW1lTm9kZSkpO1xuICBjb25zdCBub25UZXN0UmVmZXJlbmNlcyA9IHJlZmVyZW5jZXMuZmlsdGVyKChyZWZlcmVuY2UpID0+ICFpc1Rlc3RGaWxlKHRvQ2Fub25pY2FsKHJlZmVyZW5jZS5maWxlTmFtZSkpKTtcblxuICBjb25zdCBuZWVkZWRGb3JTcmMgPSBjb21wdXRlTmVlZGVkRXhwb3N1cmUobm9uVGVzdFJlZmVyZW5jZXMsIGRlY2xhcmluZ0NsYXNzLCBjb250ZXh0KTtcbiAgY29uc3QgbmVlZGVkV2l0aFRlc3RzID0gY29tcHV0ZU5lZWRlZEV4cG9zdXJlKHJlZmVyZW5jZXMsIGRlY2xhcmluZ0NsYXNzLCBjb250ZXh0KTtcblxuICBpZiAobmVlZGVkRm9yU3JjID09PSAncHVibGljJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChyYW5rRXhwb3N1cmUobmVlZGVkRm9yU3JjKSA+PSByYW5rRXhwb3N1cmUoY3VycmVudEV4cG9zdXJlKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGZpbmRpbmcgPSBidWlsZEZpbmRpbmcobWVtYmVyLCBuYW1lTm9kZSwgY3VycmVudEV4cG9zdXJlLCBuZWVkZWRGb3JTcmMsIHtcbiAgICBoYXNOb1JlZmVyZW5jZXM6IHJlZmVyZW5jZXMubGVuZ3RoID09PSAwLFxuICAgIGlzRm9yY2VkQnlUZXN0T25seTogcmFua0V4cG9zdXJlKG5lZWRlZFdpdGhUZXN0cykgPiByYW5rRXhwb3N1cmUobmVlZGVkRm9yU3JjKVxuICB9KTtcbiAgcmVjb3JkKGNvbnRleHQsIGZpbmRpbmcsIGNvbXB1dGVNZW1iZXJFeHBvc3VyZUVkaXQobWVtYmVyLCBuZWVkZWRGb3JTcmMpKTtcbn1cblxuZnVuY3Rpb24gYXBwbHlFZGl0cyh0ZXh0OiBzdHJpbmcsIGVkaXRzOiByZWFkb25seSBPdmVyRXhwb3N1cmVUZXh0RWRpdFtdKTogc3RyaW5nIHtcbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCB1bmlxdWVFZGl0cyA9IGVkaXRzXG4gICAgLmZpbHRlcigoZWRpdCkgPT4ge1xuICAgICAgY29uc3Qga2V5ID0gYCR7U3RyaW5nKGVkaXQuc3RhcnQpfToke1N0cmluZyhlZGl0Lmxlbmd0aCl9OiR7ZWRpdC5uZXdUZXh0fWA7XG4gICAgICBpZiAoc2Vlbi5oYXMoa2V5KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBzZWVuLmFkZChrZXkpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSlcbiAgICAuc29ydCgoYSwgYikgPT4gYi5zdGFydCAtIGEuc3RhcnQpO1xuXG4gIGxldCByZXN1bHQgPSB0ZXh0O1xuICBmb3IgKGNvbnN0IGVkaXQgb2YgdW5pcXVlRWRpdHMpIHtcbiAgICByZXN1bHQgPSBgJHtyZXN1bHQuc2xpY2UoMCwgZWRpdC5zdGFydCl9JHtlZGl0Lm5ld1RleHR9JHtyZXN1bHQuc2xpY2UoZWRpdC5zdGFydCArIGVkaXQubGVuZ3RoKX1gO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGFwcGx5T3ZlckV4cG9zdXJlRml4ZXMoXG4gIHJlc3VsdDogQW5hbHlzaXNSZXN1bHQsXG4gIHByb2dyYW06IFByb2dyYW0gfCB1bmRlZmluZWQsXG4gIHdyaXRlRmlsZTogKHRoaXM6IHZvaWQsIHBhdGg6IHN0cmluZywgY29udGVudDogc3RyaW5nKSA9PiB2b2lkLFxuICBzaG91bGRGb3JjZTogYm9vbGVhblxuKTogT3ZlckV4cG9zdXJlRmluZGluZ1tdIHtcbiAgY29uc3QgZWRpdHNCeUZpbGUgPSBuZXcgTWFwPHN0cmluZywgT3ZlckV4cG9zdXJlVGV4dEVkaXRbXT4oKTtcbiAgY29uc3QgZmluZGluZ3MgPSByZXN1bHQuZmluZGluZ3MubWFwKChmaW5kaW5nLCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IGVkaXQgPSByZXN1bHQuZWRpdHNbaW5kZXhdID8/IG51bGw7XG4gICAgY29uc3Qgc2tpcFJlYXNvbiA9IGRldGVybWluZVNraXBSZWFzb24oZmluZGluZywgZWRpdCwgc2hvdWxkRm9yY2UpO1xuICAgIGlmIChza2lwUmVhc29uICE9PSBudWxsKSB7XG4gICAgICByZXR1cm4geyAuLi5maW5kaW5nLCBza2lwUmVhc29uLCB3YXNGaXhlZDogZmFsc2UgfTtcbiAgICB9XG4gICAgYXNzZXJ0Tm9uTnVsbGFibGUoZWRpdCwgJ0EgZml4YWJsZSBmaW5kaW5nIG11c3QgY2FycnkgYSB0ZXh0IGVkaXQuJyk7XG4gICAgY29uc3QgZmlsZUVkaXRzID0gZWRpdHNCeUZpbGUuZ2V0KGVkaXQuZmlsZU5hbWUpID8/IFtdO1xuICAgIGZpbGVFZGl0cy5wdXNoKGVkaXQpO1xuICAgIGVkaXRzQnlGaWxlLnNldChlZGl0LmZpbGVOYW1lLCBmaWxlRWRpdHMpO1xuICAgIHJldHVybiB7IC4uLmZpbmRpbmcsIHNraXBSZWFzb246IG51bGwsIHdhc0ZpeGVkOiB0cnVlIH07XG4gIH0pO1xuXG4gIGlmIChlZGl0c0J5RmlsZS5zaXplID4gMCkge1xuICAgIGFzc2VydE5vbk51bGxhYmxlKHByb2dyYW0sICdBIHByb2dyYW0gaXMgZXhwZWN0ZWQgd2hlbiB0aGVyZSBhcmUgZWRpdHMgdG8gYXBwbHkuJyk7XG4gICAgY29uc3Qgc291cmNlVGV4dEJ5RmlsZSA9IG5ldyBNYXA8c3RyaW5nLCBTb3VyY2VGaWxlVGV4dD4oKTtcbiAgICBmb3IgKGNvbnN0IHNvdXJjZUZpbGUgb2YgcHJvZ3JhbS5nZXRTb3VyY2VGaWxlcygpKSB7XG4gICAgICBzb3VyY2VUZXh0QnlGaWxlLnNldCh0b0Nhbm9uaWNhbChzb3VyY2VGaWxlLmZpbGVOYW1lKSwgeyBmaWxlTmFtZTogc291cmNlRmlsZS5maWxlTmFtZSwgdGV4dDogc291cmNlRmlsZS50ZXh0IH0pO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtjYW5vbmljYWxGaWxlTmFtZSwgZmlsZUVkaXRzXSBvZiBlZGl0c0J5RmlsZSkge1xuICAgICAgY29uc3Qgc291cmNlID0gc291cmNlVGV4dEJ5RmlsZS5nZXQoY2Fub25pY2FsRmlsZU5hbWUpO1xuICAgICAgYXNzZXJ0Tm9uTnVsbGFibGUoc291cmNlLCBgU291cmNlIGZpbGUgbm90IGZvdW5kIGluIHByb2dyYW06ICR7Y2Fub25pY2FsRmlsZU5hbWV9YCk7XG4gICAgICB3cml0ZUZpbGUoc291cmNlLmZpbGVOYW1lLCBhcHBseUVkaXRzKHNvdXJjZS50ZXh0LCBmaWxlRWRpdHMpKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmluZGluZ3M7XG59XG5cbmZ1bmN0aW9uIGFzQ2xhc3NNZW1iZXIobm9kZTogTm9kZSk6IENsYXNzTWVtYmVyRGVjbGFyYXRpb24gfCB1bmRlZmluZWQge1xuICBpZiAoaXNNZXRob2REZWNsYXJhdGlvbihub2RlKSB8fCBpc1Byb3BlcnR5RGVjbGFyYXRpb24obm9kZSkgfHwgaXNHZXRBY2Nlc3NvckRlY2xhcmF0aW9uKG5vZGUpIHx8IGlzU2V0QWNjZXNzb3JEZWNsYXJhdGlvbihub2RlKSkge1xuICAgIHJldHVybiBub2RlO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGFzRXhwb3J0YWJsZURlY2xhcmF0aW9uKG5vZGU6IE5vZGUpOiBFeHBvcnRhYmxlRGVjbGFyYXRpb24gfCB1bmRlZmluZWQge1xuICBpZiAoXG4gICAgaXNGdW5jdGlvbkRlY2xhcmF0aW9uKG5vZGUpXG4gICAgfHwgaXNDbGFzc0RlY2xhcmF0aW9uKG5vZGUpXG4gICAgfHwgaXNJbnRlcmZhY2VEZWNsYXJhdGlvbihub2RlKVxuICAgIHx8IGlzVHlwZUFsaWFzRGVjbGFyYXRpb24obm9kZSlcbiAgICB8fCBpc0VudW1EZWNsYXJhdGlvbihub2RlKVxuICAgIHx8IGlzVmFyaWFibGVTdGF0ZW1lbnQobm9kZSlcbiAgKSB7XG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gYnVpbGRGaW5kaW5nKFxuICBub2RlOiBOb2RlLFxuICBuYW1lTm9kZTogTm9kZSxcbiAgY3VycmVudEV4cG9zdXJlOiBDdXJyZW50RXhwb3N1cmUsXG4gIHN1Z2dlc3RlZEV4cG9zdXJlOiBTdWdnZXN0ZWRFeHBvc3VyZSxcbiAgZmxhZ3M6IEZpbmRpbmdGbGFnc1xuKTogT3ZlckV4cG9zdXJlRmluZGluZyB7XG4gIGNvbnN0IHNvdXJjZUZpbGUgPSBub2RlLmdldFNvdXJjZUZpbGUoKTtcbiAgY29uc3QgeyBjaGFyYWN0ZXIsIGxpbmUgfSA9IHNvdXJjZUZpbGUuZ2V0TGluZUFuZENoYXJhY3Rlck9mUG9zaXRpb24obmFtZU5vZGUuZ2V0U3RhcnQoKSk7XG4gIHJldHVybiB7XG4gICAgY29sdW1uOiBjaGFyYWN0ZXIgKyAxLFxuICAgIGN1cnJlbnRFeHBvc3VyZSxcbiAgICBmaWxlUGF0aDogdG9DYW5vbmljYWwoc291cmNlRmlsZS5maWxlTmFtZSksXG4gICAgaGFzTm9SZWZlcmVuY2VzOiBmbGFncy5oYXNOb1JlZmVyZW5jZXMsXG4gICAgaXNGb3JjZWRCeVRlc3RPbmx5OiBmbGFncy5pc0ZvcmNlZEJ5VGVzdE9ubHksXG4gICAgaXNNZW1iZXI6IGN1cnJlbnRFeHBvc3VyZSAhPT0gJ2V4cG9ydCcsXG4gICAgbGluZTogbGluZSArIDEsXG4gICAgbmFtZTogbmFtZU5vZGUuZ2V0VGV4dCgpLFxuICAgIHNraXBSZWFzb246IG51bGwsXG4gICAgc3VnZ2VzdGVkRXhwb3N1cmUsXG4gICAgd2FzRml4ZWQ6IGZhbHNlXG4gIH07XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3RSZWZlcmVuY2VzKHJlZmVyZW5jZWRTeW1ib2xzOiBSZWZlcmVuY2VkU3ltYm9sW10gfCB1bmRlZmluZWQpOiBSZWZlcmVuY2VMb2NhdGlvbltdIHtcbiAgY29uc3QgcmVmZXJlbmNlczogUmVmZXJlbmNlTG9jYXRpb25bXSA9IFtdO1xuICBmb3IgKGNvbnN0IHJlZmVyZW5jZWRTeW1ib2wgb2YgcmVmZXJlbmNlZFN5bWJvbHMgPz8gW10pIHtcbiAgICBmb3IgKGNvbnN0IHJlZmVyZW5jZSBvZiByZWZlcmVuY2VkU3ltYm9sLnJlZmVyZW5jZXMpIHtcbiAgICAgIHJlZmVyZW5jZXMucHVzaCh7IGZpbGVOYW1lOiByZWZlcmVuY2UuZmlsZU5hbWUsIHN0YXJ0OiByZWZlcmVuY2UudGV4dFNwYW4uc3RhcnQgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZWZlcmVuY2VzO1xufVxuXG5mdW5jdGlvbiBjb21wdXRlRXhwb3J0UmVtb3ZhbEVkaXQoZGVjbGFyYXRpb246IEV4cG9ydGFibGVEZWNsYXJhdGlvbik6IE92ZXJFeHBvc3VyZVRleHRFZGl0IHtcbiAgY29uc3Qgc291cmNlRmlsZSA9IGRlY2xhcmF0aW9uLmdldFNvdXJjZUZpbGUoKTtcbiAgY29uc3QgbW9kaWZpZXJzID0gZ2V0TW9kaWZpZXJzKGRlY2xhcmF0aW9uKTtcbiAgYXNzZXJ0Tm9uTnVsbGFibGUobW9kaWZpZXJzLCAnTW9kaWZpZXJzIGV4cGVjdGVkIG9uIGFuIGV4cG9ydGVkIGRlY2xhcmF0aW9uLicpO1xuICBjb25zdCBleHBvcnRNb2RpZmllciA9IG1vZGlmaWVycy5maW5kKChtb2RpZmllcikgPT4gbW9kaWZpZXIua2luZCA9PT0gU3ludGF4S2luZC5FeHBvcnRLZXl3b3JkKTtcbiAgYXNzZXJ0Tm9uTnVsbGFibGUoZXhwb3J0TW9kaWZpZXIsICdFeHBvcnQgbW9kaWZpZXIgZXhwZWN0ZWQgb24gYW4gZXhwb3J0ZWQgZGVjbGFyYXRpb24uJyk7XG4gIGNvbnN0IHsgdGV4dCB9ID0gc291cmNlRmlsZTtcbiAgbGV0IGVuZCA9IGV4cG9ydE1vZGlmaWVyLmdldEVuZCgpO1xuICB3aGlsZSAoZW5kIDwgdGV4dC5sZW5ndGggJiYgV0hJVEVTUEFDRV9QQVRURVJOLnRlc3QodGV4dC5jaGFyQXQoZW5kKSkpIHtcbiAgICBlbmQrKztcbiAgfVxuICByZXR1cm4ge1xuICAgIGZpbGVOYW1lOiB0b0Nhbm9uaWNhbChzb3VyY2VGaWxlLmZpbGVOYW1lKSxcbiAgICBsZW5ndGg6IGVuZCAtIGV4cG9ydE1vZGlmaWVyLmdldFN0YXJ0KCksXG4gICAgbmV3VGV4dDogJycsXG4gICAgc3RhcnQ6IGV4cG9ydE1vZGlmaWVyLmdldFN0YXJ0KClcbiAgfTtcbn1cblxuZnVuY3Rpb24gY29tcHV0ZU1lbWJlckV4cG9zdXJlRWRpdChtZW1iZXI6IENsYXNzTWVtYmVyRGVjbGFyYXRpb24sIHN1Z2dlc3RlZEV4cG9zdXJlOiAncHJpdmF0ZScgfCAncHJvdGVjdGVkJyk6IG51bGwgfCBPdmVyRXhwb3N1cmVUZXh0RWRpdCB7XG4gIGlmICgoZ2V0RGVjb3JhdG9ycyhtZW1iZXIpID8/IFtdKS5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBzb3VyY2VGaWxlID0gbWVtYmVyLmdldFNvdXJjZUZpbGUoKTtcbiAgY29uc3QgZmlsZU5hbWUgPSB0b0Nhbm9uaWNhbChzb3VyY2VGaWxlLmZpbGVOYW1lKTtcbiAgY29uc3QgbW9kaWZpZXJzID0gZ2V0TW9kaWZpZXJzKG1lbWJlcikgPz8gW107XG4gIGNvbnN0IHZpc2liaWxpdHlNb2RpZmllciA9IG1vZGlmaWVycy5maW5kKChtb2RpZmllcikgPT4gVklTSUJJTElUWV9NT0RJRklFUl9LSU5EUy5oYXMobW9kaWZpZXIua2luZCkpO1xuICBpZiAodmlzaWJpbGl0eU1vZGlmaWVyKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZpbGVOYW1lLFxuICAgICAgbGVuZ3RoOiB2aXNpYmlsaXR5TW9kaWZpZXIuZ2V0RW5kKCkgLSB2aXNpYmlsaXR5TW9kaWZpZXIuZ2V0U3RhcnQoKSxcbiAgICAgIG5ld1RleHQ6IHN1Z2dlc3RlZEV4cG9zdXJlLFxuICAgICAgc3RhcnQ6IHZpc2liaWxpdHlNb2RpZmllci5nZXRTdGFydCgpXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IGZpcnN0TW9kaWZpZXIgPSBtb2RpZmllcnNbMF07XG4gIGNvbnN0IGluc2VydFN0YXJ0ID0gZmlyc3RNb2RpZmllciA/IGZpcnN0TW9kaWZpZXIuZ2V0U3RhcnQoKSA6IG1lbWJlci5nZXRTdGFydCgpO1xuICByZXR1cm4ge1xuICAgIGZpbGVOYW1lLFxuICAgIGxlbmd0aDogMCxcbiAgICBuZXdUZXh0OiBgJHtzdWdnZXN0ZWRFeHBvc3VyZX0gYCxcbiAgICBzdGFydDogaW5zZXJ0U3RhcnRcbiAgfTtcbn1cblxuZnVuY3Rpb24gY29tcHV0ZU5lZWRlZEV4cG9zdXJlKFxuICByZWZlcmVuY2VzOiByZWFkb25seSBSZWZlcmVuY2VMb2NhdGlvbltdLFxuICBkZWNsYXJpbmdDbGFzczogQ2xhc3NMaWtlRGVjbGFyYXRpb24sXG4gIGNvbnRleHQ6IEFuYWx5c2lzQ29udGV4dFxuKTogTWVtYmVyRXhwb3N1cmUge1xuICBpZiAocmVmZXJlbmNlcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gJ3ByaXZhdGUnO1xuICB9XG5cbiAgbGV0IG5lZWRlZDogTWVtYmVyRXhwb3N1cmUgPSAncHJpdmF0ZSc7XG4gIGZvciAoY29uc3QgcmVmZXJlbmNlIG9mIHJlZmVyZW5jZXMpIHtcbiAgICBjb25zdCByZWZlcmVuY2VDbGFzcyA9IGdldENsYXNzQXRQb3NpdGlvbihjb250ZXh0LnByb2dyYW0sIHJlZmVyZW5jZS5maWxlTmFtZSwgcmVmZXJlbmNlLnN0YXJ0KTtcbiAgICBpZiAocmVmZXJlbmNlQ2xhc3MgPT09IGRlY2xhcmluZ0NsYXNzKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKHJlZmVyZW5jZUNsYXNzICYmIGlzRGVyaXZlZEZyb20ocmVmZXJlbmNlQ2xhc3MsIGRlY2xhcmluZ0NsYXNzLCBjb250ZXh0LmNoZWNrZXIpKSB7XG4gICAgICBuZWVkZWQgPSAncHJvdGVjdGVkJztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICByZXR1cm4gJ3B1YmxpYyc7XG4gIH1cbiAgcmV0dXJuIG5lZWRlZDtcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVGaXhTdGF0dXMoZmluZGluZzogT3ZlckV4cG9zdXJlRmluZGluZyk6IHN0cmluZyB7XG4gIGlmIChmaW5kaW5nLndhc0ZpeGVkKSB7XG4gICAgcmV0dXJuICcgW2ZpeGVkXSc7XG4gIH1cbiAgaWYgKGZpbmRpbmcuc2tpcFJlYXNvbiAhPT0gbnVsbCkge1xuICAgIHJldHVybiBgIFtza2lwcGVkOiAke1NLSVBfUkVBU09OX0RFU0NSSVBUSU9OW2ZpbmRpbmcuc2tpcFJlYXNvbl19XWA7XG4gIH1cbiAgcmV0dXJuICcnO1xufVxuXG5mdW5jdGlvbiBkZXNjcmliZVJlYXNvbihmaW5kaW5nOiBPdmVyRXhwb3N1cmVGaW5kaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgYmFzZSA9IGByZWZlcmVuY2VkIG9ubHkgJHtTQ09QRV9ERVNDUklQVElPTltmaW5kaW5nLnN1Z2dlc3RlZEV4cG9zdXJlXX1gO1xuICBpZiAoZmluZGluZy5pc0ZvcmNlZEJ5VGVzdE9ubHkpIHtcbiAgICByZXR1cm4gYCR7YmFzZX0gKGV4cG9zZWQgb25seSBmb3IgdGVzdHMpYDtcbiAgfVxuICBpZiAoZmluZGluZy5oYXNOb1JlZmVyZW5jZXMpIHtcbiAgICByZXR1cm4gYCR7YmFzZX0gKG5vIHJlZmVyZW5jZXMgYXQgYWxsKWA7XG4gIH1cbiAgcmV0dXJuIGJhc2U7XG59XG5cbmZ1bmN0aW9uIGRldGVybWluZVNraXBSZWFzb24oZmluZGluZzogT3ZlckV4cG9zdXJlRmluZGluZywgZWRpdDogbnVsbCB8IE92ZXJFeHBvc3VyZVRleHRFZGl0LCBzaG91bGRGb3JjZTogYm9vbGVhbik6IG51bGwgfCBPdmVyRXhwb3N1cmVTa2lwUmVhc29uIHtcbiAgaWYgKGZpbmRpbmcuaXNGb3JjZWRCeVRlc3RPbmx5ICYmICFzaG91bGRGb3JjZSkge1xuICAgIHJldHVybiAndGVzdC1vbmx5JztcbiAgfVxuICBpZiAoIWVkaXQpIHtcbiAgICByZXR1cm4gZmluZGluZy5pc01lbWJlciA/ICdkZWNvcmF0ZWQnIDogJ3NoYXJlZC1leHBvcnQnO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBmaW5kTm9kZUF0UG9zaXRpb24obm9kZTogTm9kZSwgcG9zaXRpb246IG51bWJlcik6IE5vZGUgfCB1bmRlZmluZWQge1xuICBpZiAocG9zaXRpb24gPCBub2RlLmdldFN0YXJ0KCkgfHwgcG9zaXRpb24gPj0gbm9kZS5nZXRFbmQoKSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgbGV0IHJlc3VsdDogTm9kZSA9IG5vZGU7XG4gIG5vZGUuZm9yRWFjaENoaWxkKChjaGlsZCkgPT4ge1xuICAgIGNvbnN0IGZvdW5kID0gZmluZE5vZGVBdFBvc2l0aW9uKGNoaWxkLCBwb3NpdGlvbik7XG4gICAgaWYgKGZvdW5kKSB7XG4gICAgICByZXN1bHQgPSBmb3VuZDtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBmb3JtYXRGaW5kaW5nQmxvY2tzKGZpbmRpbmdzOiByZWFkb25seSBPdmVyRXhwb3N1cmVGaW5kaW5nW10sIGJhc2VGb2xkZXI6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZ1tdIHtcbiAgY29uc3QgYnlGaWxlID0gbmV3IE1hcDxzdHJpbmcsIE92ZXJFeHBvc3VyZUZpbmRpbmdbXT4oKTtcbiAgZm9yIChjb25zdCBmaW5kaW5nIG9mIGZpbmRpbmdzKSB7XG4gICAgY29uc3QgbGlzdCA9IGJ5RmlsZS5nZXQoZmluZGluZy5maWxlUGF0aCkgPz8gW107XG4gICAgbGlzdC5wdXNoKGZpbmRpbmcpO1xuICAgIGJ5RmlsZS5zZXQoZmluZGluZy5maWxlUGF0aCwgbGlzdCk7XG4gIH1cblxuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBbZmlsZVBhdGgsIGxpc3RdIG9mIGJ5RmlsZSkge1xuICAgIGNvbnN0IHNvcnRlZCA9IFsuLi5saXN0XS5zb3J0KChhLCBiKSA9PiBhLmxpbmUgLSBiLmxpbmUpO1xuICAgIGNvbnN0IGxvY2F0aW9uV2lkdGggPSBNYXRoLm1heCguLi5zb3J0ZWQubWFwKChmaW5kaW5nKSA9PiBgJHtTdHJpbmcoZmluZGluZy5saW5lKX06JHtTdHJpbmcoZmluZGluZy5jb2x1bW4pfWAubGVuZ3RoKSk7XG4gICAgbGluZXMucHVzaCh0b0Rpc3BsYXlQYXRoKGZpbGVQYXRoLCBiYXNlRm9sZGVyKSk7XG4gICAgZm9yIChjb25zdCBmaW5kaW5nIG9mIHNvcnRlZCkge1xuICAgICAgY29uc3QgbG9jYXRpb24gPSBgJHtTdHJpbmcoZmluZGluZy5saW5lKX06JHtTdHJpbmcoZmluZGluZy5jb2x1bW4pfWAucGFkRW5kKGxvY2F0aW9uV2lkdGgpO1xuICAgICAgY29uc3QgY2hhbmdlID0gYCR7ZmluZGluZy5jdXJyZW50RXhwb3N1cmV9ICR7ZmluZGluZy5uYW1lfSAtPiAke2ZpbmRpbmcuc3VnZ2VzdGVkRXhwb3N1cmV9YDtcbiAgICAgIGxpbmVzLnB1c2goYCAgJHtsb2NhdGlvbn0gICR7Y2hhbmdlfSAtLSAke2Rlc2NyaWJlUmVhc29uKGZpbmRpbmcpfSR7ZGVzY3JpYmVGaXhTdGF0dXMoZmluZGluZyl9YCk7XG4gICAgfVxuICAgIGxpbmVzLnB1c2goJycpO1xuICB9XG4gIHJldHVybiBsaW5lcztcbn1cblxuZnVuY3Rpb24gZm9ybWF0U3VtbWFyeShmaW5kaW5nczogcmVhZG9ubHkgT3ZlckV4cG9zdXJlRmluZGluZ1tdKTogc3RyaW5nIHtcbiAgY29uc3Qgc3VtbWFyeSA9IGAke1N0cmluZyhmaW5kaW5ncy5sZW5ndGgpfSBmaW5kaW5nKHMpLmA7XG4gIGNvbnN0IGZpeGVkQ291bnQgPSBmaW5kaW5ncy5maWx0ZXIoKGZpbmRpbmcpID0+IGZpbmRpbmcud2FzRml4ZWQpLmxlbmd0aDtcbiAgY29uc3Qgc2tpcHBlZENvdW50ID0gZmluZGluZ3MuZmlsdGVyKChmaW5kaW5nKSA9PiBmaW5kaW5nLnNraXBSZWFzb24gIT09IG51bGwpLmxlbmd0aDtcbiAgaWYgKGZpeGVkQ291bnQgPT09IDAgJiYgc2tpcHBlZENvdW50ID09PSAwKSB7XG4gICAgcmV0dXJuIHN1bW1hcnk7XG4gIH1cbiAgcmV0dXJuIGAke3N1bW1hcnl9ICR7U3RyaW5nKGZpeGVkQ291bnQpfSBmaXhlZCwgJHtTdHJpbmcoc2tpcHBlZENvdW50KX0gc2tpcHBlZC5gO1xufVxuXG5mdW5jdGlvbiBnZXRDbGFzc0F0UG9zaXRpb24ocHJvZ3JhbTogUHJvZ3JhbSwgZmlsZU5hbWU6IHN0cmluZywgcG9zaXRpb246IG51bWJlcik6IENsYXNzTGlrZURlY2xhcmF0aW9uIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc291cmNlRmlsZSA9IHByb2dyYW0uZ2V0U291cmNlRmlsZShmaWxlTmFtZSk7XG4gIGFzc2VydE5vbk51bGxhYmxlKHNvdXJjZUZpbGUsIGBTb3VyY2UgZmlsZSBub3QgZm91bmQgaW4gcHJvZ3JhbTogJHtmaWxlTmFtZX1gKTtcbiAgY29uc3Qgbm9kZSA9IGZpbmROb2RlQXRQb3NpdGlvbihzb3VyY2VGaWxlLCBwb3NpdGlvbik7XG4gIGFzc2VydE5vbk51bGxhYmxlKG5vZGUsIGBObyBub2RlIGZvdW5kIGF0IHBvc2l0aW9uICR7U3RyaW5nKHBvc2l0aW9uKX0gaW4gJHtmaWxlTmFtZX1gKTtcbiAgcmV0dXJuIGdldEVuY2xvc2luZ0NsYXNzKG5vZGUpO1xufVxuXG5mdW5jdGlvbiBnZXRDdXJyZW50TWVtYmVyRXhwb3N1cmUobW9kaWZpZXJLaW5kczogUmVhZG9ubHlTZXQ8U3ludGF4S2luZD4pOiBNZW1iZXJFeHBvc3VyZSB7XG4gIGlmIChtb2RpZmllcktpbmRzLmhhcyhTeW50YXhLaW5kLlByaXZhdGVLZXl3b3JkKSkge1xuICAgIHJldHVybiAncHJpdmF0ZSc7XG4gIH1cbiAgaWYgKG1vZGlmaWVyS2luZHMuaGFzKFN5bnRheEtpbmQuUHJvdGVjdGVkS2V5d29yZCkpIHtcbiAgICByZXR1cm4gJ3Byb3RlY3RlZCc7XG4gIH1cbiAgcmV0dXJuICdwdWJsaWMnO1xufVxuXG5mdW5jdGlvbiBnZXRFbmNsb3NpbmdDbGFzcyhub2RlOiBOb2RlKTogQ2xhc3NMaWtlRGVjbGFyYXRpb24gfCB1bmRlZmluZWQge1xuICBsZXQgY3VycmVudDogTm9kZSA9IG5vZGU7XG4gIHdoaWxlICghaXNTb3VyY2VGaWxlKGN1cnJlbnQpKSB7XG4gICAgaWYgKGlzQ2xhc3NMaWtlKGN1cnJlbnQpKSB7XG4gICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9XG4gICAgY3VycmVudCA9IGN1cnJlbnQucGFyZW50O1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGdldEV4cG9ydGVkTmFtZU5vZGVzKGRlY2xhcmF0aW9uOiBFeHBvcnRhYmxlRGVjbGFyYXRpb24pOiBOb2RlW10ge1xuICBpZiAoaXNWYXJpYWJsZVN0YXRlbWVudChkZWNsYXJhdGlvbikpIHtcbiAgICByZXR1cm4gZGVjbGFyYXRpb24uZGVjbGFyYXRpb25MaXN0LmRlY2xhcmF0aW9ucy5tYXAoKHZhcmlhYmxlRGVjbGFyYXRpb24pID0+IHZhcmlhYmxlRGVjbGFyYXRpb24ubmFtZSkuZmlsdGVyKGlzSWRlbnRpZmllcik7XG4gIH1cbiAgcmV0dXJuIGRlY2xhcmF0aW9uLm5hbWUgPyBbZGVjbGFyYXRpb24ubmFtZV0gOiBbXTtcbn1cblxuZnVuY3Rpb24gZ2V0TW9kaWZpZXJLaW5kcyhub2RlOiBOb2RlKTogUmVhZG9ubHlTZXQ8U3ludGF4S2luZD4ge1xuICBjb25zdCBraW5kcyA9IG5ldyBTZXQ8U3ludGF4S2luZD4oKTtcbiAgaWYgKGNhbkhhdmVNb2RpZmllcnMobm9kZSkpIHtcbiAgICBmb3IgKGNvbnN0IG1vZGlmaWVyIG9mIGdldE1vZGlmaWVycyhub2RlKSA/PyBbXSkge1xuICAgICAga2luZHMuYWRkKG1vZGlmaWVyLmtpbmQpO1xuICAgIH1cbiAgfVxuICByZXR1cm4ga2luZHM7XG59XG5cbmZ1bmN0aW9uIGhhc1RzRG9jQ29tbWVudChub2RlOiBOb2RlKTogYm9vbGVhbiB7XG4gIGNvbnN0IHNvdXJjZUZpbGUgPSBub2RlLmdldFNvdXJjZUZpbGUoKTtcbiAgY29uc3QgZnVsbFRleHQgPSBzb3VyY2VGaWxlLmdldEZ1bGxUZXh0KCk7XG4gIGNvbnN0IGNvbW1lbnRSYW5nZXMgPSBnZXRMZWFkaW5nQ29tbWVudFJhbmdlcyhmdWxsVGV4dCwgbm9kZS5nZXRGdWxsU3RhcnQoKSkgPz8gW107XG4gIHJldHVybiBjb21tZW50UmFuZ2VzLnNvbWUoKHJhbmdlKSA9PlxuICAgIHJhbmdlLmtpbmQgPT09IFN5bnRheEtpbmQuTXVsdGlMaW5lQ29tbWVudFRyaXZpYVxuICAgICYmIGZ1bGxUZXh0LmNoYXJBdChyYW5nZS5wb3MgKyBKU0RPQ19TRUNPTkRfQVNURVJJU0tfT0ZGU0VUKSA9PT0gJyonXG4gICAgJiYgZnVsbFRleHQuY2hhckF0KHJhbmdlLnBvcyArIEpTRE9DX0ZPVVJUSF9DSEFSQUNURVJfT0ZGU0VUKSAhPT0gJy8nXG4gICk7XG59XG5cbmZ1bmN0aW9uIGlzRGVjbGFyYXRpb25JdHNlbGYocmVmZXJlbmNlOiBSZWZlcmVuY2VMb2NhdGlvbiwgbmFtZU5vZGU6IE5vZGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIHRvQ2Fub25pY2FsKHJlZmVyZW5jZS5maWxlTmFtZSkgPT09IHRvQ2Fub25pY2FsKG5hbWVOb2RlLmdldFNvdXJjZUZpbGUoKS5maWxlTmFtZSkgJiYgcmVmZXJlbmNlLnN0YXJ0ID09PSBuYW1lTm9kZS5nZXRTdGFydCgpO1xufVxuXG5mdW5jdGlvbiBpc0Rlcml2ZWRGcm9tKGRlcml2ZWQ6IENsYXNzTGlrZURlY2xhcmF0aW9uLCBiYXNlOiBDbGFzc0xpa2VEZWNsYXJhdGlvbiwgY2hlY2tlcjogVHlwZUNoZWNrZXIpOiBib29sZWFuIHtcbiAgY29uc3QgYmFzZVN5bWJvbCA9IGJhc2UubmFtZSA/IGNoZWNrZXIuZ2V0U3ltYm9sQXRMb2NhdGlvbihiYXNlLm5hbWUpIDogdW5kZWZpbmVkO1xuICBpZiAoIWJhc2VTeW1ib2wpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBmb3IgKGNvbnN0IGNsYXVzZSBvZiBkZXJpdmVkLmhlcml0YWdlQ2xhdXNlcyA/PyBbXSkge1xuICAgIGlmIChjbGF1c2UudG9rZW4gIT09IFN5bnRheEtpbmQuRXh0ZW5kc0tleXdvcmQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHR5cGVFeHByZXNzaW9uIG9mIGNsYXVzZS50eXBlcykge1xuICAgICAgY29uc3Qgc3ltYm9sID0gY2hlY2tlci5nZXRUeXBlQXRMb2NhdGlvbih0eXBlRXhwcmVzc2lvbi5leHByZXNzaW9uKS5nZXRTeW1ib2woKTtcbiAgICAgIGlmIChzeW1ib2wgPT09IGJhc2VTeW1ib2wpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGRlY2xhcmF0aW9uIG9mIHN5bWJvbD8uZGVjbGFyYXRpb25zID8/IFtdKSB7XG4gICAgICAgIGlmIChpc0NsYXNzTGlrZShkZWNsYXJhdGlvbikgJiYgaXNEZXJpdmVkRnJvbShkZWNsYXJhdGlvbiwgYmFzZSwgY2hlY2tlcikpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGlzT3duU291cmNlRmlsZShmaWxlUGF0aDogc3RyaW5nLCBzcmNGb2xkZXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZmlsZVBhdGguc3RhcnRzV2l0aChgJHtzcmNGb2xkZXJ9L2ApICYmIGZpbGVQYXRoLmVuZHNXaXRoKCcudHMnKSAmJiAhZmlsZVBhdGguZW5kc1dpdGgoJy5kLnRzJyk7XG59XG5cbmZ1bmN0aW9uIGlzVGVzdEZpbGUoZmlsZVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZmlsZVBhdGguaW5jbHVkZXMoJy50ZXN0LicpIHx8IGZpbGVQYXRoLmluY2x1ZGVzKCcuaW50ZWdyYXRpb24uJyk7XG59XG5cbmZ1bmN0aW9uIHJhbmtFeHBvc3VyZShleHBvc3VyZTogTWVtYmVyRXhwb3N1cmUpOiBudW1iZXIge1xuICByZXR1cm4gTUVNQkVSX0VYUE9TVVJFX09SREVSLmluZGV4T2YoZXhwb3N1cmUpO1xufVxuXG5mdW5jdGlvbiByZWNvcmQoY29udGV4dDogQW5hbHlzaXNDb250ZXh0LCBmaW5kaW5nOiBPdmVyRXhwb3N1cmVGaW5kaW5nLCBlZGl0OiBudWxsIHwgT3ZlckV4cG9zdXJlVGV4dEVkaXQpOiB2b2lkIHtcbiAgY29udGV4dC5maW5kaW5ncy5wdXNoKGZpbmRpbmcpO1xuICBjb250ZXh0LmVkaXRzLnB1c2goZWRpdCk7XG59XG5cbmZ1bmN0aW9uIHJ1bk92ZXJFeHBvc3VyZUFuYWx5c2lzKHBhcmFtczogQW5hbHl6ZU92ZXJFeHBvc3VyZVBhcmFtcyk6IEFuYWx5c2lzUmVzdWx0IHtcbiAgY29uc3QgeyBsYW5ndWFnZVNlcnZpY2UsIG9uUHJvZ3Jlc3MsIHNyY0ZvbGRlciB9ID0gcGFyYW1zO1xuICBjb25zdCBwcm9ncmFtID0gbGFuZ3VhZ2VTZXJ2aWNlLmdldFByb2dyYW0oKTtcbiAgaWYgKCFwcm9ncmFtKSB7XG4gICAgcmV0dXJuIHsgZWRpdHM6IFtdLCBmaW5kaW5nczogW10gfTtcbiAgfVxuXG4gIGNvbnN0IGNvbnRleHQ6IEFuYWx5c2lzQ29udGV4dCA9IHtcbiAgICBjaGVja2VyOiBwcm9ncmFtLmdldFR5cGVDaGVja2VyKCksXG4gICAgZWRpdHM6IFtdLFxuICAgIGZpbmRpbmdzOiBbXSxcbiAgICBsYW5ndWFnZVNlcnZpY2UsXG4gICAgcHJvZ3JhbSxcbiAgICBzaG91bGRGb3JjZTogcGFyYW1zLnNob3VsZEZvcmNlID8/IGZhbHNlXG4gIH07XG5cbiAgY29uc3Qgc291cmNlRmlsZXNUb0FuYWx5emUgPSBwcm9ncmFtLmdldFNvdXJjZUZpbGVzKCkuZmlsdGVyKChzb3VyY2VGaWxlKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSB0b0Nhbm9uaWNhbChzb3VyY2VGaWxlLmZpbGVOYW1lKTtcbiAgICByZXR1cm4gaXNPd25Tb3VyY2VGaWxlKGZpbGVQYXRoLCBzcmNGb2xkZXIpICYmICFpc1Rlc3RGaWxlKGZpbGVQYXRoKTtcbiAgfSk7XG5cbiAgZm9yIChjb25zdCBbYW5hbHl6ZWRGaWxlQ291bnQsIHNvdXJjZUZpbGVdIG9mIHNvdXJjZUZpbGVzVG9BbmFseXplLmVudHJpZXMoKSkge1xuICAgIG9uUHJvZ3Jlc3M/Lih7XG4gICAgICBhbmFseXplZEZpbGVDb3VudCxcbiAgICAgIGN1cnJlbnRGaWxlUGF0aDogdG9DYW5vbmljYWwoc291cmNlRmlsZS5maWxlTmFtZSksXG4gICAgICB0b3RhbEZpbGVDb3VudDogc291cmNlRmlsZXNUb0FuYWx5emUubGVuZ3RoXG4gICAgfSk7XG4gICAgdmlzaXQoc291cmNlRmlsZSk7XG4gIH1cbiAgcmV0dXJuIHsgZWRpdHM6IGNvbnRleHQuZWRpdHMsIGZpbmRpbmdzOiBjb250ZXh0LmZpbmRpbmdzIH07XG5cbiAgZnVuY3Rpb24gdmlzaXQobm9kZTogTm9kZSk6IHZvaWQge1xuICAgIGFuYWx5emVNZW1iZXIobm9kZSwgY29udGV4dCk7XG4gICAgYW5hbHl6ZUV4cG9ydChub2RlLCBjb250ZXh0KTtcbiAgICBub2RlLmZvckVhY2hDaGlsZCh2aXNpdCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdG9EaXNwbGF5UGF0aChmaWxlUGF0aDogc3RyaW5nLCBiYXNlRm9sZGVyOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICBpZiAoYmFzZUZvbGRlciAhPT0gdW5kZWZpbmVkICYmIGZpbGVQYXRoLnN0YXJ0c1dpdGgoYCR7YmFzZUZvbGRlcn0vYCkpIHtcbiAgICByZXR1cm4gZmlsZVBhdGguc2xpY2UoYmFzZUZvbGRlci5sZW5ndGggKyAxKTtcbiAgfVxuICByZXR1cm4gZmlsZVBhdGg7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBaUVBLHdCQXlCTztBQUVQLHlCQUFrQztBQUNsQyxpQ0FHTztBQThPQSxNQUFNLHNCQUEyQyxvQkFBSSxJQUFZO0FBQUEsRUFDdEU7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFDRixDQUFDO0FBc0RELE1BQU0sK0JBQStCO0FBQ3JDLE1BQU0sZ0NBQWdDO0FBQ3RDLE1BQU0sd0JBQW1ELENBQUMsV0FBVyxhQUFhLFFBQVE7QUFDMUYsTUFBTSxvQkFBdUQ7QUFBQSxFQUMzRCxjQUFjO0FBQUEsRUFDZCxXQUFXO0FBQUEsRUFDWCxhQUFhO0FBQ2Y7QUFDQSxNQUFNLDBCQUFrRTtBQUFBLEVBQ3RFLGFBQWE7QUFBQSxFQUNiLGlCQUFpQjtBQUFBLEVBQ2pCLGFBQWE7QUFDZjtBQUNBLE1BQU0sNEJBQXFELG9CQUFJLElBQWdCLENBQUMsNkJBQVcsZ0JBQWdCLDZCQUFXLGtCQUFrQiw2QkFBVyxhQUFhLENBQUM7QUFDakssTUFBTSxxQkFBcUI7QUFjcEIsU0FBUyxvQkFBb0IsUUFBMEQ7QUFDNUYsUUFBTSxTQUFT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
|
|
718
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy9saW50ZXJzL292ZXItZXhwb3N1cmUudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBPdmVyLWV4cG9zdXJlIGFuYWx5emVyLlxuICpcbiAqIEZpbmRzIGRlY2xhcmF0aW9ucyBleHBvc2VkIG1vcmUgYnJvYWRseSB0aGFuIHRoZWlyIHJlZmVyZW5jZXMgcmVxdWlyZSwgc28gdGhlIGV4cG9zdXJlIGNhbiBiZVxuICogdGlnaHRlbmVkOlxuICpcbiAqIC0gYGV4cG9ydGBlZCBzeW1ib2xzIHJlZmVyZW5jZWQgb25seSB3aXRoaW4gdGhlaXIgb3duIGZpbGUgXHUyMDE0IHRoZSBgZXhwb3J0YCBjYW4gYmUgZHJvcHBlZC5cbiAqIC0gYHB1YmxpY2AgY2xhc3MgbWVtYmVycyByZWZlcmVuY2VkIG9ubHkgaW5zaWRlIHRoZWlyIG93biBjbGFzcyBcdTIwMTQgdGhleSBjYW4gYmUgYHByaXZhdGVgLlxuICogLSBgcHVibGljYCBjbGFzcyBtZW1iZXJzIHJlZmVyZW5jZWQgb25seSBpbnNpZGUgdGhlaXIgb3duIGNsYXNzIGFuZCBpdHMgc3ViY2xhc3NlcyBcdTIwMTQgdGhleSBjYW4gYmVcbiAqICAgYHByb3RlY3RlZGAuXG4gKiAtIGBwcm90ZWN0ZWRgIGNsYXNzIG1lbWJlcnMgcmVmZXJlbmNlZCBvbmx5IGluc2lkZSB0aGVpciBvd24gY2xhc3MgXHUyMDE0IHRoZXkgY2FuIGJlIGBwcml2YXRlYC5cbiAqXG4gKiBUaGUgYW5hbHlzaXMgaXMgd2hvbGUtcHJvZ3JhbSBhbmQgdHlwZS1hd2FyZTogaXQgdXNlcyB0aGUgVHlwZVNjcmlwdCBsYW5ndWFnZSBzZXJ2aWNlJ3NcbiAqIGZpbmQtYWxsLXJlZmVyZW5jZXMgdG8gbG9jYXRlIGV2ZXJ5IHVzZSBvZiBlYWNoIGRlY2xhcmF0aW9uLCB0aGVuIGNsYXNzaWZpZXMgdGhlIHRpZ2h0ZXN0XG4gKiBleHBvc3VyZSB0aGF0IHN0aWxsIGNvdmVycyBhbGwgcmVmZXJlbmNlcy4gQmVjYXVzZSBgZmluZFJlZmVyZW5jZXNgIGRvZXMgbm90IGxpbmsgYSBzdHJpbmctbGl0ZXJhbFxuICogYXJndW1lbnQgYmFjayB0byBhIG1lbWJlciBkZWNsYXJhdGlvbiB3aGVuIHRoZSBwYXJhbWV0ZXIgaXMgYSBjb25kaXRpb25hbC9tYXBwZWQga2V5IHR5cGUgKGUuZy5cbiAqIGBiaW5kKGNvbXBvbmVudCwgJ3NvbWVTZXR0aW5nJylgIHdoZXJlIHRoZSBrZXkgaXMgdHlwZWQgYENvbmRpdGlvbmFsS2V5czxTZXR0aW5ncywgXHUyMDI2PmApLCBtZW1iZXJcbiAqIGFuYWx5c2lzIGFkZGl0aW9uYWxseSB0cmVhdHMgYSBzdHJpbmcgbGl0ZXJhbCB3aG9zZSB0ZXh0IGVxdWFscyB0aGUgbWVtYmVyIG5hbWUgYXMgYSByZWZlcmVuY2UgXHUyMDE0XG4gKiBidXQgb25seSB3aGVuIGl0cyBjb250ZXh0dWFsIHR5cGUgaXMgYSBzdHJpbmctbGl0ZXJhbCB0eXBlIChvciB1bmlvbiBvZiB0aGVtKSBhbGwgb2Ygd2hvc2UgbWVtYmVyc1xuICogYXJlIGtleXMgb2YgdGhlIGRlY2xhcmluZyBjbGFzcywgc28gaW5jaWRlbnRhbCBzYW1lLW5hbWVkIHN0cmluZ3MgKGBjb25zb2xlLmxvZygnbmFtZScpYCkgYXJlIG5vdFxuICogbWlzY291bnRlZC4gTWVtYmVycyBpbnZva2VkIGJ5IHRoZSBmcmFtZXdvcmsgdmlhIHJlZ2lzdHJhdGlvblxuICogcmF0aGVyIHRoYW4gYnkgdmlzaWJsZSByZWZlcmVuY2VzIChPYnNpZGlhbiBsaWZlY3ljbGUgaG9va3MsIHNldHRpbmdzLXRhYiBgZGlzcGxheWAsIGV0Yy4pIGFyZVxuICogZXhjbHVkZWQgdmlhIHtAbGluayBMSUZFQ1lDTEVfQUxMT1dMSVNUfSwgYXMgYXJlIGBvdmVycmlkZWAgYW5kIGBzdGF0aWNgIG1lbWJlcnMgd2hvc2UgZXhwb3N1cmUgaXNcbiAqIGNvbnN0cmFpbmVkIGJ5IGEgYmFzZSBkZWNsYXJhdGlvbi4gRUNNQVNjcmlwdCBoYXJkLXByaXZhdGUgbWVtYmVycyAoYCNuYW1lYCkgYXJlIGFsc28gZXhjbHVkZWQgXHUyMDE0XG4gKiB0aGV5IGFyZSBhbHJlYWR5IG1heGltYWxseSBwcml2YXRlIGFuZCBjYW5ub3QgY2FycnkgYSB2aXNpYmlsaXR5IG1vZGlmaWVyLiBBIGRlY2xhcmF0aW9uIGNhcnJ5aW5nXG4gKiBhIFRTRG9jIChgLyoqIFx1MjAyNiAqXFwvYCkgZG9jdW1lbnRhdGlvbiBjb21tZW50IGlzIGxpa2V3aXNlIGV4Y2x1ZGVkIFx1MjAxNCB3aGV0aGVyIGEgdG9wLWxldmVsIGBleHBvcnRgIG9yXG4gKiBhIGNsYXNzIG1lbWJlciwgZG9jdW1lbnRpbmcgaXQgaXMgYSBkZWxpYmVyYXRlIHNpZ25hbCB0aGF0IGl0IGlzIHBhcnQgb2YgdGhlIGludGVuZGVkIHB1YmxpYyBBUEksXG4gKiByZWdhcmRsZXNzIG9mIHdoZXJlIGl0IGN1cnJlbnRseSBoYXBwZW5zIHRvIGJlIHJlZmVyZW5jZWQuXG4gKlxuICogQSBtZW1iZXIgcmVmZXJlbmNlZCBvbmx5IGZyb20gdGVzdCBmaWxlcyBpcyByZXBvcnRlZCB3aXRoIHtAbGluayBPdmVyRXhwb3N1cmVGaW5kaW5nLmlzRm9yY2VkQnlUZXN0T25seX1cbiAqIHNldCwgc3VyZmFjaW5nIG1lbWJlcnMgd2lkZW5lZCBwdXJlbHkgZm9yIHRlc3RhYmlsaXR5IFx1MjAxNCB0aGUgY2Fub25pY2FsIGNhc2UgZm9yIGV4dHJhY3RpbmcgbG9naWNcbiAqIGludG8gYW4gaW5kZXBlbmRlbnRseSB0ZXN0YWJsZSBjb21wb25lbnQgaW5zdGVhZC5cbiAqXG4gKiBCZXlvbmQgcmVwb3J0aW5nLCBwYXNzaW5nIGBzaG91bGRGaXhgIHRvIHtAbGluayBmaW5kT3ZlckV4cG9zdXJlfSAvIHtAbGluayBhbmFseXplT3ZlckV4cG9zdXJlfVxuICogcmV3cml0ZXMgdGhlIHNvdXJjZSBpbiBwbGFjZTogZHJvcHBpbmcgdGhlIGBleHBvcnRgIGtleXdvcmQsIG9yIHJlcGxhY2luZy9pbnNlcnRpbmcgYSBgcHJpdmF0ZWBcbiAqIG9yIGBwcm90ZWN0ZWRgIG1vZGlmaWVyLiBFYWNoIGZpbmRpbmcgdGhlbiBjYXJyaWVzIHtAbGluayBPdmVyRXhwb3N1cmVGaW5kaW5nLndhc0ZpeGVkfSAvXG4gKiB7QGxpbmsgT3ZlckV4cG9zdXJlRmluZGluZy5za2lwUmVhc29ufS4gQ2hhbmdlcyB0aGF0IGNhbm5vdCBiZSBzYWZlbHkgYXV0b21hdGVkIFx1MjAxNCB0aG9zZSBmb3JjZWRcbiAqIG9ubHkgYnkgdGVzdCByZWZlcmVuY2VzLCBkZWNvcmF0ZWQgbWVtYmVycywgb3IgYW4gYGV4cG9ydGAgc2hhcmVkIHdpdGggYSBzdGlsbC1leHBvcnRlZCBzaWJsaW5nIFx1MjAxNFxuICogYXJlIHJlcG9ydGVkIGFzIHNraXBwZWQgYW5kIGxlZnQgdW50b3VjaGVkLlxuICpcbiAqIEFkZGl0aW9uYWxseSBwYXNzaW5nIGBzaG91bGRGb3JjZWAgKG9ubHkgbWVhbmluZ2Z1bCB0b2dldGhlciB3aXRoIGBzaG91bGRGaXhgKSB0aWdodGVucyB0aGVcbiAqIGRlY2xhcmF0aW9ucyBoZWxkIHdpZGUgcHVyZWx5IGJ5IHRlc3QgcmVmZXJlbmNlcyB0b28gXHUyMDE0IHRoZSBwcm9kdWN0aW9uIGhhbGYgb2YgdGhlIGNhbm9uaWNhbFxuICogdGVzdC1vbmx5IG1pZ3JhdGlvbjogdGhlIG1lbWJlciBiZWNvbWVzIGBwcml2YXRlYCAvIHRoZSBgZXhwb3J0YCBpcyBkcm9wcGVkLCBsZWF2aW5nIG9ubHkgdGhlXG4gKiB0ZXN0IHRvIHN3aXRjaCB0byBhIGNhc3QtYmFzZWQgYWNjZXNzLiBEZWNvcmF0ZWQgbWVtYmVycyBhbmQgZXhwb3J0cyBzaGFyZWQgd2l0aCBhIHN0aWxsLWV4cG9ydGVkXG4gKiBzaWJsaW5nIHN0YXkgc2tpcHBlZCBldmVuIHVuZGVyIGBzaG91bGRGb3JjZWAsIGJlY2F1c2Ugbm8gZWRpdCBjYW4gYmUgYXBwbGllZCBzYWZlbHkuXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBDbGFzc0RlY2xhcmF0aW9uLFxuICBDbGFzc0xpa2VEZWNsYXJhdGlvbixcbiAgQ29tcGlsZXJPcHRpb25zLFxuICBFbnVtRGVjbGFyYXRpb24sXG4gIEZ1bmN0aW9uRGVjbGFyYXRpb24sXG4gIEdldEFjY2Vzc29yRGVjbGFyYXRpb24sXG4gIEludGVyZmFjZURlY2xhcmF0aW9uLFxuICBJU2NyaXB0U25hcHNob3QsXG4gIExhbmd1YWdlU2VydmljZSxcbiAgTGFuZ3VhZ2VTZXJ2aWNlSG9zdCxcbiAgTWV0aG9kRGVjbGFyYXRpb24sXG4gIE5vZGUsXG4gIFByb2dyYW0sXG4gIFByb3BlcnR5RGVjbGFyYXRpb24sXG4gIFJlZmVyZW5jZWRTeW1ib2wsXG4gIFNldEFjY2Vzc29yRGVjbGFyYXRpb24sXG4gIFNvdXJjZUZpbGUsXG4gIFN0cmluZ0xpdGVyYWxMaWtlLFxuICBUeXBlLFxuICBUeXBlQWxpYXNEZWNsYXJhdGlvbixcbiAgVHlwZUNoZWNrZXIsXG4gIFZhcmlhYmxlU3RhdGVtZW50XG59IGZyb20gJ3R5cGVzY3JpcHQnO1xuXG5pbXBvcnQge1xuICBjYW5IYXZlTW9kaWZpZXJzLFxuICBjcmVhdGVEb2N1bWVudFJlZ2lzdHJ5LFxuICBjcmVhdGVMYW5ndWFnZVNlcnZpY2UsXG4gIGdldERlY29yYXRvcnMsXG4gIGdldERlZmF1bHRMaWJGaWxlUGF0aCxcbiAgZ2V0TGVhZGluZ0NvbW1lbnRSYW5nZXMsXG4gIGdldE1vZGlmaWVycyxcbiAgaXNDbGFzc0RlY2xhcmF0aW9uLFxuICBpc0NsYXNzTGlrZSxcbiAgaXNFbnVtRGVjbGFyYXRpb24sXG4gIGlzRnVuY3Rpb25EZWNsYXJhdGlvbixcbiAgaXNHZXRBY2Nlc3NvckRlY2xhcmF0aW9uLFxuICBpc0lkZW50aWZpZXIsXG4gIGlzSW50ZXJmYWNlRGVjbGFyYXRpb24sXG4gIGlzTWV0aG9kRGVjbGFyYXRpb24sXG4gIGlzUHJpdmF0ZUlkZW50aWZpZXIsXG4gIGlzUHJvcGVydHlEZWNsYXJhdGlvbixcbiAgaXNTZXRBY2Nlc3NvckRlY2xhcmF0aW9uLFxuICBpc1NvdXJjZUZpbGUsXG4gIGlzU3RyaW5nTGl0ZXJhbExpa2UsXG4gIGlzVHlwZUFsaWFzRGVjbGFyYXRpb24sXG4gIGlzVmFyaWFibGVTdGF0ZW1lbnQsXG4gIFNjcmlwdFNuYXBzaG90LFxuICBTeW50YXhLaW5kLFxuICBzeXNcbn0gZnJvbSAndHlwZXNjcmlwdCc7XG5cbmltcG9ydCB7IGFzc2VydE5vbk51bGxhYmxlIH0gZnJvbSAnLi4vLi4vdHlwZS1ndWFyZHMudHMnO1xuaW1wb3J0IHtcbiAgcGFyc2VUc0NvbmZpZyxcbiAgdG9DYW5vbmljYWxcbn0gZnJvbSAnLi4vY2hlY2stcHJvamVjdC10eXBlcy50cyc7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGFuYWx5emVPdmVyRXhwb3N1cmV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFuYWx5emVPdmVyRXhwb3N1cmVQYXJhbXMge1xuICAvKiogVGhlIGxhbmd1YWdlIHNlcnZpY2UgdG8gcXVlcnkgZm9yIHJlZmVyZW5jZXMgYW5kIHR5cGVzLiAqL1xuICByZWFkb25seSBsYW5ndWFnZVNlcnZpY2U6IExhbmd1YWdlU2VydmljZTtcblxuICAvKipcbiAgICogT3B0aW9uYWwgY2FsbGJhY2sgaW52b2tlZCBvbmNlIHBlciBhbmFseXplZCBzb3VyY2UgZmlsZSwgYmVmb3JlIHRoYXQgZmlsZSBpcyBwcm9jZXNzZWQuIFRoZVxuICAgKiB3aG9sZS1wcm9ncmFtIHJlZmVyZW5jZSBhbmFseXNpcyBpcyBzbG93LCBzbyB0aGlzIGxldHMgY2FsbGVycyByZXBvcnQgbGl2ZSBwcm9ncmVzcyBpbnN0ZWFkIG9mXG4gICAqIGFwcGVhcmluZyB0byBoYW5nLlxuICAgKi9cbiAgb25Qcm9ncmVzcz8odGhpczogdm9pZCwgcHJvZ3Jlc3M6IE92ZXJFeHBvc3VyZVByb2dyZXNzKTogdm9pZDtcblxuICAvKipcbiAgICogV2hlbiBgdHJ1ZWAsIGVhY2ggZml4YWJsZSBmaW5kaW5nIGlzIHRpZ2h0ZW5lZCBpbiBwbGFjZSB2aWEge0BsaW5rIHdyaXRlRmlsZX0gKHdoaWNoIG11c3QgdGhlblxuICAgKiBiZSBwcm92aWRlZCksIGFuZCB0aGUgcmV0dXJuZWQgZmluZGluZ3MgY2Fycnkge0BsaW5rIE92ZXJFeHBvc3VyZUZpbmRpbmcud2FzRml4ZWR9IC9cbiAgICoge0BsaW5rIE92ZXJFeHBvc3VyZUZpbmRpbmcuc2tpcFJlYXNvbn0uIFdoZW4gYGZhbHNlYCBvciBvbWl0dGVkLCB0aGUgYW5hbHlzaXMgb25seSByZXBvcnRzLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRml4PzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogV2hlbiBgdHJ1ZWAgKG9ubHkgbWVhbmluZ2Z1bCB0b2dldGhlciB3aXRoIHtAbGluayBzaG91bGRGaXh9KSwgZGVjbGFyYXRpb25zIGhlbGQgd2lkZSBwdXJlbHkgYnlcbiAgICogdGVzdCByZWZlcmVuY2VzIGFyZSB0aWdodGVuZWQgdG9vLCBpbnN0ZWFkIG9mIGJlaW5nIHNraXBwZWQgd2l0aCBhIGB0ZXN0LW9ubHlgXG4gICAqIHtAbGluayBPdmVyRXhwb3N1cmVGaW5kaW5nLnNraXBSZWFzb259LiBEZWNvcmF0ZWQgbWVtYmVycyBhbmQgZXhwb3J0cyBzaGFyZWQgd2l0aCBhXG4gICAqIHN0aWxsLWV4cG9ydGVkIHNpYmxpbmcgc3RheSBza2lwcGVkIHJlZ2FyZGxlc3MsIGJlY2F1c2Ugbm8gZWRpdCBjYW4gYmUgYXBwbGllZCBzYWZlbHkuXG4gICAqL1xuICByZWFkb25seSBzaG91bGRGb3JjZT86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEFic29sdXRlIChjYW5vbmljYWwpIHBhdGggb2YgdGhlIHByb2plY3QncyBgc3JjYCBmb2xkZXIuIE9ubHkgZGVjbGFyYXRpb25zIGluIG5vbi10ZXN0IGZpbGVzXG4gICAqIHVuZGVyIHRoaXMgZm9sZGVyIGFyZSBhbmFseXplZDsgZGVjbGFyYXRpb25zIGVsc2V3aGVyZSAodGVzdCBmaWxlcywgZGVwZW5kZW5jaWVzKSBhcmUgaWdub3JlZFxuICAgKiBidXQgc3RpbGwgY291bnRlZCBhcyByZWZlcmVuY2Ugc2l0ZXMuXG4gICAqL1xuICByZWFkb25seSBzcmNGb2xkZXI6IHN0cmluZztcblxuICAvKipcbiAgICogV3JpdGVzIHRoZSB0aWdodGVuZWQgY29udGVudHMgb2YgYSBjaGFuZ2VkIGZpbGUgYmFjayB0byBkaXNrLiBSZXF1aXJlZCB3aGVuIHtAbGluayBzaG91bGRGaXh9XG4gICAqIGlzIGB0cnVlYDsgaWdub3JlZCBvdGhlcndpc2UuXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoIC0gQWJzb2x1dGUgcGF0aCBvZiB0aGUgZmlsZSB0byB3cml0ZSAob3JpZ2luYWwgY2FzaW5nLCBhcyBzdG9yZWQgaW4gdGhlIHByb2dyYW0pLlxuICAgKiBAcGFyYW0gY29udGVudCAtIFRoZSBmdWxsIG5ldyBmaWxlIGNvbnRlbnRzLlxuICAgKi9cbiAgd3JpdGVGaWxlPyh0aGlzOiB2b2lkLCBwYXRoOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZyk6IHZvaWQ7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGNyZWF0ZUxhbmd1YWdlU2VydmljZUhvc3R9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZUxhbmd1YWdlU2VydmljZUhvc3RQYXJhbXMge1xuICAvKiogVGhlIGNvbXBpbGVyIG9wdGlvbnMuICovXG4gIHJlYWRvbmx5IGNvbXBpbGVyT3B0aW9uczogQ29tcGlsZXJPcHRpb25zO1xuXG4gIC8qKiBUaGUgZmlsZXMgdG8gaW5jbHVkZSBpbiB0aGUgcHJvZ3JhbS4gKi9cbiAgcmVhZG9ubHkgZmlsZU5hbWVzOiByZWFkb25seSBzdHJpbmdbXTtcblxuICAvKiogVGhlIGZpbGUtc3lzdGVtIG9wZXJhdGlvbnMgdXNlZCB0byByZWFkIHNvdXJjZXMuICovXG4gIHJlYWRvbmx5IGZpbGVTeXN0ZW06IE92ZXJFeHBvc3VyZUZpbGVTeXN0ZW07XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGNyZWF0ZVByb2plY3RMYW5ndWFnZVNlcnZpY2V9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZVByb2plY3RMYW5ndWFnZVNlcnZpY2VQYXJhbXMge1xuICAvKiogQWJzb2x1dGUgcGF0aCB0byB0aGUgcHJvamVjdCdzIGB0c2NvbmZpZy5qc29uYC4gKi9cbiAgcmVhZG9ubHkgdHNDb25maWdQYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIGV4cG9zdXJlIGxldmVsIGEgZGVjbGFyYXRpb24gY3VycmVudGx5IGhhcy5cbiAqL1xuZXhwb3J0IHR5cGUgQ3VycmVudEV4cG9zdXJlID0gJ2V4cG9ydCcgfCAncHJvdGVjdGVkJyB8ICdwdWJsaWMnO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBmaW5kT3ZlckV4cG9zdXJlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGaW5kT3ZlckV4cG9zdXJlUGFyYW1zIHtcbiAgLyoqXG4gICAqIE9wdGlvbmFsIGNhbGxiYWNrIGludm9rZWQgb25jZSBwZXIgYW5hbHl6ZWQgc291cmNlIGZpbGUsIGZvciBsaXZlIHByb2dyZXNzIHJlcG9ydGluZy4gRm9yd2FyZGVkXG4gICAqIHRvIHtAbGluayBhbmFseXplT3ZlckV4cG9zdXJlfS5cbiAgICovXG4gIG9uUHJvZ3Jlc3M/KHRoaXM6IHZvaWQsIHByb2dyZXNzOiBPdmVyRXhwb3N1cmVQcm9ncmVzcyk6IHZvaWQ7XG5cbiAgLyoqIEFic29sdXRlIHBhdGggdG8gdGhlIHByb2plY3Qgcm9vdCAodGhlIGZvbGRlciBjb250YWluaW5nIGB0c2NvbmZpZy5qc29uYCBhbmQgYHNyY2ApLiAqL1xuICByZWFkb25seSBwcm9qZWN0Rm9sZGVyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZW4gYHRydWVgLCBmaXhhYmxlIGZpbmRpbmdzIGFyZSB0aWdodGVuZWQgaW4gcGxhY2Ugb24gZGlzayAodGhlIGBleHBvcnRgIGtleXdvcmQgaXMgZHJvcHBlZCxcbiAgICogb3IgYSBgcHJpdmF0ZWAgLyBgcHJvdGVjdGVkYCBtb2RpZmllciBpcyBpbnNlcnRlZC9yZXBsYWNlZCkuIFdoZW4gYGZhbHNlYCBvciBvbWl0dGVkLCB0aGVcbiAgICogcHJvamVjdCBpcyBvbmx5IGFuYWx5emVkLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRml4PzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogV2hlbiBgdHJ1ZWAgKG9ubHkgbWVhbmluZ2Z1bCB0b2dldGhlciB3aXRoIHtAbGluayBzaG91bGRGaXh9KSwgZGVjbGFyYXRpb25zIGhlbGQgd2lkZSBwdXJlbHkgYnlcbiAgICogdGVzdCByZWZlcmVuY2VzIGFyZSB0aWdodGVuZWQgdG9vLCBpbnN0ZWFkIG9mIGJlaW5nIHNraXBwZWQuIERlY29yYXRlZCBtZW1iZXJzIGFuZCBleHBvcnRzXG4gICAqIHNoYXJlZCB3aXRoIGEgc3RpbGwtZXhwb3J0ZWQgc2libGluZyBzdGF5IHNraXBwZWQgcmVnYXJkbGVzcy4gRm9yd2FyZGVkIHRvXG4gICAqIHtAbGluayBhbmFseXplT3ZlckV4cG9zdXJlfS5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEZvcmNlPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgZm9ybWF0T3ZlckV4cG9zdXJlRmluZGluZ3N9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1hdE92ZXJFeHBvc3VyZUZpbmRpbmdzT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXaGVuIHNldCwgZmlsZSBwYXRocyBpbiB0aGUgcmVwb3J0IGFyZSByZW5kZXJlZCByZWxhdGl2ZSB0byB0aGlzIGZvbGRlciAodHlwaWNhbGx5IHRoZSBjdXJyZW50XG4gICAqIHdvcmtpbmcgZGlyZWN0b3J5KSBpbnN0ZWFkIG9mIGFzIGFic29sdXRlIHBhdGhzLiBQYXRocyBvdXRzaWRlIHRoZSBmb2xkZXIgc3RheSBhYnNvbHV0ZS5cbiAgICovXG4gIHJlYWRvbmx5IGJhc2VGb2xkZXI/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHN1YnNldCBvZiBmaWxlLXN5c3RlbSBvcGVyYXRpb25zIHRoZSBsYW5ndWFnZS1zZXJ2aWNlIGhvc3QgbmVlZHMuIEluamVjdGluZyB0aGlzIChyYXRoZXIgdGhhblxuICogYWx3YXlzIHVzaW5nIGB0eXBlc2NyaXB0YCdzIGBzeXNgKSBsZXRzIHRlc3RzIGRyaXZlIHRoZSBhbmFseXplciBhZ2FpbnN0IGluLW1lbW9yeSBzb3VyY2VzIHdpdGggbm9cbiAqIHJlYWwgZmlsZS1zeXN0ZW0gYWNjZXNzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE92ZXJFeHBvc3VyZUZpbGVTeXN0ZW0ge1xuICAvKipcbiAgICogQHBhcmFtIHBhdGggLSBEaXJlY3RvcnkgcGF0aC5cbiAgICogQHJldHVybnMgYHRydWVgIHdoZW4gdGhlIGRpcmVjdG9yeSBleGlzdHMuXG4gICAqL1xuICBkaXJlY3RvcnlFeGlzdHModGhpczogdm9pZCwgcGF0aDogc3RyaW5nKTogYm9vbGVhbjtcblxuICAvKipcbiAgICogQHBhcmFtIHBhdGggLSBGaWxlIHBhdGguXG4gICAqIEByZXR1cm5zIGB0cnVlYCB3aGVuIHRoZSBmaWxlIGV4aXN0cy5cbiAgICovXG4gIGZpbGVFeGlzdHModGhpczogdm9pZCwgcGF0aDogc3RyaW5nKTogYm9vbGVhbjtcblxuICAvKipcbiAgICogQHJldHVybnMgVGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuXG4gICAqL1xuICBnZXRDdXJyZW50RGlyZWN0b3J5KHRoaXM6IHZvaWQpOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBwYXRoIC0gRGlyZWN0b3J5IHBhdGguXG4gICAqIEByZXR1cm5zIFRoZSBpbW1lZGlhdGUgc3ViZGlyZWN0b3J5IG5hbWVzLlxuICAgKi9cbiAgZ2V0RGlyZWN0b3JpZXModGhpczogdm9pZCwgcGF0aDogc3RyaW5nKTogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBwYXRoIC0gUm9vdCBkaXJlY3RvcnkuXG4gICAqIEBwYXJhbSBleHRlbnNpb25zIC0gRXh0ZW5zaW9ucyB0byBpbmNsdWRlLlxuICAgKiBAcGFyYW0gZXhjbHVkZSAtIFBhdHRlcm5zIHRvIGV4Y2x1ZGUuXG4gICAqIEBwYXJhbSBpbmNsdWRlIC0gUGF0dGVybnMgdG8gaW5jbHVkZS5cbiAgICogQHBhcmFtIGRlcHRoIC0gTWF4aW11bSByZWN1cnNpb24gZGVwdGguXG4gICAqIEByZXR1cm5zIFRoZSBtYXRjaGluZyBmaWxlIHBhdGhzLlxuICAgKi9cbiAgcmVhZERpcmVjdG9yeSh0aGlzOiB2b2lkLCBwYXRoOiBzdHJpbmcsIGV4dGVuc2lvbnM/OiByZWFkb25seSBzdHJpbmdbXSwgZXhjbHVkZT86IHJlYWRvbmx5IHN0cmluZ1tdLCBpbmNsdWRlPzogcmVhZG9ubHkgc3RyaW5nW10sIGRlcHRoPzogbnVtYmVyKTogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBwYXRoIC0gRmlsZSBwYXRoLlxuICAgKiBAcmV0dXJucyBUaGUgZmlsZSBjb250ZW50cywgb3IgYHVuZGVmaW5lZGAgd2hlbiBhYnNlbnQuXG4gICAqL1xuICByZWFkRmlsZSh0aGlzOiB2b2lkLCBwYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQSBzaW5nbGUgb3Zlci1leHBvc2VkIGRlY2xhcmF0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE92ZXJFeHBvc3VyZUZpbmRpbmcge1xuICAvKiogMS1iYXNlZCBjb2x1bW4gb2YgdGhlIGRlY2xhcmF0aW9uJ3MgbmFtZS4gKi9cbiAgcmVhZG9ubHkgY29sdW1uOiBudW1iZXI7XG5cbiAgLyoqIFRoZSBjdXJyZW50IGV4cG9zdXJlIGxldmVsLiAqL1xuICByZWFkb25seSBjdXJyZW50RXhwb3N1cmU6IEN1cnJlbnRFeHBvc3VyZTtcblxuICAvKiogQWJzb2x1dGUgcGF0aCBvZiB0aGUgZmlsZSBkZWNsYXJpbmcgdGhlIHN5bWJvbC4gKi9cbiAgcmVhZG9ubHkgZmlsZVBhdGg6IHN0cmluZztcblxuICAvKiogYHRydWVgIHdoZW4gdGhlIGRlY2xhcmF0aW9uIGhhcyBubyByZWZlcmVuY2VzIGF0IGFsbCAoYmVzaWRlcyBpdHNlbGYpLiAqL1xuICByZWFkb25seSBoYXNOb1JlZmVyZW5jZXM6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIGB0cnVlYCB3aGVuIHRoZSBkZWNsYXJhdGlvbiB3b3VsZCBxdWFsaWZ5IGZvciBhIHRpZ2h0ZXIgZXhwb3N1cmUgaWYgbm90IGZvciByZWZlcmVuY2VzIGNvbWluZ1xuICAgKiBleGNsdXNpdmVseSBmcm9tIHRlc3QgZmlsZXMgXHUyMDE0IGkuZS4gaXQgaXMgZXhwb3NlZCBwdXJlbHkgZm9yIHRlc3RhYmlsaXR5LlxuICAgKi9cbiAgcmVhZG9ubHkgaXNGb3JjZWRCeVRlc3RPbmx5OiBib29sZWFuO1xuXG4gIC8qKiBgdHJ1ZWAgZm9yIGEgY2xhc3MgbWVtYmVyLCBgZmFsc2VgIGZvciBhIHRvcC1sZXZlbCBleHBvcnQuICovXG4gIHJlYWRvbmx5IGlzTWVtYmVyOiBib29sZWFuO1xuXG4gIC8qKiAxLWJhc2VkIGxpbmUgb2YgdGhlIGRlY2xhcmF0aW9uJ3MgbmFtZS4gKi9cbiAgcmVhZG9ubHkgbGluZTogbnVtYmVyO1xuXG4gIC8qKiBUaGUgZGVjbGFyZWQgbmFtZS4gKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJbiBhIGZpeCBydW4sIHdoeSB0aGlzIGZpbmRpbmcgd2FzIGxlZnQgdW50b3VjaGVkIGluc3RlYWQgb2YgdGlnaHRlbmVkOyBgbnVsbGAgd2hlbiBpdCB3YXNcbiAgICogZml4ZWQgb3Igd2hlbiB0aGUgYW5hbHlzaXMgb25seSByZXBvcnRlZCAoYHNob3VsZEZpeGAgb2ZmKS5cbiAgICovXG4gIHJlYWRvbmx5IHNraXBSZWFzb246IG51bGwgfCBPdmVyRXhwb3N1cmVTa2lwUmVhc29uO1xuXG4gIC8qKiBUaGUgZXhwb3N1cmUgdGhlIGRlY2xhcmF0aW9uIGNvdWxkIGJlIHRpZ2h0ZW5lZCB0by4gKi9cbiAgcmVhZG9ubHkgc3VnZ2VzdGVkRXhwb3N1cmU6IFN1Z2dlc3RlZEV4cG9zdXJlO1xuXG4gIC8qKiBgdHJ1ZWAgd2hlbiBhIGZpeCBydW4gdGlnaHRlbmVkIHRoaXMgZGVjbGFyYXRpb24gaW4gcGxhY2UuIEFsd2F5cyBgZmFsc2VgIGluIGEgcmVwb3J0IHJ1bi4gKi9cbiAgcmVhZG9ubHkgd2FzRml4ZWQ6IGJvb2xlYW47XG59XG5cbi8qKlxuICogUHJvZ3Jlc3MgcmVwb3J0ZWQgd2hpbGUgYW5hbHl6aW5nIGEgcHJvamVjdCwgb25lIGV2ZW50IHBlciBhbmFseXplZCBzb3VyY2UgZmlsZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPdmVyRXhwb3N1cmVQcm9ncmVzcyB7XG4gIC8qKiBOdW1iZXIgb2Ygc291cmNlIGZpbGVzIGZ1bGx5IGFuYWx5emVkIGJlZm9yZSB0aGUgY3VycmVudCBvbmUgKDAtYmFzZWQpLiAqL1xuICByZWFkb25seSBhbmFseXplZEZpbGVDb3VudDogbnVtYmVyO1xuXG4gIC8qKiBBYnNvbHV0ZSAoY2Fub25pY2FsKSBwYXRoIG9mIHRoZSBzb3VyY2UgZmlsZSBhYm91dCB0byBiZSBhbmFseXplZC4gKi9cbiAgcmVhZG9ubHkgY3VycmVudEZpbGVQYXRoOiBzdHJpbmc7XG5cbiAgLyoqIFRvdGFsIG51bWJlciBvZiBzb3VyY2UgZmlsZXMgdGhhdCB3aWxsIGJlIGFuYWx5emVkLiAqL1xuICByZWFkb25seSB0b3RhbEZpbGVDb3VudDogbnVtYmVyO1xufVxuXG4vKipcbiAqIFdoeSBhIGZpeCBydW4gbGVmdCBhIGZpbmRpbmcgdW50b3VjaGVkOlxuICpcbiAqIC0gYGRlY29yYXRlZGAgXHUyMDE0IHRoZSBtZW1iZXIgY2FycmllcyBhIGRlY29yYXRvciwgc28gdGhlIG1vZGlmaWVyIGluc2VydGlvbiBwb2ludCBpcyBhbWJpZ3VvdXMuXG4gKiAtIGBzaGFyZWQtZXhwb3J0YCBcdTIwMTQgdGhlIGBleHBvcnRgIGtleXdvcmQgaXMgc2hhcmVkIHdpdGggYSBzdGlsbC1leHBvcnRlZCBzaWJsaW5nIGRlY2xhcmF0b3IuXG4gKiAtIGB0ZXN0LW9ubHlgIFx1MjAxNCB0aGUgZGVjbGFyYXRpb24gaXMgZXhwb3NlZCBwdXJlbHkgZm9yIHRlc3RzLCBzbyB0aWdodGVuaW5nIHdvdWxkIGJyZWFrIHRoZSB0ZXN0LlxuICovXG5leHBvcnQgdHlwZSBPdmVyRXhwb3N1cmVTa2lwUmVhc29uID0gJ2RlY29yYXRlZCcgfCAnc2hhcmVkLWV4cG9ydCcgfCAndGVzdC1vbmx5JztcblxuLyoqXG4gKiBUaGUgKHRpZ2h0ZXIpIGV4cG9zdXJlIGxldmVsIGEgZGVjbGFyYXRpb24gY291bGQgYmUgcmVkdWNlZCB0by5cbiAqL1xuZXhwb3J0IHR5cGUgU3VnZ2VzdGVkRXhwb3N1cmUgPSAnZmlsZS1sb2NhbCcgfCAncHJpdmF0ZScgfCAncHJvdGVjdGVkJztcblxuLyoqXG4gKiBMaWZlY3ljbGUgYW5kIGZyYW1ld29yayBtZW1iZXJzIGludm9rZWQgYnkgT2JzaWRpYW4gb3IgYSBiYXNlIGNsYXNzIHZpYSByZWdpc3RyYXRpb24gcmF0aGVyIHRoYW5cbiAqIGJ5IHJlZmVyZW5jZXMgdGhlIGxhbmd1YWdlIHNlcnZpY2UgY2FuIHNlZS4gVGlnaHRlbmluZyB0aGVzZSB3b3VsZCBicmVhayB0aGUgZnJhbWV3b3JrIGNvbnRyYWN0LFxuICogc28gdGhleSBhcmUgbmV2ZXIgcmVwb3J0ZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBMSUZFQ1lDTEVfQUxMT1dMSVNUOiBSZWFkb25seVNldDxzdHJpbmc+ID0gbmV3IFNldDxzdHJpbmc+KFtcbiAgJ2Rpc3BsYXknLFxuICAnaGlkZScsXG4gICdvbkV4dGVybmFsU2V0dGluZ3NDaGFuZ2UnLFxuICAnb25MYXlvdXRSZWFkeScsXG4gICdvbmxvYWQnLFxuICAnb25sb2FkSW1wbCcsXG4gICdvbkxvYWRTZXR0aW5ncycsXG4gICdvblNhdmVTZXR0aW5ncycsXG4gICdvbnVubG9hZCcsXG4gICdvbnVubG9hZEltcGwnXG5dKTtcblxuaW50ZXJmYWNlIEFuYWx5c2lzQ29udGV4dCB7XG4gIHJlYWRvbmx5IGNoZWNrZXI6IFR5cGVDaGVja2VyO1xuICByZWFkb25seSBlZGl0czogKG51bGwgfCBPdmVyRXhwb3N1cmVUZXh0RWRpdClbXTtcbiAgcmVhZG9ubHkgZmluZGluZ3M6IE92ZXJFeHBvc3VyZUZpbmRpbmdbXTtcbiAgcmVhZG9ubHkgbGFuZ3VhZ2VTZXJ2aWNlOiBMYW5ndWFnZVNlcnZpY2U7XG4gIHJlYWRvbmx5IHByb2dyYW06IFByb2dyYW07XG4gIHJlYWRvbmx5IHNob3VsZEZvcmNlOiBib29sZWFuO1xuICByZWFkb25seSBzdHJpbmdMaXRlcmFsT2NjdXJyZW5jZXNCeVRleHQ6IFJlYWRvbmx5TWFwPHN0cmluZywgcmVhZG9ubHkgU3RyaW5nTGl0ZXJhbE9jY3VycmVuY2VbXT47XG59XG5cbmludGVyZmFjZSBBbmFseXNpc1Jlc3VsdCB7XG4gIHJlYWRvbmx5IGVkaXRzOiByZWFkb25seSAobnVsbCB8IE92ZXJFeHBvc3VyZVRleHRFZGl0KVtdO1xuICByZWFkb25seSBmaW5kaW5nczogcmVhZG9ubHkgT3ZlckV4cG9zdXJlRmluZGluZ1tdO1xufVxuXG50eXBlIENsYXNzTWVtYmVyRGVjbGFyYXRpb24gPSBHZXRBY2Nlc3NvckRlY2xhcmF0aW9uIHwgTWV0aG9kRGVjbGFyYXRpb24gfCBQcm9wZXJ0eURlY2xhcmF0aW9uIHwgU2V0QWNjZXNzb3JEZWNsYXJhdGlvbjtcblxudHlwZSBFeHBvcnRhYmxlRGVjbGFyYXRpb24gPSBDbGFzc0RlY2xhcmF0aW9uIHwgRW51bURlY2xhcmF0aW9uIHwgRnVuY3Rpb25EZWNsYXJhdGlvbiB8IEludGVyZmFjZURlY2xhcmF0aW9uIHwgVHlwZUFsaWFzRGVjbGFyYXRpb24gfCBWYXJpYWJsZVN0YXRlbWVudDtcblxuaW50ZXJmYWNlIEV4cG9ydEZpbmRpbmdDYW5kaWRhdGUge1xuICByZWFkb25seSBmaW5kaW5nOiBPdmVyRXhwb3N1cmVGaW5kaW5nO1xuICByZWFkb25seSBpc1BsYWluRmlsZUxvY2FsOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgRmluZGluZ0ZsYWdzIHtcbiAgcmVhZG9ubHkgaGFzTm9SZWZlcmVuY2VzOiBib29sZWFuO1xuICByZWFkb25seSBpc0ZvcmNlZEJ5VGVzdE9ubHk6IGJvb2xlYW47XG59XG5cbnR5cGUgTWVtYmVyRXhwb3N1cmUgPSAncHJpdmF0ZScgfCAncHJvdGVjdGVkJyB8ICdwdWJsaWMnO1xuXG4vKipcbiAqIEEgc2luZ2xlIGluLXBsYWNlIHRleHQgcmVwbGFjZW1lbnQgdGhhdCB0aWdodGVucyBhIGRlY2xhcmF0aW9uJ3MgZXhwb3N1cmUuIEEgemVyby1sZW5ndGggZWRpdCBpc1xuICogYW4gaW5zZXJ0aW9uIChlLmcuIGFkZGluZyBhbiBleHBsaWNpdCBgcHJpdmF0ZWAgbW9kaWZpZXIgdG8gYW4gaW1wbGljaXRseS1gcHVibGljYCBtZW1iZXIpLlxuICovXG5pbnRlcmZhY2UgT3ZlckV4cG9zdXJlVGV4dEVkaXQge1xuICByZWFkb25seSBmaWxlTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBsZW5ndGg6IG51bWJlcjtcbiAgcmVhZG9ubHkgbmV3VGV4dDogc3RyaW5nO1xuICByZWFkb25seSBzdGFydDogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgUmVmZXJlbmNlTG9jYXRpb24ge1xuICByZWFkb25seSBmaWxlTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBzdGFydDogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgU291cmNlRmlsZVRleHQge1xuICByZWFkb25seSBmaWxlTmFtZTogc3RyaW5nO1xuICByZWFkb25seSB0ZXh0OiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBTdHJpbmdMaXRlcmFsT2NjdXJyZW5jZSB7XG4gIHJlYWRvbmx5IG5vZGU6IFN0cmluZ0xpdGVyYWxMaWtlO1xuICByZWFkb25seSBzb3VyY2VGaWxlOiBTb3VyY2VGaWxlO1xufVxuXG4vLyBBIEpTRG9jL1RTRG9jIGNvbW1lbnQgb3BlbnMgd2l0aCBgLyoqYDogdGhlIGNoYXJhY3RlciBhdCBvZmZzZXQgMiBpcyB0aGUgc2Vjb25kIGAqYCwgYW5kIHRvIGV4Y2x1ZGUgdGhlIGVtcHR5IGAvKiovYCBjb21tZW50IHRoZSBjaGFyYWN0ZXIgYXQgb2Zmc2V0IDMgbXVzdCBub3QgYmUgdGhlIGNsb3NpbmcgYC9gLlxuY29uc3QgSlNET0NfU0VDT05EX0FTVEVSSVNLX09GRlNFVCA9IDI7XG5jb25zdCBKU0RPQ19GT1VSVEhfQ0hBUkFDVEVSX09GRlNFVCA9IDM7XG5jb25zdCBNRU1CRVJfRVhQT1NVUkVfT1JERVI6IHJlYWRvbmx5IE1lbWJlckV4cG9zdXJlW10gPSBbJ3ByaXZhdGUnLCAncHJvdGVjdGVkJywgJ3B1YmxpYyddO1xuY29uc3QgU0NPUEVfREVTQ1JJUFRJT046IFJlY29yZDxTdWdnZXN0ZWRFeHBvc3VyZSwgc3RyaW5nPiA9IHtcbiAgJ2ZpbGUtbG9jYWwnOiAnd2l0aGluIGl0cyBvd24gZmlsZScsXG4gICdwcml2YXRlJzogJ2luc2lkZSBpdHMgb3duIGNsYXNzJyxcbiAgJ3Byb3RlY3RlZCc6ICdpbnNpZGUgaXRzIGNsYXNzICsgc3ViY2xhc3Nlcydcbn07XG5jb25zdCBTS0lQX1JFQVNPTl9ERVNDUklQVElPTjogUmVjb3JkPE92ZXJFeHBvc3VyZVNraXBSZWFzb24sIHN0cmluZz4gPSB7XG4gICdkZWNvcmF0ZWQnOiAnZGVjb3JhdGVkIG1lbWJlcicsXG4gICdzaGFyZWQtZXhwb3J0JzogJ2V4cG9ydCBzaGFyZWQgd2l0aCBhIHN0aWxsLWV4cG9ydGVkIHNpYmxpbmcnLFxuICAndGVzdC1vbmx5JzogJ2V4cG9zZWQgb25seSBmb3IgdGVzdHMnXG59O1xuY29uc3QgVklTSUJJTElUWV9NT0RJRklFUl9LSU5EUzogUmVhZG9ubHlTZXQ8U3ludGF4S2luZD4gPSBuZXcgU2V0PFN5bnRheEtpbmQ+KFtTeW50YXhLaW5kLlByaXZhdGVLZXl3b3JkLCBTeW50YXhLaW5kLlByb3RlY3RlZEtleXdvcmQsIFN5bnRheEtpbmQuUHVibGljS2V5d29yZF0pO1xuY29uc3QgV0hJVEVTUEFDRV9QQVRURVJOID0gL1xccy87XG5cbi8qKlxuICogQW5hbHl6ZXMgYSBwcm9qZWN0IChhbHJlYWR5IGxvYWRlZCBpbnRvIGEgbGFuZ3VhZ2Ugc2VydmljZSkgZm9yIG92ZXItZXhwb3NlZCBkZWNsYXJhdGlvbnMsIGFuZCBcdTIwMTRcbiAqIHdoZW4ge0BsaW5rIEFuYWx5emVPdmVyRXhwb3N1cmVQYXJhbXMuc2hvdWxkRml4fSBpcyBzZXQgXHUyMDE0IHRpZ2h0ZW5zIGV2ZXJ5IGZpeGFibGUgZmluZGluZyBpbiBwbGFjZVxuICogdmlhIHtAbGluayBBbmFseXplT3ZlckV4cG9zdXJlUGFyYW1zLndyaXRlRmlsZX0uIEZpbmRpbmdzIHRoYXQgY2Fubm90IGJlIHNhZmVseSBhdXRvbWF0ZWQgKGV4cG9zZWRcbiAqIG9ubHkgZm9yIHRlc3RzLCBkZWNvcmF0ZWQsIG9yIHNoYXJpbmcgYW4gYGV4cG9ydGAga2V5d29yZCB3aXRoIGEgc3RpbGwtZXhwb3J0ZWQgc2libGluZykgY2FycnkgYVxuICoge0BsaW5rIE92ZXJFeHBvc3VyZUZpbmRpbmcuc2tpcFJlYXNvbn0gYW5kIGFyZSBsZWZ0IHVudG91Y2hlZCBcdTIwMTQgdW5sZXNzXG4gKiB7QGxpbmsgQW5hbHl6ZU92ZXJFeHBvc3VyZVBhcmFtcy5zaG91bGRGb3JjZX0gaXMgc2V0LCB3aGljaCBhZGRpdGlvbmFsbHkgdGlnaHRlbnMgdGhlIHRlc3Qtb25seVxuICogZmluZGluZ3MgKGRlY29yYXRlZCBhbmQgc2hhcmVkLWV4cG9ydCBvbmVzIHN0aWxsIHN0YXkgc2tpcHBlZCkuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSB7QGxpbmsgQW5hbHl6ZU92ZXJFeHBvc3VyZVBhcmFtc30uXG4gKiBAcmV0dXJucyBUaGUgb3Zlci1leHBvc2VkIGRlY2xhcmF0aW9ucywgaW4gZGlzY292ZXJ5IG9yZGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYW5hbHl6ZU92ZXJFeHBvc3VyZShwYXJhbXM6IEFuYWx5emVPdmVyRXhwb3N1cmVQYXJhbXMpOiBPdmVyRXhwb3N1cmVGaW5kaW5nW10ge1xuICBjb25zdCByZXN1bHQgPSBydW5PdmVyRXhwb3N1cmVBbmFseXNpcyhwYXJhbXMpO1xuICBpZiAoIXBhcmFtcy5zaG91bGRGaXgpIHtcbiAgICByZXR1cm4gWy4uLnJlc3VsdC5maW5kaW5nc107XG4gIH1cblxuICBjb25zdCB7IHdyaXRlRmlsZSB9ID0gcGFyYW1zO1xuICBhc3NlcnROb25OdWxsYWJsZSh3cml0ZUZpbGUsICd3cml0ZUZpbGUgaXMgcmVxdWlyZWQgd2hlbiBzaG91bGRGaXggaXMgdHJ1ZS4nKTtcbiAgcmV0dXJuIGFwcGx5T3ZlckV4cG9zdXJlRml4ZXMocmVzdWx0LCBwYXJhbXMubGFuZ3VhZ2VTZXJ2aWNlLmdldFByb2dyYW0oKSwgd3JpdGVGaWxlLCBwYXJhbXMuc2hvdWxkRm9yY2UgPz8gZmFsc2UpO1xufVxuXG4vKipcbiAqIEJ1aWxkcyBhIHtAbGluayBMYW5ndWFnZVNlcnZpY2VIb3N0fSBiYWNrZWQgYnkgYW4gZXhwbGljaXQgZmlsZSBsaXN0IGFuZCBmaWxlIHN5c3RlbS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBDcmVhdGVMYW5ndWFnZVNlcnZpY2VIb3N0UGFyYW1zfS5cbiAqIEByZXR1cm5zIFRoZSBsYW5ndWFnZS1zZXJ2aWNlIGhvc3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVMYW5ndWFnZVNlcnZpY2VIb3N0KHBhcmFtczogQ3JlYXRlTGFuZ3VhZ2VTZXJ2aWNlSG9zdFBhcmFtcyk6IExhbmd1YWdlU2VydmljZUhvc3Qge1xuICBjb25zdCB7IGNvbXBpbGVyT3B0aW9ucywgZmlsZU5hbWVzLCBmaWxlU3lzdGVtIH0gPSBwYXJhbXM7XG4gIHJldHVybiB7XG4gICAgZGlyZWN0b3J5RXhpc3RzOiAoZGlyZWN0b3J5KSA9PiBmaWxlU3lzdGVtLmRpcmVjdG9yeUV4aXN0cyhkaXJlY3RvcnkpLFxuICAgIGZpbGVFeGlzdHM6IChmaWxlKSA9PiBmaWxlU3lzdGVtLmZpbGVFeGlzdHMoZmlsZSksXG4gICAgZ2V0Q29tcGlsYXRpb25TZXR0aW5nczogKCkgPT4gY29tcGlsZXJPcHRpb25zLFxuICAgIGdldEN1cnJlbnREaXJlY3Rvcnk6ICgpID0+IGZpbGVTeXN0ZW0uZ2V0Q3VycmVudERpcmVjdG9yeSgpLFxuICAgIGdldERlZmF1bHRMaWJGaWxlTmFtZTogKGxpYk9wdGlvbnMpID0+IGdldERlZmF1bHRMaWJGaWxlUGF0aChsaWJPcHRpb25zKSxcbiAgICBnZXREaXJlY3RvcmllczogKGRpcmVjdG9yeSkgPT4gZmlsZVN5c3RlbS5nZXREaXJlY3RvcmllcyhkaXJlY3RvcnkpLFxuICAgIGdldFNjcmlwdEZpbGVOYW1lczogKCkgPT4gWy4uLmZpbGVOYW1lc10sXG4gICAgZ2V0U2NyaXB0U25hcHNob3Q6IChmaWxlTmFtZSk6IElTY3JpcHRTbmFwc2hvdCB8IHVuZGVmaW5lZCA9PiB7XG4gICAgICBjb25zdCB0ZXh0ID0gZmlsZVN5c3RlbS5yZWFkRmlsZShmaWxlTmFtZSk7XG4gICAgICByZXR1cm4gdGV4dCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogU2NyaXB0U25hcHNob3QuZnJvbVN0cmluZyh0ZXh0KTtcbiAgICB9LFxuICAgIGdldFNjcmlwdFZlcnNpb246ICgpID0+ICcwJyxcbiAgICByZWFkRGlyZWN0b3J5OiAocGF0aCwgZXh0ZW5zaW9ucywgZXhjbHVkZSwgaW5jbHVkZSwgZGVwdGgpID0+IGZpbGVTeXN0ZW0ucmVhZERpcmVjdG9yeShwYXRoLCBleHRlbnNpb25zLCBleGNsdWRlLCBpbmNsdWRlLCBkZXB0aCksXG4gICAgcmVhZEZpbGU6IChmaWxlKSA9PiBmaWxlU3lzdGVtLnJlYWRGaWxlKGZpbGUpXG4gIH07XG59XG5cbi8qKlxuICogQnVpbGRzIGEgbGFuZ3VhZ2Ugc2VydmljZSBvdmVyIGV2ZXJ5IGZpbGUgaW4gYSBwcm9qZWN0J3MgYHRzY29uZmlnLmpzb25gLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIENyZWF0ZVByb2plY3RMYW5ndWFnZVNlcnZpY2VQYXJhbXN9LlxuICogQHJldHVybnMgQSBsYW5ndWFnZSBzZXJ2aWNlIHJlYWR5IGZvciB7QGxpbmsgYW5hbHl6ZU92ZXJFeHBvc3VyZX0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQcm9qZWN0TGFuZ3VhZ2VTZXJ2aWNlKHBhcmFtczogQ3JlYXRlUHJvamVjdExhbmd1YWdlU2VydmljZVBhcmFtcyk6IExhbmd1YWdlU2VydmljZSB7XG4gIGNvbnN0IHsgZmlsZU5hbWVzLCBvcHRpb25zIH0gPSBwYXJzZVRzQ29uZmlnKHBhcmFtcy50c0NvbmZpZ1BhdGgpO1xuICByZXR1cm4gY3JlYXRlTGFuZ3VhZ2VTZXJ2aWNlKGNyZWF0ZUxhbmd1YWdlU2VydmljZUhvc3QoeyBjb21waWxlck9wdGlvbnM6IG9wdGlvbnMsIGZpbGVOYW1lcywgZmlsZVN5c3RlbTogc3lzIH0pLCBjcmVhdGVEb2N1bWVudFJlZ2lzdHJ5KCkpO1xufVxuXG4vKipcbiAqIEZpbmRzIG92ZXItZXhwb3NlZCBkZWNsYXJhdGlvbnMgaW4gYSBwcm9qZWN0IG9uIGRpc2suIFdoZW5cbiAqIHtAbGluayBGaW5kT3ZlckV4cG9zdXJlUGFyYW1zLnNob3VsZEZpeH0gaXMgc2V0LCBlYWNoIGZpeGFibGUgZmluZGluZyBpcyBhbHNvIHRpZ2h0ZW5lZCBpbiBwbGFjZVxuICogKHJld3JpdGluZyB0aGUgYWZmZWN0ZWQgc291cmNlIGZpbGVzIHZpYSBgdHlwZXNjcmlwdGAncyBgc3lzLndyaXRlRmlsZWApLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIEZpbmRPdmVyRXhwb3N1cmVQYXJhbXN9LlxuICogQHJldHVybnMgVGhlIG92ZXItZXhwb3NlZCBkZWNsYXJhdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kT3ZlckV4cG9zdXJlKHBhcmFtczogRmluZE92ZXJFeHBvc3VyZVBhcmFtcyk6IE92ZXJFeHBvc3VyZUZpbmRpbmdbXSB7XG4gIGNvbnN0IHByb2plY3RGb2xkZXIgPSB0b0Nhbm9uaWNhbChwYXJhbXMucHJvamVjdEZvbGRlcik7XG4gIGNvbnN0IGxhbmd1YWdlU2VydmljZSA9IGNyZWF0ZVByb2plY3RMYW5ndWFnZVNlcnZpY2UoeyB0c0NvbmZpZ1BhdGg6IGAke3Byb2plY3RGb2xkZXJ9L3RzY29uZmlnLmpzb25gIH0pO1xuICByZXR1cm4gYW5hbHl6ZU92ZXJFeHBvc3VyZSh7XG4gICAgbGFuZ3VhZ2VTZXJ2aWNlLFxuICAgIHNob3VsZEZpeDogcGFyYW1zLnNob3VsZEZpeCxcbiAgICBzaG91bGRGb3JjZTogcGFyYW1zLnNob3VsZEZvcmNlLFxuICAgIHNyY0ZvbGRlcjogYCR7cHJvamVjdEZvbGRlcn0vc3JjYCxcbiAgICB3cml0ZUZpbGU6IChwYXRoLCBjb250ZW50KSA9PiB7XG4gICAgICBzeXMud3JpdGVGaWxlKHBhdGgsIGNvbnRlbnQpO1xuICAgIH0sXG4gICAgLi4ucGFyYW1zLm9uUHJvZ3Jlc3MgPyB7IG9uUHJvZ3Jlc3M6IHBhcmFtcy5vblByb2dyZXNzIH0gOiB7fVxuICB9KTtcbn1cblxuLyoqXG4gKiBGb3JtYXRzIG92ZXItZXhwb3N1cmUgZmluZGluZ3MgYXMgYSBodW1hbi1yZWFkYWJsZSByZXBvcnQsIHVzaW5nIHRoZSBncm91cGVkIGxheW91dCBvZiBFU0xpbnQnc1xuICogYHN0eWxpc2hgIGZvcm1hdHRlci4gRmluZGluZ3MgYXJlIGdyb3VwZWQgYnkgZmlsZSBhbmQgc29ydGVkIGJ5IGxpbmU6IGVhY2ggZmlsZSBpcyByZW5kZXJlZCBhcyBhXG4gKiBgcGF0aGAgaGVhZGVyIGxpbmUsIGZvbGxvd2VkIGJ5IG9uZSBpbmRlbnRlZCBgICBsaW5lOmNvbHVtbiAgY2hhbmdlIC0tIHJlYXNvbmAgcm93IHBlciBmaW5kaW5nICh0aGVcbiAqIGBsaW5lOmNvbHVtbmAgaXMgcmlnaHQtcGFkZGVkIHNvIHRoZSByb3dzIGFsaWduIHdpdGhpbiBhIGZpbGUpLiBUZXJtaW5hbHMgc3VjaCBhcyBWUyBDb2RlIHJlbmRlclxuICogZWFjaCBpbmRlbnRlZCBgbGluZTpjb2x1bW5gIGFzIGEgY2xpY2thYmxlIGxpbmsgXHUyMDE0IHJlc29sdmVkIGFnYWluc3QgdGhlIGZpbGUgaGVhZGVyIGFib3ZlIGl0IFx1MjAxNCB0aGF0XG4gKiBqdW1wcyBzdHJhaWdodCB0byB0aGUgZGVjbGFyYXRpb24uIEZpbGUgZ3JvdXBzIGFyZSBzZXBhcmF0ZWQgYnkgYSBibGFuayBsaW5lLiBJbiBhIGZpeCBydW4gKGZpbmRpbmdzXG4gKiBjYXJyeWluZyB7QGxpbmsgT3ZlckV4cG9zdXJlRmluZGluZy53YXNGaXhlZH0gLyB7QGxpbmsgT3ZlckV4cG9zdXJlRmluZGluZy5za2lwUmVhc29ufSkgZWFjaCBjaGFuZ2VcbiAqIHJvdyBpcyBzdWZmaXhlZCB3aXRoIGBbZml4ZWRdYCBvciBgW3NraXBwZWQ6IFx1MjAyNl1gLCBhbmQgdGhlIHRyYWlsaW5nIHN1bW1hcnkgYXBwZW5kcyB0aGUgZml4ZWQvc2tpcHBlZFxuICogY291bnRzLlxuICpcbiAqIEBwYXJhbSBmaW5kaW5ncyAtIFRoZSBmaW5kaW5ncyB0byBmb3JtYXQuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSB7QGxpbmsgRm9ybWF0T3ZlckV4cG9zdXJlRmluZGluZ3NPcHRpb25zfS5cbiAqIEByZXR1cm5zIFRoZSByZXBvcnQgdGV4dC4gRW1wdHktZmluZGluZyBpbnB1dCB5aWVsZHMgYSBzaW5nbGUgXCJubyBmaW5kaW5nc1wiIGxpbmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRPdmVyRXhwb3N1cmVGaW5kaW5ncyhmaW5kaW5nczogcmVhZG9ubHkgT3ZlckV4cG9zdXJlRmluZGluZ1tdLCBvcHRpb25zPzogRm9ybWF0T3ZlckV4cG9zdXJlRmluZGluZ3NPcHRpb25zKTogc3RyaW5nIHtcbiAgaWYgKGZpbmRpbmdzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiAnTm8gb3Zlci1leHBvc2VkIGRlY2xhcmF0aW9ucyBmb3VuZC5cXG4nO1xuICB9XG5cbiAgY29uc3QgYmFzZUZvbGRlciA9IG9wdGlvbnM/LmJhc2VGb2xkZXIgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHRvQ2Fub25pY2FsKG9wdGlvbnMuYmFzZUZvbGRlcik7XG4gIGNvbnN0IGxpbmVzID0gZm9ybWF0RmluZGluZ0Jsb2NrcyhmaW5kaW5ncywgYmFzZUZvbGRlcik7XG4gIGxpbmVzLnB1c2goZm9ybWF0U3VtbWFyeShmaW5kaW5ncykpO1xuICByZXR1cm4gYCR7bGluZXMuam9pbignXFxuJyl9XFxuYDtcbn1cblxuZnVuY3Rpb24gYW5hbHl6ZUV4cG9ydChub2RlOiBOb2RlLCBjb250ZXh0OiBBbmFseXNpc0NvbnRleHQpOiB2b2lkIHtcbiAgY29uc3Qgc291cmNlRmlsZSA9IG5vZGUuZ2V0U291cmNlRmlsZSgpO1xuICBpZiAobm9kZS5wYXJlbnQgIT09IHNvdXJjZUZpbGUgfHwgIWdldE1vZGlmaWVyS2luZHMobm9kZSkuaGFzKFN5bnRheEtpbmQuRXhwb3J0S2V5d29yZCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBkZWNsYXJhdGlvbiA9IGFzRXhwb3J0YWJsZURlY2xhcmF0aW9uKG5vZGUpO1xuICBpZiAoIWRlY2xhcmF0aW9uKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGhhc1RzRG9jQ29tbWVudChkZWNsYXJhdGlvbikpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBkZWNsRmlsZVBhdGggPSB0b0Nhbm9uaWNhbChzb3VyY2VGaWxlLmZpbGVOYW1lKTtcbiAgY29uc3QgbmFtZU5vZGVzID0gZ2V0RXhwb3J0ZWROYW1lTm9kZXMoZGVjbGFyYXRpb24pO1xuICBjb25zdCBjYW5kaWRhdGVzOiBFeHBvcnRGaW5kaW5nQ2FuZGlkYXRlW10gPSBbXTtcbiAgZm9yIChjb25zdCBuYW1lTm9kZSBvZiBuYW1lTm9kZXMpIHtcbiAgICBjb25zdCByZWZlcmVuY2VzID0gY29sbGVjdFJlZmVyZW5jZXMoY29udGV4dC5sYW5ndWFnZVNlcnZpY2UuZmluZFJlZmVyZW5jZXMoc291cmNlRmlsZS5maWxlTmFtZSwgbmFtZU5vZGUuZ2V0U3RhcnQoKSkpXG4gICAgICAuZmlsdGVyKChyZWZlcmVuY2UpID0+ICFpc0RlY2xhcmF0aW9uSXRzZWxmKHJlZmVyZW5jZSwgbmFtZU5vZGUpKTtcbiAgICBjb25zdCBvdGhlckZpbGVSZWZlcmVuY2VzID0gcmVmZXJlbmNlcy5maWx0ZXIoKHJlZmVyZW5jZSkgPT4gdG9DYW5vbmljYWwocmVmZXJlbmNlLmZpbGVOYW1lKSAhPT0gZGVjbEZpbGVQYXRoKTtcblxuICAgIGlmIChvdGhlckZpbGVSZWZlcmVuY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY2FuZGlkYXRlcy5wdXNoKHtcbiAgICAgICAgZmluZGluZzogYnVpbGRGaW5kaW5nKGRlY2xhcmF0aW9uLCBuYW1lTm9kZSwgJ2V4cG9ydCcsICdmaWxlLWxvY2FsJywgeyBoYXNOb1JlZmVyZW5jZXM6IHJlZmVyZW5jZXMubGVuZ3RoID09PSAwLCBpc0ZvcmNlZEJ5VGVzdE9ubHk6IGZhbHNlIH0pLFxuICAgICAgICBpc1BsYWluRmlsZUxvY2FsOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IG5vblRlc3RSZWZlcmVuY2VzID0gb3RoZXJGaWxlUmVmZXJlbmNlcy5maWx0ZXIoKHJlZmVyZW5jZSkgPT4gIWlzVGVzdEZpbGUodG9DYW5vbmljYWwocmVmZXJlbmNlLmZpbGVOYW1lKSkpO1xuICAgIGlmIChub25UZXN0UmVmZXJlbmNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNhbmRpZGF0ZXMucHVzaCh7XG4gICAgICAgIGZpbmRpbmc6IGJ1aWxkRmluZGluZyhkZWNsYXJhdGlvbiwgbmFtZU5vZGUsICdleHBvcnQnLCAnZmlsZS1sb2NhbCcsIHsgaGFzTm9SZWZlcmVuY2VzOiBmYWxzZSwgaXNGb3JjZWRCeVRlc3RPbmx5OiB0cnVlIH0pLFxuICAgICAgICBpc1BsYWluRmlsZUxvY2FsOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNhbmRpZGF0ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgY2FuRHJvcEV4cG9ydCA9IGNhbmRpZGF0ZXMubGVuZ3RoID09PSBuYW1lTm9kZXMubGVuZ3RoICYmIGNhbmRpZGF0ZXMuZXZlcnkoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLmlzUGxhaW5GaWxlTG9jYWwgfHwgY29udGV4dC5zaG91bGRGb3JjZSk7XG4gIGNvbnN0IGV4cG9ydEVkaXQgPSBjYW5Ecm9wRXhwb3J0ID8gY29tcHV0ZUV4cG9ydFJlbW92YWxFZGl0KGRlY2xhcmF0aW9uKSA6IG51bGw7XG4gIGZvciAoY29uc3QgY2FuZGlkYXRlIG9mIGNhbmRpZGF0ZXMpIHtcbiAgICByZWNvcmQoY29udGV4dCwgY2FuZGlkYXRlLmZpbmRpbmcsIGV4cG9ydEVkaXQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGFuYWx5emVNZW1iZXIobm9kZTogTm9kZSwgY29udGV4dDogQW5hbHlzaXNDb250ZXh0KTogdm9pZCB7XG4gIGNvbnN0IG1lbWJlciA9IGFzQ2xhc3NNZW1iZXIobm9kZSk7XG4gIGlmICghbWVtYmVyIHx8ICFpc0NsYXNzTGlrZShub2RlLnBhcmVudCkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgbmFtZU5vZGUgPSBtZW1iZXIubmFtZTtcbiAgY29uc3QgZGVjbGFyaW5nQ2xhc3MgPSBub2RlLnBhcmVudDtcblxuICBpZiAoaXNQcml2YXRlSWRlbnRpZmllcihuYW1lTm9kZSkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBtb2RpZmllcktpbmRzID0gZ2V0TW9kaWZpZXJLaW5kcyhtZW1iZXIpO1xuICBpZiAobW9kaWZpZXJLaW5kcy5oYXMoU3ludGF4S2luZC5TdGF0aWNLZXl3b3JkKSB8fCBtb2RpZmllcktpbmRzLmhhcyhTeW50YXhLaW5kLk92ZXJyaWRlS2V5d29yZCkgfHwgTElGRUNZQ0xFX0FMTE9XTElTVC5oYXMobmFtZU5vZGUuZ2V0VGV4dCgpKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChoYXNUc0RvY0NvbW1lbnQobWVtYmVyKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGN1cnJlbnRFeHBvc3VyZSA9IGdldEN1cnJlbnRNZW1iZXJFeHBvc3VyZShtb2RpZmllcktpbmRzKTtcbiAgaWYgKGN1cnJlbnRFeHBvc3VyZSA9PT0gJ3ByaXZhdGUnKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgc291cmNlRmlsZSA9IG1lbWJlci5nZXRTb3VyY2VGaWxlKCk7XG4gIGNvbnN0IGRpcmVjdFJlZmVyZW5jZXMgPSBjb2xsZWN0UmVmZXJlbmNlcyhjb250ZXh0Lmxhbmd1YWdlU2VydmljZS5maW5kUmVmZXJlbmNlcyhzb3VyY2VGaWxlLmZpbGVOYW1lLCBuYW1lTm9kZS5nZXRTdGFydCgpKSlcbiAgICAuZmlsdGVyKChyZWZlcmVuY2UpID0+ICFpc0RlY2xhcmF0aW9uSXRzZWxmKHJlZmVyZW5jZSwgbmFtZU5vZGUpKTtcbiAgY29uc3QgcmVmZXJlbmNlcyA9IFsuLi5kaXJlY3RSZWZlcmVuY2VzLCAuLi5jb2xsZWN0U3RyaW5nTGl0ZXJhbFJlZmVyZW5jZXMobmFtZU5vZGUsIGRlY2xhcmluZ0NsYXNzLCBjb250ZXh0KV07XG4gIGNvbnN0IG5vblRlc3RSZWZlcmVuY2VzID0gcmVmZXJlbmNlcy5maWx0ZXIoKHJlZmVyZW5jZSkgPT4gIWlzVGVzdEZpbGUodG9DYW5vbmljYWwocmVmZXJlbmNlLmZpbGVOYW1lKSkpO1xuXG4gIGNvbnN0IG5lZWRlZEZvclNyYyA9IGNvbXB1dGVOZWVkZWRFeHBvc3VyZShub25UZXN0UmVmZXJlbmNlcywgZGVjbGFyaW5nQ2xhc3MsIGNvbnRleHQpO1xuICBjb25zdCBuZWVkZWRXaXRoVGVzdHMgPSBjb21wdXRlTmVlZGVkRXhwb3N1cmUocmVmZXJlbmNlcywgZGVjbGFyaW5nQ2xhc3MsIGNvbnRleHQpO1xuXG4gIGlmIChuZWVkZWRGb3JTcmMgPT09ICdwdWJsaWMnKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHJhbmtFeHBvc3VyZShuZWVkZWRGb3JTcmMpID49IHJhbmtFeHBvc3VyZShjdXJyZW50RXhwb3N1cmUpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgZmluZGluZyA9IGJ1aWxkRmluZGluZyhtZW1iZXIsIG5hbWVOb2RlLCBjdXJyZW50RXhwb3N1cmUsIG5lZWRlZEZvclNyYywge1xuICAgIGhhc05vUmVmZXJlbmNlczogcmVmZXJlbmNlcy5sZW5ndGggPT09IDAsXG4gICAgaXNGb3JjZWRCeVRlc3RPbmx5OiByYW5rRXhwb3N1cmUobmVlZGVkV2l0aFRlc3RzKSA+IHJhbmtFeHBvc3VyZShuZWVkZWRGb3JTcmMpXG4gIH0pO1xuICByZWNvcmQoY29udGV4dCwgZmluZGluZywgY29tcHV0ZU1lbWJlckV4cG9zdXJlRWRpdChtZW1iZXIsIG5lZWRlZEZvclNyYykpO1xufVxuXG5mdW5jdGlvbiBhcHBseUVkaXRzKHRleHQ6IHN0cmluZywgZWRpdHM6IHJlYWRvbmx5IE92ZXJFeHBvc3VyZVRleHRFZGl0W10pOiBzdHJpbmcge1xuICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IHVuaXF1ZUVkaXRzID0gZWRpdHNcbiAgICAuZmlsdGVyKChlZGl0KSA9PiB7XG4gICAgICBjb25zdCBrZXkgPSBgJHtTdHJpbmcoZWRpdC5zdGFydCl9OiR7U3RyaW5nKGVkaXQubGVuZ3RoKX06JHtlZGl0Lm5ld1RleHR9YDtcbiAgICAgIGlmIChzZWVuLmhhcyhrZXkpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHNlZW4uYWRkKGtleSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KVxuICAgIC5zb3J0KChhLCBiKSA9PiBiLnN0YXJ0IC0gYS5zdGFydCk7XG5cbiAgbGV0IHJlc3VsdCA9IHRleHQ7XG4gIGZvciAoY29uc3QgZWRpdCBvZiB1bmlxdWVFZGl0cykge1xuICAgIHJlc3VsdCA9IGAke3Jlc3VsdC5zbGljZSgwLCBlZGl0LnN0YXJ0KX0ke2VkaXQubmV3VGV4dH0ke3Jlc3VsdC5zbGljZShlZGl0LnN0YXJ0ICsgZWRpdC5sZW5ndGgpfWA7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gYXBwbHlPdmVyRXhwb3N1cmVGaXhlcyhcbiAgcmVzdWx0OiBBbmFseXNpc1Jlc3VsdCxcbiAgcHJvZ3JhbTogUHJvZ3JhbSB8IHVuZGVmaW5lZCxcbiAgd3JpdGVGaWxlOiAodGhpczogdm9pZCwgcGF0aDogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcpID0+IHZvaWQsXG4gIHNob3VsZEZvcmNlOiBib29sZWFuXG4pOiBPdmVyRXhwb3N1cmVGaW5kaW5nW10ge1xuICBjb25zdCBlZGl0c0J5RmlsZSA9IG5ldyBNYXA8c3RyaW5nLCBPdmVyRXhwb3N1cmVUZXh0RWRpdFtdPigpO1xuICBjb25zdCBmaW5kaW5ncyA9IHJlc3VsdC5maW5kaW5ncy5tYXAoKGZpbmRpbmcsIGluZGV4KSA9PiB7XG4gICAgY29uc3QgZWRpdCA9IHJlc3VsdC5lZGl0c1tpbmRleF0gPz8gbnVsbDtcbiAgICBjb25zdCBza2lwUmVhc29uID0gZGV0ZXJtaW5lU2tpcFJlYXNvbihmaW5kaW5nLCBlZGl0LCBzaG91bGRGb3JjZSk7XG4gICAgaWYgKHNraXBSZWFzb24gIT09IG51bGwpIHtcbiAgICAgIHJldHVybiB7IC4uLmZpbmRpbmcsIHNraXBSZWFzb24sIHdhc0ZpeGVkOiBmYWxzZSB9O1xuICAgIH1cbiAgICBhc3NlcnROb25OdWxsYWJsZShlZGl0LCAnQSBmaXhhYmxlIGZpbmRpbmcgbXVzdCBjYXJyeSBhIHRleHQgZWRpdC4nKTtcbiAgICBjb25zdCBmaWxlRWRpdHMgPSBlZGl0c0J5RmlsZS5nZXQoZWRpdC5maWxlTmFtZSkgPz8gW107XG4gICAgZmlsZUVkaXRzLnB1c2goZWRpdCk7XG4gICAgZWRpdHNCeUZpbGUuc2V0KGVkaXQuZmlsZU5hbWUsIGZpbGVFZGl0cyk7XG4gICAgcmV0dXJuIHsgLi4uZmluZGluZywgc2tpcFJlYXNvbjogbnVsbCwgd2FzRml4ZWQ6IHRydWUgfTtcbiAgfSk7XG5cbiAgaWYgKGVkaXRzQnlGaWxlLnNpemUgPiAwKSB7XG4gICAgYXNzZXJ0Tm9uTnVsbGFibGUocHJvZ3JhbSwgJ0EgcHJvZ3JhbSBpcyBleHBlY3RlZCB3aGVuIHRoZXJlIGFyZSBlZGl0cyB0byBhcHBseS4nKTtcbiAgICBjb25zdCBzb3VyY2VUZXh0QnlGaWxlID0gbmV3IE1hcDxzdHJpbmcsIFNvdXJjZUZpbGVUZXh0PigpO1xuICAgIGZvciAoY29uc3Qgc291cmNlRmlsZSBvZiBwcm9ncmFtLmdldFNvdXJjZUZpbGVzKCkpIHtcbiAgICAgIHNvdXJjZVRleHRCeUZpbGUuc2V0KHRvQ2Fub25pY2FsKHNvdXJjZUZpbGUuZmlsZU5hbWUpLCB7IGZpbGVOYW1lOiBzb3VyY2VGaWxlLmZpbGVOYW1lLCB0ZXh0OiBzb3VyY2VGaWxlLnRleHQgfSk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgW2Nhbm9uaWNhbEZpbGVOYW1lLCBmaWxlRWRpdHNdIG9mIGVkaXRzQnlGaWxlKSB7XG4gICAgICBjb25zdCBzb3VyY2UgPSBzb3VyY2VUZXh0QnlGaWxlLmdldChjYW5vbmljYWxGaWxlTmFtZSk7XG4gICAgICBhc3NlcnROb25OdWxsYWJsZShzb3VyY2UsIGBTb3VyY2UgZmlsZSBub3QgZm91bmQgaW4gcHJvZ3JhbTogJHtjYW5vbmljYWxGaWxlTmFtZX1gKTtcbiAgICAgIHdyaXRlRmlsZShzb3VyY2UuZmlsZU5hbWUsIGFwcGx5RWRpdHMoc291cmNlLnRleHQsIGZpbGVFZGl0cykpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmaW5kaW5ncztcbn1cblxuZnVuY3Rpb24gYXNDbGFzc01lbWJlcihub2RlOiBOb2RlKTogQ2xhc3NNZW1iZXJEZWNsYXJhdGlvbiB8IHVuZGVmaW5lZCB7XG4gIGlmIChpc01ldGhvZERlY2xhcmF0aW9uKG5vZGUpIHx8IGlzUHJvcGVydHlEZWNsYXJhdGlvbihub2RlKSB8fCBpc0dldEFjY2Vzc29yRGVjbGFyYXRpb24obm9kZSkgfHwgaXNTZXRBY2Nlc3NvckRlY2xhcmF0aW9uKG5vZGUpKSB7XG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gYXNFeHBvcnRhYmxlRGVjbGFyYXRpb24obm9kZTogTm9kZSk6IEV4cG9ydGFibGVEZWNsYXJhdGlvbiB8IHVuZGVmaW5lZCB7XG4gIGlmIChcbiAgICBpc0Z1bmN0aW9uRGVjbGFyYXRpb24obm9kZSlcbiAgICB8fCBpc0NsYXNzRGVjbGFyYXRpb24obm9kZSlcbiAgICB8fCBpc0ludGVyZmFjZURlY2xhcmF0aW9uKG5vZGUpXG4gICAgfHwgaXNUeXBlQWxpYXNEZWNsYXJhdGlvbihub2RlKVxuICAgIHx8IGlzRW51bURlY2xhcmF0aW9uKG5vZGUpXG4gICAgfHwgaXNWYXJpYWJsZVN0YXRlbWVudChub2RlKVxuICApIHtcbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBidWlsZEZpbmRpbmcoXG4gIG5vZGU6IE5vZGUsXG4gIG5hbWVOb2RlOiBOb2RlLFxuICBjdXJyZW50RXhwb3N1cmU6IEN1cnJlbnRFeHBvc3VyZSxcbiAgc3VnZ2VzdGVkRXhwb3N1cmU6IFN1Z2dlc3RlZEV4cG9zdXJlLFxuICBmbGFnczogRmluZGluZ0ZsYWdzXG4pOiBPdmVyRXhwb3N1cmVGaW5kaW5nIHtcbiAgY29uc3Qgc291cmNlRmlsZSA9IG5vZGUuZ2V0U291cmNlRmlsZSgpO1xuICBjb25zdCB7IGNoYXJhY3RlciwgbGluZSB9ID0gc291cmNlRmlsZS5nZXRMaW5lQW5kQ2hhcmFjdGVyT2ZQb3NpdGlvbihuYW1lTm9kZS5nZXRTdGFydCgpKTtcbiAgcmV0dXJuIHtcbiAgICBjb2x1bW46IGNoYXJhY3RlciArIDEsXG4gICAgY3VycmVudEV4cG9zdXJlLFxuICAgIGZpbGVQYXRoOiB0b0Nhbm9uaWNhbChzb3VyY2VGaWxlLmZpbGVOYW1lKSxcbiAgICBoYXNOb1JlZmVyZW5jZXM6IGZsYWdzLmhhc05vUmVmZXJlbmNlcyxcbiAgICBpc0ZvcmNlZEJ5VGVzdE9ubHk6IGZsYWdzLmlzRm9yY2VkQnlUZXN0T25seSxcbiAgICBpc01lbWJlcjogY3VycmVudEV4cG9zdXJlICE9PSAnZXhwb3J0JyxcbiAgICBsaW5lOiBsaW5lICsgMSxcbiAgICBuYW1lOiBuYW1lTm9kZS5nZXRUZXh0KCksXG4gICAgc2tpcFJlYXNvbjogbnVsbCxcbiAgICBzdWdnZXN0ZWRFeHBvc3VyZSxcbiAgICB3YXNGaXhlZDogZmFsc2VcbiAgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRTdHJpbmdMaXRlcmFsSW5kZXgocHJvZ3JhbTogUHJvZ3JhbSk6IFJlYWRvbmx5TWFwPHN0cmluZywgcmVhZG9ubHkgU3RyaW5nTGl0ZXJhbE9jY3VycmVuY2VbXT4ge1xuICBjb25zdCBpbmRleCA9IG5ldyBNYXA8c3RyaW5nLCBTdHJpbmdMaXRlcmFsT2NjdXJyZW5jZVtdPigpO1xuICBmb3IgKGNvbnN0IHNvdXJjZUZpbGUgb2YgcHJvZ3JhbS5nZXRTb3VyY2VGaWxlcygpKSB7XG4gICAgaWYgKHNvdXJjZUZpbGUuaXNEZWNsYXJhdGlvbkZpbGUpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb2xsZWN0SW5Ob2RlKHNvdXJjZUZpbGUpO1xuICB9XG4gIHJldHVybiBpbmRleDtcblxuICBmdW5jdGlvbiBjb2xsZWN0SW5Ob2RlKG5vZGU6IE5vZGUpOiB2b2lkIHtcbiAgICBpZiAoaXNTdHJpbmdMaXRlcmFsTGlrZShub2RlKSkge1xuICAgICAgY29uc3Qgb2NjdXJyZW5jZXMgPSBpbmRleC5nZXQobm9kZS50ZXh0KSA/PyBbXTtcbiAgICAgIG9jY3VycmVuY2VzLnB1c2goeyBub2RlLCBzb3VyY2VGaWxlOiBub2RlLmdldFNvdXJjZUZpbGUoKSB9KTtcbiAgICAgIGluZGV4LnNldChub2RlLnRleHQsIG9jY3VycmVuY2VzKTtcbiAgICB9XG4gICAgbm9kZS5mb3JFYWNoQ2hpbGQoY29sbGVjdEluTm9kZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29sbGVjdFJlZmVyZW5jZXMocmVmZXJlbmNlZFN5bWJvbHM6IFJlZmVyZW5jZWRTeW1ib2xbXSB8IHVuZGVmaW5lZCk6IFJlZmVyZW5jZUxvY2F0aW9uW10ge1xuICBjb25zdCByZWZlcmVuY2VzOiBSZWZlcmVuY2VMb2NhdGlvbltdID0gW107XG4gIGZvciAoY29uc3QgcmVmZXJlbmNlZFN5bWJvbCBvZiByZWZlcmVuY2VkU3ltYm9scyA/PyBbXSkge1xuICAgIGZvciAoY29uc3QgcmVmZXJlbmNlIG9mIHJlZmVyZW5jZWRTeW1ib2wucmVmZXJlbmNlcykge1xuICAgICAgcmVmZXJlbmNlcy5wdXNoKHsgZmlsZU5hbWU6IHJlZmVyZW5jZS5maWxlTmFtZSwgc3RhcnQ6IHJlZmVyZW5jZS50ZXh0U3Bhbi5zdGFydCB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlZmVyZW5jZXM7XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3RTdHJpbmdMaXRlcmFsUmVmZXJlbmNlcyhuYW1lTm9kZTogTm9kZSwgZGVjbGFyaW5nQ2xhc3M6IENsYXNzTGlrZURlY2xhcmF0aW9uLCBjb250ZXh0OiBBbmFseXNpc0NvbnRleHQpOiBSZWZlcmVuY2VMb2NhdGlvbltdIHtcbiAgY29uc3Qgb2NjdXJyZW5jZXMgPSBjb250ZXh0LnN0cmluZ0xpdGVyYWxPY2N1cnJlbmNlc0J5VGV4dC5nZXQobmFtZU5vZGUuZ2V0VGV4dCgpKTtcbiAgaWYgKCFvY2N1cnJlbmNlcyB8fCBvY2N1cnJlbmNlcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBjb25zdCBrZXlTZXQgPSBnZXRDbGFzc0tleVNldChkZWNsYXJpbmdDbGFzcywgY29udGV4dC5jaGVja2VyKTtcbiAgY29uc3QgcmVmZXJlbmNlczogUmVmZXJlbmNlTG9jYXRpb25bXSA9IFtdO1xuICBmb3IgKGNvbnN0IG9jY3VycmVuY2Ugb2Ygb2NjdXJyZW5jZXMpIHtcbiAgICBpZiAoaXNLZXlSZWZlcmVuY2VUb0NsYXNzKG9jY3VycmVuY2Uubm9kZSwga2V5U2V0LCBjb250ZXh0LmNoZWNrZXIpKSB7XG4gICAgICByZWZlcmVuY2VzLnB1c2goeyBmaWxlTmFtZTogb2NjdXJyZW5jZS5zb3VyY2VGaWxlLmZpbGVOYW1lLCBzdGFydDogb2NjdXJyZW5jZS5ub2RlLmdldFN0YXJ0KCkgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZWZlcmVuY2VzO1xufVxuXG5mdW5jdGlvbiBjb21wdXRlRXhwb3J0UmVtb3ZhbEVkaXQoZGVjbGFyYXRpb246IEV4cG9ydGFibGVEZWNsYXJhdGlvbik6IE92ZXJFeHBvc3VyZVRleHRFZGl0IHtcbiAgY29uc3Qgc291cmNlRmlsZSA9IGRlY2xhcmF0aW9uLmdldFNvdXJjZUZpbGUoKTtcbiAgY29uc3QgbW9kaWZpZXJzID0gZ2V0TW9kaWZpZXJzKGRlY2xhcmF0aW9uKTtcbiAgYXNzZXJ0Tm9uTnVsbGFibGUobW9kaWZpZXJzLCAnTW9kaWZpZXJzIGV4cGVjdGVkIG9uIGFuIGV4cG9ydGVkIGRlY2xhcmF0aW9uLicpO1xuICBjb25zdCBleHBvcnRNb2RpZmllciA9IG1vZGlmaWVycy5maW5kKChtb2RpZmllcikgPT4gbW9kaWZpZXIua2luZCA9PT0gU3ludGF4S2luZC5FeHBvcnRLZXl3b3JkKTtcbiAgYXNzZXJ0Tm9uTnVsbGFibGUoZXhwb3J0TW9kaWZpZXIsICdFeHBvcnQgbW9kaWZpZXIgZXhwZWN0ZWQgb24gYW4gZXhwb3J0ZWQgZGVjbGFyYXRpb24uJyk7XG4gIGNvbnN0IHsgdGV4dCB9ID0gc291cmNlRmlsZTtcbiAgbGV0IGVuZCA9IGV4cG9ydE1vZGlmaWVyLmdldEVuZCgpO1xuICB3aGlsZSAoZW5kIDwgdGV4dC5sZW5ndGggJiYgV0hJVEVTUEFDRV9QQVRURVJOLnRlc3QodGV4dC5jaGFyQXQoZW5kKSkpIHtcbiAgICBlbmQrKztcbiAgfVxuICByZXR1cm4ge1xuICAgIGZpbGVOYW1lOiB0b0Nhbm9uaWNhbChzb3VyY2VGaWxlLmZpbGVOYW1lKSxcbiAgICBsZW5ndGg6IGVuZCAtIGV4cG9ydE1vZGlmaWVyLmdldFN0YXJ0KCksXG4gICAgbmV3VGV4dDogJycsXG4gICAgc3RhcnQ6IGV4cG9ydE1vZGlmaWVyLmdldFN0YXJ0KClcbiAgfTtcbn1cblxuZnVuY3Rpb24gY29tcHV0ZU1lbWJlckV4cG9zdXJlRWRpdChtZW1iZXI6IENsYXNzTWVtYmVyRGVjbGFyYXRpb24sIHN1Z2dlc3RlZEV4cG9zdXJlOiAncHJpdmF0ZScgfCAncHJvdGVjdGVkJyk6IG51bGwgfCBPdmVyRXhwb3N1cmVUZXh0RWRpdCB7XG4gIGlmICgoZ2V0RGVjb3JhdG9ycyhtZW1iZXIpID8/IFtdKS5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBzb3VyY2VGaWxlID0gbWVtYmVyLmdldFNvdXJjZUZpbGUoKTtcbiAgY29uc3QgZmlsZU5hbWUgPSB0b0Nhbm9uaWNhbChzb3VyY2VGaWxlLmZpbGVOYW1lKTtcbiAgY29uc3QgbW9kaWZpZXJzID0gZ2V0TW9kaWZpZXJzKG1lbWJlcikgPz8gW107XG4gIGNvbnN0IHZpc2liaWxpdHlNb2RpZmllciA9IG1vZGlmaWVycy5maW5kKChtb2RpZmllcikgPT4gVklTSUJJTElUWV9NT0RJRklFUl9LSU5EUy5oYXMobW9kaWZpZXIua2luZCkpO1xuICBpZiAodmlzaWJpbGl0eU1vZGlmaWVyKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZpbGVOYW1lLFxuICAgICAgbGVuZ3RoOiB2aXNpYmlsaXR5TW9kaWZpZXIuZ2V0RW5kKCkgLSB2aXNpYmlsaXR5TW9kaWZpZXIuZ2V0U3RhcnQoKSxcbiAgICAgIG5ld1RleHQ6IHN1Z2dlc3RlZEV4cG9zdXJlLFxuICAgICAgc3RhcnQ6IHZpc2liaWxpdHlNb2RpZmllci5nZXRTdGFydCgpXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IGZpcnN0TW9kaWZpZXIgPSBtb2RpZmllcnNbMF07XG4gIGNvbnN0IGluc2VydFN0YXJ0ID0gZmlyc3RNb2RpZmllciA/IGZpcnN0TW9kaWZpZXIuZ2V0U3RhcnQoKSA6IG1lbWJlci5nZXRTdGFydCgpO1xuICByZXR1cm4ge1xuICAgIGZpbGVOYW1lLFxuICAgIGxlbmd0aDogMCxcbiAgICBuZXdUZXh0OiBgJHtzdWdnZXN0ZWRFeHBvc3VyZX0gYCxcbiAgICBzdGFydDogaW5zZXJ0U3RhcnRcbiAgfTtcbn1cblxuZnVuY3Rpb24gY29tcHV0ZU5lZWRlZEV4cG9zdXJlKFxuICByZWZlcmVuY2VzOiByZWFkb25seSBSZWZlcmVuY2VMb2NhdGlvbltdLFxuICBkZWNsYXJpbmdDbGFzczogQ2xhc3NMaWtlRGVjbGFyYXRpb24sXG4gIGNvbnRleHQ6IEFuYWx5c2lzQ29udGV4dFxuKTogTWVtYmVyRXhwb3N1cmUge1xuICBpZiAocmVmZXJlbmNlcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gJ3ByaXZhdGUnO1xuICB9XG5cbiAgbGV0IG5lZWRlZDogTWVtYmVyRXhwb3N1cmUgPSAncHJpdmF0ZSc7XG4gIGZvciAoY29uc3QgcmVmZXJlbmNlIG9mIHJlZmVyZW5jZXMpIHtcbiAgICBjb25zdCByZWZlcmVuY2VDbGFzcyA9IGdldENsYXNzQXRQb3NpdGlvbihjb250ZXh0LnByb2dyYW0sIHJlZmVyZW5jZS5maWxlTmFtZSwgcmVmZXJlbmNlLnN0YXJ0KTtcbiAgICBpZiAocmVmZXJlbmNlQ2xhc3MgPT09IGRlY2xhcmluZ0NsYXNzKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKHJlZmVyZW5jZUNsYXNzICYmIGlzRGVyaXZlZEZyb20ocmVmZXJlbmNlQ2xhc3MsIGRlY2xhcmluZ0NsYXNzLCBjb250ZXh0LmNoZWNrZXIpKSB7XG4gICAgICBuZWVkZWQgPSAncHJvdGVjdGVkJztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICByZXR1cm4gJ3B1YmxpYyc7XG4gIH1cbiAgcmV0dXJuIG5lZWRlZDtcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVGaXhTdGF0dXMoZmluZGluZzogT3ZlckV4cG9zdXJlRmluZGluZyk6IHN0cmluZyB7XG4gIGlmIChmaW5kaW5nLndhc0ZpeGVkKSB7XG4gICAgcmV0dXJuICcgW2ZpeGVkXSc7XG4gIH1cbiAgaWYgKGZpbmRpbmcuc2tpcFJlYXNvbiAhPT0gbnVsbCkge1xuICAgIHJldHVybiBgIFtza2lwcGVkOiAke1NLSVBfUkVBU09OX0RFU0NSSVBUSU9OW2ZpbmRpbmcuc2tpcFJlYXNvbl19XWA7XG4gIH1cbiAgcmV0dXJuICcnO1xufVxuXG5mdW5jdGlvbiBkZXNjcmliZVJlYXNvbihmaW5kaW5nOiBPdmVyRXhwb3N1cmVGaW5kaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgYmFzZSA9IGByZWZlcmVuY2VkIG9ubHkgJHtTQ09QRV9ERVNDUklQVElPTltmaW5kaW5nLnN1Z2dlc3RlZEV4cG9zdXJlXX1gO1xuICBpZiAoZmluZGluZy5pc0ZvcmNlZEJ5VGVzdE9ubHkpIHtcbiAgICByZXR1cm4gYCR7YmFzZX0gKGV4cG9zZWQgb25seSBmb3IgdGVzdHMpYDtcbiAgfVxuICBpZiAoZmluZGluZy5oYXNOb1JlZmVyZW5jZXMpIHtcbiAgICByZXR1cm4gYCR7YmFzZX0gKG5vIHJlZmVyZW5jZXMgYXQgYWxsKWA7XG4gIH1cbiAgcmV0dXJuIGJhc2U7XG59XG5cbmZ1bmN0aW9uIGRldGVybWluZVNraXBSZWFzb24oZmluZGluZzogT3ZlckV4cG9zdXJlRmluZGluZywgZWRpdDogbnVsbCB8IE92ZXJFeHBvc3VyZVRleHRFZGl0LCBzaG91bGRGb3JjZTogYm9vbGVhbik6IG51bGwgfCBPdmVyRXhwb3N1cmVTa2lwUmVhc29uIHtcbiAgaWYgKGZpbmRpbmcuaXNGb3JjZWRCeVRlc3RPbmx5ICYmICFzaG91bGRGb3JjZSkge1xuICAgIHJldHVybiAndGVzdC1vbmx5JztcbiAgfVxuICBpZiAoIWVkaXQpIHtcbiAgICByZXR1cm4gZmluZGluZy5pc01lbWJlciA/ICdkZWNvcmF0ZWQnIDogJ3NoYXJlZC1leHBvcnQnO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBmaW5kTm9kZUF0UG9zaXRpb24obm9kZTogTm9kZSwgcG9zaXRpb246IG51bWJlcik6IE5vZGUgfCB1bmRlZmluZWQge1xuICBpZiAocG9zaXRpb24gPCBub2RlLmdldFN0YXJ0KCkgfHwgcG9zaXRpb24gPj0gbm9kZS5nZXRFbmQoKSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgbGV0IHJlc3VsdDogTm9kZSA9IG5vZGU7XG4gIG5vZGUuZm9yRWFjaENoaWxkKChjaGlsZCkgPT4ge1xuICAgIGNvbnN0IGZvdW5kID0gZmluZE5vZGVBdFBvc2l0aW9uKGNoaWxkLCBwb3NpdGlvbik7XG4gICAgaWYgKGZvdW5kKSB7XG4gICAgICByZXN1bHQgPSBmb3VuZDtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBmb3JtYXRGaW5kaW5nQmxvY2tzKGZpbmRpbmdzOiByZWFkb25seSBPdmVyRXhwb3N1cmVGaW5kaW5nW10sIGJhc2VGb2xkZXI6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZ1tdIHtcbiAgY29uc3QgYnlGaWxlID0gbmV3IE1hcDxzdHJpbmcsIE92ZXJFeHBvc3VyZUZpbmRpbmdbXT4oKTtcbiAgZm9yIChjb25zdCBmaW5kaW5nIG9mIGZpbmRpbmdzKSB7XG4gICAgY29uc3QgbGlzdCA9IGJ5RmlsZS5nZXQoZmluZGluZy5maWxlUGF0aCkgPz8gW107XG4gICAgbGlzdC5wdXNoKGZpbmRpbmcpO1xuICAgIGJ5RmlsZS5zZXQoZmluZGluZy5maWxlUGF0aCwgbGlzdCk7XG4gIH1cblxuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBbZmlsZVBhdGgsIGxpc3RdIG9mIGJ5RmlsZSkge1xuICAgIGNvbnN0IHNvcnRlZCA9IFsuLi5saXN0XS5zb3J0KChhLCBiKSA9PiBhLmxpbmUgLSBiLmxpbmUpO1xuICAgIGNvbnN0IGxvY2F0aW9uV2lkdGggPSBNYXRoLm1heCguLi5zb3J0ZWQubWFwKChmaW5kaW5nKSA9PiBgJHtTdHJpbmcoZmluZGluZy5saW5lKX06JHtTdHJpbmcoZmluZGluZy5jb2x1bW4pfWAubGVuZ3RoKSk7XG4gICAgbGluZXMucHVzaCh0b0Rpc3BsYXlQYXRoKGZpbGVQYXRoLCBiYXNlRm9sZGVyKSk7XG4gICAgZm9yIChjb25zdCBmaW5kaW5nIG9mIHNvcnRlZCkge1xuICAgICAgY29uc3QgbG9jYXRpb24gPSBgJHtTdHJpbmcoZmluZGluZy5saW5lKX06JHtTdHJpbmcoZmluZGluZy5jb2x1bW4pfWAucGFkRW5kKGxvY2F0aW9uV2lkdGgpO1xuICAgICAgY29uc3QgY2hhbmdlID0gYCR7ZmluZGluZy5jdXJyZW50RXhwb3N1cmV9ICR7ZmluZGluZy5uYW1lfSAtPiAke2ZpbmRpbmcuc3VnZ2VzdGVkRXhwb3N1cmV9YDtcbiAgICAgIGxpbmVzLnB1c2goYCAgJHtsb2NhdGlvbn0gICR7Y2hhbmdlfSAtLSAke2Rlc2NyaWJlUmVhc29uKGZpbmRpbmcpfSR7ZGVzY3JpYmVGaXhTdGF0dXMoZmluZGluZyl9YCk7XG4gICAgfVxuICAgIGxpbmVzLnB1c2goJycpO1xuICB9XG4gIHJldHVybiBsaW5lcztcbn1cblxuZnVuY3Rpb24gZm9ybWF0U3VtbWFyeShmaW5kaW5nczogcmVhZG9ubHkgT3ZlckV4cG9zdXJlRmluZGluZ1tdKTogc3RyaW5nIHtcbiAgY29uc3Qgc3VtbWFyeSA9IGAke1N0cmluZyhmaW5kaW5ncy5sZW5ndGgpfSBmaW5kaW5nKHMpLmA7XG4gIGNvbnN0IGZpeGVkQ291bnQgPSBmaW5kaW5ncy5maWx0ZXIoKGZpbmRpbmcpID0+IGZpbmRpbmcud2FzRml4ZWQpLmxlbmd0aDtcbiAgY29uc3Qgc2tpcHBlZENvdW50ID0gZmluZGluZ3MuZmlsdGVyKChmaW5kaW5nKSA9PiBmaW5kaW5nLnNraXBSZWFzb24gIT09IG51bGwpLmxlbmd0aDtcbiAgaWYgKGZpeGVkQ291bnQgPT09IDAgJiYgc2tpcHBlZENvdW50ID09PSAwKSB7XG4gICAgcmV0dXJuIHN1bW1hcnk7XG4gIH1cbiAgcmV0dXJuIGAke3N1bW1hcnl9ICR7U3RyaW5nKGZpeGVkQ291bnQpfSBmaXhlZCwgJHtTdHJpbmcoc2tpcHBlZENvdW50KX0gc2tpcHBlZC5gO1xufVxuXG5mdW5jdGlvbiBnZXRDbGFzc0F0UG9zaXRpb24ocHJvZ3JhbTogUHJvZ3JhbSwgZmlsZU5hbWU6IHN0cmluZywgcG9zaXRpb246IG51bWJlcik6IENsYXNzTGlrZURlY2xhcmF0aW9uIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc291cmNlRmlsZSA9IHByb2dyYW0uZ2V0U291cmNlRmlsZShmaWxlTmFtZSk7XG4gIGFzc2VydE5vbk51bGxhYmxlKHNvdXJjZUZpbGUsIGBTb3VyY2UgZmlsZSBub3QgZm91bmQgaW4gcHJvZ3JhbTogJHtmaWxlTmFtZX1gKTtcbiAgY29uc3Qgbm9kZSA9IGZpbmROb2RlQXRQb3NpdGlvbihzb3VyY2VGaWxlLCBwb3NpdGlvbik7XG4gIGFzc2VydE5vbk51bGxhYmxlKG5vZGUsIGBObyBub2RlIGZvdW5kIGF0IHBvc2l0aW9uICR7U3RyaW5nKHBvc2l0aW9uKX0gaW4gJHtmaWxlTmFtZX1gKTtcbiAgcmV0dXJuIGdldEVuY2xvc2luZ0NsYXNzKG5vZGUpO1xufVxuXG5mdW5jdGlvbiBnZXRDbGFzc0tleVNldChkZWNsYXJpbmdDbGFzczogQ2xhc3NMaWtlRGVjbGFyYXRpb24sIGNoZWNrZXI6IFR5cGVDaGVja2VyKTogUmVhZG9ubHlTZXQ8c3RyaW5nPiB7XG4gIGNvbnN0IGNsYXNzU3ltYm9sID0gZGVjbGFyaW5nQ2xhc3MubmFtZSA/IGNoZWNrZXIuZ2V0U3ltYm9sQXRMb2NhdGlvbihkZWNsYXJpbmdDbGFzcy5uYW1lKSA6IHVuZGVmaW5lZDtcbiAgY29uc3QgY2xhc3NUeXBlID0gY2xhc3NTeW1ib2wgPyBjaGVja2VyLmdldERlY2xhcmVkVHlwZU9mU3ltYm9sKGNsYXNzU3ltYm9sKSA6IGNoZWNrZXIuZ2V0VHlwZUF0TG9jYXRpb24oZGVjbGFyaW5nQ2xhc3MpO1xuICByZXR1cm4gbmV3IFNldChjbGFzc1R5cGUuZ2V0UHJvcGVydGllcygpLm1hcCgocHJvcGVydHkpID0+IHByb3BlcnR5Lm5hbWUpKTtcbn1cblxuZnVuY3Rpb24gZ2V0Q3VycmVudE1lbWJlckV4cG9zdXJlKG1vZGlmaWVyS2luZHM6IFJlYWRvbmx5U2V0PFN5bnRheEtpbmQ+KTogTWVtYmVyRXhwb3N1cmUge1xuICBpZiAobW9kaWZpZXJLaW5kcy5oYXMoU3ludGF4S2luZC5Qcml2YXRlS2V5d29yZCkpIHtcbiAgICByZXR1cm4gJ3ByaXZhdGUnO1xuICB9XG4gIGlmIChtb2RpZmllcktpbmRzLmhhcyhTeW50YXhLaW5kLlByb3RlY3RlZEtleXdvcmQpKSB7XG4gICAgcmV0dXJuICdwcm90ZWN0ZWQnO1xuICB9XG4gIHJldHVybiAncHVibGljJztcbn1cblxuZnVuY3Rpb24gZ2V0RW5jbG9zaW5nQ2xhc3Mobm9kZTogTm9kZSk6IENsYXNzTGlrZURlY2xhcmF0aW9uIHwgdW5kZWZpbmVkIHtcbiAgbGV0IGN1cnJlbnQ6IE5vZGUgPSBub2RlO1xuICB3aGlsZSAoIWlzU291cmNlRmlsZShjdXJyZW50KSkge1xuICAgIGlmIChpc0NsYXNzTGlrZShjdXJyZW50KSkge1xuICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfVxuICAgIGN1cnJlbnQgPSBjdXJyZW50LnBhcmVudDtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBnZXRFeHBvcnRlZE5hbWVOb2RlcyhkZWNsYXJhdGlvbjogRXhwb3J0YWJsZURlY2xhcmF0aW9uKTogTm9kZVtdIHtcbiAgaWYgKGlzVmFyaWFibGVTdGF0ZW1lbnQoZGVjbGFyYXRpb24pKSB7XG4gICAgcmV0dXJuIGRlY2xhcmF0aW9uLmRlY2xhcmF0aW9uTGlzdC5kZWNsYXJhdGlvbnMubWFwKCh2YXJpYWJsZURlY2xhcmF0aW9uKSA9PiB2YXJpYWJsZURlY2xhcmF0aW9uLm5hbWUpLmZpbHRlcihpc0lkZW50aWZpZXIpO1xuICB9XG4gIHJldHVybiBkZWNsYXJhdGlvbi5uYW1lID8gW2RlY2xhcmF0aW9uLm5hbWVdIDogW107XG59XG5cbmZ1bmN0aW9uIGdldE1vZGlmaWVyS2luZHMobm9kZTogTm9kZSk6IFJlYWRvbmx5U2V0PFN5bnRheEtpbmQ+IHtcbiAgY29uc3Qga2luZHMgPSBuZXcgU2V0PFN5bnRheEtpbmQ+KCk7XG4gIGlmIChjYW5IYXZlTW9kaWZpZXJzKG5vZGUpKSB7XG4gICAgZm9yIChjb25zdCBtb2RpZmllciBvZiBnZXRNb2RpZmllcnMobm9kZSkgPz8gW10pIHtcbiAgICAgIGtpbmRzLmFkZChtb2RpZmllci5raW5kKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGtpbmRzO1xufVxuXG5mdW5jdGlvbiBnZXRTdHJpbmdMaXRlcmFsQ29uc3RpdHVlbnRzKHR5cGU6IFR5cGUpOiBudWxsIHwgc3RyaW5nW10ge1xuICBpZiAodHlwZS5pc1N0cmluZ0xpdGVyYWwoKSkge1xuICAgIHJldHVybiBbdHlwZS52YWx1ZV07XG4gIH1cbiAgaWYgKHR5cGUuaXNVbmlvbigpKSB7XG4gICAgY29uc3QgbGl0ZXJhbHM6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChjb25zdCBjb25zdGl0dWVudCBvZiB0eXBlLnR5cGVzKSB7XG4gICAgICBpZiAoIWNvbnN0aXR1ZW50LmlzU3RyaW5nTGl0ZXJhbCgpKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgbGl0ZXJhbHMucHVzaChjb25zdGl0dWVudC52YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiBsaXRlcmFscztcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gaGFzVHNEb2NDb21tZW50KG5vZGU6IE5vZGUpOiBib29sZWFuIHtcbiAgY29uc3Qgc291cmNlRmlsZSA9IG5vZGUuZ2V0U291cmNlRmlsZSgpO1xuICBjb25zdCBmdWxsVGV4dCA9IHNvdXJjZUZpbGUuZ2V0RnVsbFRleHQoKTtcbiAgY29uc3QgY29tbWVudFJhbmdlcyA9IGdldExlYWRpbmdDb21tZW50UmFuZ2VzKGZ1bGxUZXh0LCBub2RlLmdldEZ1bGxTdGFydCgpKSA/PyBbXTtcbiAgcmV0dXJuIGNvbW1lbnRSYW5nZXMuc29tZSgocmFuZ2UpID0+XG4gICAgcmFuZ2Uua2luZCA9PT0gU3ludGF4S2luZC5NdWx0aUxpbmVDb21tZW50VHJpdmlhXG4gICAgJiYgZnVsbFRleHQuY2hhckF0KHJhbmdlLnBvcyArIEpTRE9DX1NFQ09ORF9BU1RFUklTS19PRkZTRVQpID09PSAnKidcbiAgICAmJiBmdWxsVGV4dC5jaGFyQXQocmFuZ2UucG9zICsgSlNET0NfRk9VUlRIX0NIQVJBQ1RFUl9PRkZTRVQpICE9PSAnLydcbiAgKTtcbn1cblxuZnVuY3Rpb24gaXNEZWNsYXJhdGlvbkl0c2VsZihyZWZlcmVuY2U6IFJlZmVyZW5jZUxvY2F0aW9uLCBuYW1lTm9kZTogTm9kZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gdG9DYW5vbmljYWwocmVmZXJlbmNlLmZpbGVOYW1lKSA9PT0gdG9DYW5vbmljYWwobmFtZU5vZGUuZ2V0U291cmNlRmlsZSgpLmZpbGVOYW1lKSAmJiByZWZlcmVuY2Uuc3RhcnQgPT09IG5hbWVOb2RlLmdldFN0YXJ0KCk7XG59XG5cbmZ1bmN0aW9uIGlzRGVyaXZlZEZyb20oZGVyaXZlZDogQ2xhc3NMaWtlRGVjbGFyYXRpb24sIGJhc2U6IENsYXNzTGlrZURlY2xhcmF0aW9uLCBjaGVja2VyOiBUeXBlQ2hlY2tlcik6IGJvb2xlYW4ge1xuICBjb25zdCBiYXNlU3ltYm9sID0gYmFzZS5uYW1lID8gY2hlY2tlci5nZXRTeW1ib2xBdExvY2F0aW9uKGJhc2UubmFtZSkgOiB1bmRlZmluZWQ7XG4gIGlmICghYmFzZVN5bWJvbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGZvciAoY29uc3QgY2xhdXNlIG9mIGRlcml2ZWQuaGVyaXRhZ2VDbGF1c2VzID8/IFtdKSB7XG4gICAgaWYgKGNsYXVzZS50b2tlbiAhPT0gU3ludGF4S2luZC5FeHRlbmRzS2V5d29yZCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGZvciAoY29uc3QgdHlwZUV4cHJlc3Npb24gb2YgY2xhdXNlLnR5cGVzKSB7XG4gICAgICBjb25zdCBzeW1ib2wgPSBjaGVja2VyLmdldFR5cGVBdExvY2F0aW9uKHR5cGVFeHByZXNzaW9uLmV4cHJlc3Npb24pLmdldFN5bWJvbCgpO1xuICAgICAgaWYgKHN5bWJvbCA9PT0gYmFzZVN5bWJvbCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgZGVjbGFyYXRpb24gb2Ygc3ltYm9sPy5kZWNsYXJhdGlvbnMgPz8gW10pIHtcbiAgICAgICAgaWYgKGlzQ2xhc3NMaWtlKGRlY2xhcmF0aW9uKSAmJiBpc0Rlcml2ZWRGcm9tKGRlY2xhcmF0aW9uLCBiYXNlLCBjaGVja2VyKSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaXNLZXlSZWZlcmVuY2VUb0NsYXNzKG5vZGU6IFN0cmluZ0xpdGVyYWxMaWtlLCBrZXlTZXQ6IFJlYWRvbmx5U2V0PHN0cmluZz4sIGNoZWNrZXI6IFR5cGVDaGVja2VyKTogYm9vbGVhbiB7XG4gIGNvbnN0IGNvbnRleHR1YWxUeXBlID0gY2hlY2tlci5nZXRDb250ZXh0dWFsVHlwZShub2RlKTtcbiAgaWYgKCFjb250ZXh0dWFsVHlwZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBsaXRlcmFscyA9IGdldFN0cmluZ0xpdGVyYWxDb25zdGl0dWVudHMoY29udGV4dHVhbFR5cGUpO1xuICBpZiAoIWxpdGVyYWxzKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiBsaXRlcmFscy5ldmVyeSgobGl0ZXJhbCkgPT4ga2V5U2V0LmhhcyhsaXRlcmFsKSk7XG59XG5cbmZ1bmN0aW9uIGlzT3duU291cmNlRmlsZShmaWxlUGF0aDogc3RyaW5nLCBzcmNGb2xkZXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZmlsZVBhdGguc3RhcnRzV2l0aChgJHtzcmNGb2xkZXJ9L2ApICYmIGZpbGVQYXRoLmVuZHNXaXRoKCcudHMnKSAmJiAhZmlsZVBhdGguZW5kc1dpdGgoJy5kLnRzJyk7XG59XG5cbmZ1bmN0aW9uIGlzVGVzdEZpbGUoZmlsZVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZmlsZVBhdGguaW5jbHVkZXMoJy50ZXN0LicpIHx8IGZpbGVQYXRoLmluY2x1ZGVzKCcuaW50ZWdyYXRpb24uJyk7XG59XG5cbmZ1bmN0aW9uIHJhbmtFeHBvc3VyZShleHBvc3VyZTogTWVtYmVyRXhwb3N1cmUpOiBudW1iZXIge1xuICByZXR1cm4gTUVNQkVSX0VYUE9TVVJFX09SREVSLmluZGV4T2YoZXhwb3N1cmUpO1xufVxuXG5mdW5jdGlvbiByZWNvcmQoY29udGV4dDogQW5hbHlzaXNDb250ZXh0LCBmaW5kaW5nOiBPdmVyRXhwb3N1cmVGaW5kaW5nLCBlZGl0OiBudWxsIHwgT3ZlckV4cG9zdXJlVGV4dEVkaXQpOiB2b2lkIHtcbiAgY29udGV4dC5maW5kaW5ncy5wdXNoKGZpbmRpbmcpO1xuICBjb250ZXh0LmVkaXRzLnB1c2goZWRpdCk7XG59XG5cbmZ1bmN0aW9uIHJ1bk92ZXJFeHBvc3VyZUFuYWx5c2lzKHBhcmFtczogQW5hbHl6ZU92ZXJFeHBvc3VyZVBhcmFtcyk6IEFuYWx5c2lzUmVzdWx0IHtcbiAgY29uc3QgeyBsYW5ndWFnZVNlcnZpY2UsIG9uUHJvZ3Jlc3MsIHNyY0ZvbGRlciB9ID0gcGFyYW1zO1xuICBjb25zdCBwcm9ncmFtID0gbGFuZ3VhZ2VTZXJ2aWNlLmdldFByb2dyYW0oKTtcbiAgaWYgKCFwcm9ncmFtKSB7XG4gICAgcmV0dXJuIHsgZWRpdHM6IFtdLCBmaW5kaW5nczogW10gfTtcbiAgfVxuXG4gIGNvbnN0IGNvbnRleHQ6IEFuYWx5c2lzQ29udGV4dCA9IHtcbiAgICBjaGVja2VyOiBwcm9ncmFtLmdldFR5cGVDaGVja2VyKCksXG4gICAgZWRpdHM6IFtdLFxuICAgIGZpbmRpbmdzOiBbXSxcbiAgICBsYW5ndWFnZVNlcnZpY2UsXG4gICAgcHJvZ3JhbSxcbiAgICBzaG91bGRGb3JjZTogcGFyYW1zLnNob3VsZEZvcmNlID8/IGZhbHNlLFxuICAgIHN0cmluZ0xpdGVyYWxPY2N1cnJlbmNlc0J5VGV4dDogYnVpbGRTdHJpbmdMaXRlcmFsSW5kZXgocHJvZ3JhbSlcbiAgfTtcblxuICBjb25zdCBzb3VyY2VGaWxlc1RvQW5hbHl6ZSA9IHByb2dyYW0uZ2V0U291cmNlRmlsZXMoKS5maWx0ZXIoKHNvdXJjZUZpbGUpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHRvQ2Fub25pY2FsKHNvdXJjZUZpbGUuZmlsZU5hbWUpO1xuICAgIHJldHVybiBpc093blNvdXJjZUZpbGUoZmlsZVBhdGgsIHNyY0ZvbGRlcikgJiYgIWlzVGVzdEZpbGUoZmlsZVBhdGgpO1xuICB9KTtcblxuICBmb3IgKGNvbnN0IFthbmFseXplZEZpbGVDb3VudCwgc291cmNlRmlsZV0gb2Ygc291cmNlRmlsZXNUb0FuYWx5emUuZW50cmllcygpKSB7XG4gICAgb25Qcm9ncmVzcz8uKHtcbiAgICAgIGFuYWx5emVkRmlsZUNvdW50LFxuICAgICAgY3VycmVudEZpbGVQYXRoOiB0b0Nhbm9uaWNhbChzb3VyY2VGaWxlLmZpbGVOYW1lKSxcbiAgICAgIHRvdGFsRmlsZUNvdW50OiBzb3VyY2VGaWxlc1RvQW5hbHl6ZS5sZW5ndGhcbiAgICB9KTtcbiAgICB2aXNpdChzb3VyY2VGaWxlKTtcbiAgfVxuICByZXR1cm4geyBlZGl0czogY29udGV4dC5lZGl0cywgZmluZGluZ3M6IGNvbnRleHQuZmluZGluZ3MgfTtcblxuICBmdW5jdGlvbiB2aXNpdChub2RlOiBOb2RlKTogdm9pZCB7XG4gICAgYW5hbHl6ZU1lbWJlcihub2RlLCBjb250ZXh0KTtcbiAgICBhbmFseXplRXhwb3J0KG5vZGUsIGNvbnRleHQpO1xuICAgIG5vZGUuZm9yRWFjaENoaWxkKHZpc2l0KTtcbiAgfVxufVxuXG5mdW5jdGlvbiB0b0Rpc3BsYXlQYXRoKGZpbGVQYXRoOiBzdHJpbmcsIGJhc2VGb2xkZXI6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIGlmIChiYXNlRm9sZGVyICE9PSB1bmRlZmluZWQgJiYgZmlsZVBhdGguc3RhcnRzV2l0aChgJHtiYXNlRm9sZGVyfS9gKSkge1xuICAgIHJldHVybiBmaWxlUGF0aC5zbGljZShiYXNlRm9sZGVyLmxlbmd0aCArIDEpO1xuICB9XG4gIHJldHVybiBmaWxlUGF0aDtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUEwRUEsd0JBMEJPO0FBRVAseUJBQWtDO0FBQ2xDLGlDQUdPO0FBOE9BLE1BQU0sc0JBQTJDLG9CQUFJLElBQVk7QUFBQSxFQUN0RTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUNGLENBQUM7QUE0REQsTUFBTSwrQkFBK0I7QUFDckMsTUFBTSxnQ0FBZ0M7QUFDdEMsTUFBTSx3QkFBbUQsQ0FBQyxXQUFXLGFBQWEsUUFBUTtBQUMxRixNQUFNLG9CQUF1RDtBQUFBLEVBQzNELGNBQWM7QUFBQSxFQUNkLFdBQVc7QUFBQSxFQUNYLGFBQWE7QUFDZjtBQUNBLE1BQU0sMEJBQWtFO0FBQUEsRUFDdEUsYUFBYTtBQUFBLEVBQ2IsaUJBQWlCO0FBQUEsRUFDakIsYUFBYTtBQUNmO0FBQ0EsTUFBTSw0QkFBcUQsb0JBQUksSUFBZ0IsQ0FBQyw2QkFBVyxnQkFBZ0IsNkJBQVcsa0JBQWtCLDZCQUFXLGFBQWEsQ0FBQztBQUNqSyxNQUFNLHFC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
|
|
@@ -15,7 +15,13 @@
|
|
|
15
15
|
*
|
|
16
16
|
* The analysis is whole-program and type-aware: it uses the TypeScript language service's
|
|
17
17
|
* find-all-references to locate every use of each declaration, then classifies the tightest
|
|
18
|
-
* exposure that still covers all references.
|
|
18
|
+
* exposure that still covers all references. Because `findReferences` does not link a string-literal
|
|
19
|
+
* argument back to a member declaration when the parameter is a conditional/mapped key type (e.g.
|
|
20
|
+
* `bind(component, 'someSetting')` where the key is typed `ConditionalKeys<Settings, …>`), member
|
|
21
|
+
* analysis additionally treats a string literal whose text equals the member name as a reference —
|
|
22
|
+
* but only when its contextual type is a string-literal type (or union of them) all of whose members
|
|
23
|
+
* are keys of the declaring class, so incidental same-named strings (`console.log('name')`) are not
|
|
24
|
+
* miscounted. Members invoked by the framework via registration
|
|
19
25
|
* rather than by visible references (Obsidian lifecycle hooks, settings-tab `display`, etc.) are
|
|
20
26
|
* excluded via {@link LIFECYCLE_ALLOWLIST}, as are `override` and `static` members whose exposure is
|
|
21
27
|
* constrained by a base declaration. ECMAScript hard-private members (`#name`) are also excluded —
|
package/dist/lib/esm/library.mjs
CHANGED
|
@@ -21,7 +21,7 @@ if you want to view the source, please visit the github repository of this plugi
|
|
|
21
21
|
globalThis.process = browserProcess;
|
|
22
22
|
})();
|
|
23
23
|
|
|
24
|
-
const LIBRARY_VERSION = "80.0.
|
|
24
|
+
const LIBRARY_VERSION = "80.0.2";
|
|
25
25
|
const LIBRARY_NAME = "obsidian-dev-utils";
|
|
26
26
|
const LIBRARY_STYLES = ".obsidian-dev-utils.code-highlighter-component textarea, .obsidian-dev-utils.code-highlighter-component pre, .obsidian-dev-utils.code-highlighter-component code {\n font-family: var(--font-monospace);\n line-height: var(--line-height-normal);\n margin: 0;\n}\n.obsidian-dev-utils.code-highlighter-component textarea, .obsidian-dev-utils.code-highlighter-component code {\n font-size: var(--code-size);\n}\n.obsidian-dev-utils.code-highlighter-component textarea {\n background: transparent;\n color: transparent;\n z-index: 2;\n width: 20em;\n height: 10em;\n}\n.obsidian-dev-utils.code-highlighter-component pre {\n position: absolute;\n pointer-events: none;\n border: var(--input-border-width) solid transparent;\n overflow: auto;\n inset: 0;\n padding: var(--size-4-1) var(--size-4-2);\n z-index: 1;\n}\n.obsidian-dev-utils.code-highlighter-component pre::after {\n content: \"\";\n display: block;\n height: var(--bottom-gap, 0);\n}\n.obsidian-dev-utils.code-highlighter-component pre.is-placeholder {\n opacity: 0.6;\n}\n.obsidian-dev-utils.code-highlighter-component code {\n display: block;\n padding: 0;\n}\n\n.obsidian-dev-utils input[type=url] {\n height: var(--input-height);\n}\n.obsidian-dev-utils input[type=month],\n.obsidian-dev-utils input[type=tel],\n.obsidian-dev-utils input[type=time],\n.obsidian-dev-utils input[type=url],\n.obsidian-dev-utils input[type=week] {\n -webkit-app-region: no-drag;\n background: var(--background-modifier-form-field);\n border: var(--input-border-width) solid var(--background-modifier-border);\n color: var(--text-normal);\n font-family: inherit;\n padding: var(--size-4-1) var(--size-4-2);\n font-size: var(--font-ui-small);\n border-radius: var(--input-radius);\n outline: none;\n}\n@media (hover: hover) {\n .obsidian-dev-utils input[type=month]:hover,\n .obsidian-dev-utils input[type=tel]:hover,\n .obsidian-dev-utils input[type=time]:hover,\n .obsidian-dev-utils input[type=url]:hover,\n .obsidian-dev-utils input[type=week]:hover {\n border-color: var(--background-modifier-border-hover);\n transition: box-shadow 0.15s ease-in-out, border 0.15s ease-in-out;\n }\n}\n.obsidian-dev-utils input[type=month]:active, .obsidian-dev-utils input[type=month]:focus,\n.obsidian-dev-utils input[type=tel]:active,\n.obsidian-dev-utils input[type=tel]:focus,\n.obsidian-dev-utils input[type=time]:active,\n.obsidian-dev-utils input[type=time]:focus,\n.obsidian-dev-utils input[type=url]:active,\n.obsidian-dev-utils input[type=url]:focus,\n.obsidian-dev-utils input[type=week]:active,\n.obsidian-dev-utils input[type=week]:focus {\n border-color: var(--background-modifier-border-focus);\n transition: box-shadow 0.15s ease-in-out, border 0.15s ease-in-out;\n}\n.obsidian-dev-utils input[type=month]:active, .obsidian-dev-utils input[type=month]:focus, .obsidian-dev-utils input[type=month]:focus-visible,\n.obsidian-dev-utils input[type=tel]:active,\n.obsidian-dev-utils input[type=tel]:focus,\n.obsidian-dev-utils input[type=tel]:focus-visible,\n.obsidian-dev-utils input[type=time]:active,\n.obsidian-dev-utils input[type=time]:focus,\n.obsidian-dev-utils input[type=time]:focus-visible,\n.obsidian-dev-utils input[type=url]:active,\n.obsidian-dev-utils input[type=url]:focus,\n.obsidian-dev-utils input[type=url]:focus-visible,\n.obsidian-dev-utils input[type=week]:active,\n.obsidian-dev-utils input[type=week]:focus,\n.obsidian-dev-utils input[type=week]:focus-visible {\n box-shadow: 0 0 0 2px var(--background-modifier-border-focus);\n}\n.obsidian-dev-utils input[type=month]::placeholder,\n.obsidian-dev-utils input[type=tel]::placeholder,\n.obsidian-dev-utils input[type=time]::placeholder,\n.obsidian-dev-utils input[type=url]::placeholder,\n.obsidian-dev-utils input[type=week]::placeholder {\n color: var(--text-faint);\n}\n.mod-rtl input[type=month],\n.mod-rtl input[type=time],\n.mod-rtl input[type=week],\n.is-rtl input[type=month],\n.is-rtl input[type=time],\n.is-rtl input[type=week],\n.rtl input[type=month],\n.rtl input[type=time],\n.rtl input[type=week] {\n direction: rtl;\n}\n.mod-rtl input[type=month]::-webkit-calendar-picker-indicator,\n.mod-rtl input[type=time]::-webkit-calendar-picker-indicator,\n.mod-rtl input[type=week]::-webkit-calendar-picker-indicator,\n.is-rtl input[type=month]::-webkit-calendar-picker-indicator,\n.is-rtl input[type=time]::-webkit-calendar-picker-indicator,\n.is-rtl input[type=week]::-webkit-calendar-picker-indicator,\n.rtl input[type=month]::-webkit-calendar-picker-indicator,\n.rtl input[type=time]::-webkit-calendar-picker-indicator,\n.rtl input[type=week]::-webkit-calendar-picker-indicator {\n right: var(--size-4-1);\n left: auto;\n}\n\n.obsidian-dev-utils input[type=month],\n.obsidian-dev-utils input[type=time],\n.obsidian-dev-utils input[type=week] {\n font-variant-numeric: tabular-nums;\n position: relative;\n}\n.obsidian-dev-utils input[type=month]::-webkit-datetime-edit-text,\n.obsidian-dev-utils input[type=time]::-webkit-datetime-edit-text,\n.obsidian-dev-utils input[type=week]::-webkit-datetime-edit-text {\n color: var(--text-faint);\n padding-inline-end: 0;\n}\n.obsidian-dev-utils input[type=month]::-webkit-calendar-picker-indicator,\n.obsidian-dev-utils input[type=time]::-webkit-calendar-picker-indicator,\n.obsidian-dev-utils input[type=week]::-webkit-calendar-picker-indicator {\n position: absolute;\n left: var(--size-4-1);\n right: auto;\n opacity: 0.5;\n}\n.obsidian-dev-utils input[type=month]::-webkit-datetime-edit-month-field:active, .obsidian-dev-utils input[type=month]::-webkit-datetime-edit-month-field:focus, .obsidian-dev-utils input[type=month]::-webkit-datetime-edit-day-field:active, .obsidian-dev-utils input[type=month]::-webkit-datetime-edit-day-field:focus, .obsidian-dev-utils input[type=month]::-webkit-datetime-edit-year-field:active, .obsidian-dev-utils input[type=month]::-webkit-datetime-edit-year-field:focus,\n.obsidian-dev-utils input[type=time]::-webkit-datetime-edit-month-field:active,\n.obsidian-dev-utils input[type=time]::-webkit-datetime-edit-month-field:focus,\n.obsidian-dev-utils input[type=time]::-webkit-datetime-edit-day-field:active,\n.obsidian-dev-utils input[type=time]::-webkit-datetime-edit-day-field:focus,\n.obsidian-dev-utils input[type=time]::-webkit-datetime-edit-year-field:active,\n.obsidian-dev-utils input[type=time]::-webkit-datetime-edit-year-field:focus,\n.obsidian-dev-utils input[type=week]::-webkit-datetime-edit-month-field:active,\n.obsidian-dev-utils input[type=week]::-webkit-datetime-edit-month-field:focus,\n.obsidian-dev-utils input[type=week]::-webkit-datetime-edit-day-field:active,\n.obsidian-dev-utils input[type=week]::-webkit-datetime-edit-day-field:focus,\n.obsidian-dev-utils input[type=week]::-webkit-datetime-edit-year-field:active,\n.obsidian-dev-utils input[type=week]::-webkit-datetime-edit-year-field:focus {\n background-color: var(--text-selection);\n color: var(--text-normal);\n cursor: text;\n}\n.mod-rtl .obsidian-dev-utils input[type=month], .is-rtl .obsidian-dev-utils input[type=month], .rtl .obsidian-dev-utils input[type=month],\n.mod-rtl .obsidian-dev-utils input[type=time],\n.is-rtl .obsidian-dev-utils input[type=time],\n.rtl .obsidian-dev-utils input[type=time],\n.mod-rtl .obsidian-dev-utils input[type=week],\n.is-rtl .obsidian-dev-utils input[type=week],\n.rtl .obsidian-dev-utils input[type=week] {\n direction: rtl;\n}\n.mod-rtl .obsidian-dev-utils input[type=month]::-webkit-calendar-picker-indicator, .is-rtl .obsidian-dev-utils input[type=month]::-webkit-calendar-picker-indicator, .rtl .obsidian-dev-utils input[type=month]::-webkit-calendar-picker-indicator,\n.mod-rtl .obsidian-dev-utils input[type=time]::-webkit-calendar-picker-indicator,\n.is-rtl .obsidian-dev-utils input[type=time]::-webkit-calendar-picker-indicator,\n.rtl .obsidian-dev-utils input[type=time]::-webkit-calendar-picker-indicator,\n.mod-rtl .obsidian-dev-utils input[type=week]::-webkit-calendar-picker-indicator,\n.is-rtl .obsidian-dev-utils input[type=week]::-webkit-calendar-picker-indicator,\n.rtl .obsidian-dev-utils input[type=week]::-webkit-calendar-picker-indicator {\n left: auto;\n right: var(--size-4-1);\n}\n\nbody:not(.is-ios):not(.is-android) .obsidian-dev-utils input[type=month],\nbody:not(.is-ios):not(.is-android) .obsidian-dev-utils input[type=time],\nbody:not(.is-ios):not(.is-android) .obsidian-dev-utils input[type=week] {\n padding-inline-start: var(--size-4-6);\n}\n\n.obsidian-dev-utils input[type=time]::-webkit-calendar-picker-indicator {\n margin-inline-start: 0;\n}\n\n.obsidian-dev-utilsprogress.loop {\n min-width: 200px;\n}\n\n.obsidian-dev-utils.modal-container .ok-button {\n margin-right: 10px;\n margin-top: 20px;\n}\n\n.obsidian-dev-utils .multiple-dropdown-component select,\n.obsidian-dev-utils .multiple-dropdown-component select:focus,\n.obsidian-dev-utils .multiple-dropdown-component .dropdown {\n height: auto;\n padding-top: 3px;\n}\n.obsidian-dev-utils .multiple-dropdown-component select option:checked,\n.obsidian-dev-utils .multiple-dropdown-component select:focus option:checked,\n.obsidian-dev-utils .multiple-dropdown-component .dropdown option:checked {\n background-color: #1967d2;\n color: #fff;\n}\n\n.obsidian-dev-utils.plugin-settings-tab a:focus {\n outline: 2px solid var(--link-color);\n}\n\n.obsidian-dev-utils.prompt-modal .text-box {\n width: 100%;\n}\n\n.obsidian-dev-utils.tri-state-checkbox-component input[type=checkbox]:indeterminate {\n appearance: checkbox;\n}\n\n.obsidian-dev-utils :invalid {\n box-shadow: 0 0 0 2px var(--text-error);\n}\n.obsidian-dev-utils input.metadata-input-text:active:invalid, .obsidian-dev-utils input.metadata-input-text:focus-visible:invalid, .obsidian-dev-utils input.metadata-input-text:focus:invalid,\n.obsidian-dev-utils input[type=date]:active:invalid,\n.obsidian-dev-utils input[type=date]:focus-visible:invalid,\n.obsidian-dev-utils input[type=date]:focus:invalid,\n.obsidian-dev-utils input[type=datetime-local]:active:invalid,\n.obsidian-dev-utils input[type=datetime-local]:focus-visible:invalid,\n.obsidian-dev-utils input[type=datetime-local]:focus:invalid,\n.obsidian-dev-utils input[type=email]:active:invalid,\n.obsidian-dev-utils input[type=email]:focus-visible:invalid,\n.obsidian-dev-utils input[type=email]:focus:invalid,\n.obsidian-dev-utils input[type=number]:active:invalid,\n.obsidian-dev-utils input[type=number]:focus-visible:invalid,\n.obsidian-dev-utils input[type=number]:focus:invalid,\n.obsidian-dev-utils input[type=password]:active:invalid,\n.obsidian-dev-utils input[type=password]:focus-visible:invalid,\n.obsidian-dev-utils input[type=password]:focus:invalid,\n.obsidian-dev-utils input[type=search]:active:invalid,\n.obsidian-dev-utils input[type=search]:focus-visible:invalid,\n.obsidian-dev-utils input[type=search]:focus:invalid,\n.obsidian-dev-utils input[type=text]:active:invalid,\n.obsidian-dev-utils input[type=text]:focus-visible:invalid,\n.obsidian-dev-utils input[type=text]:focus:invalid,\n.obsidian-dev-utils textarea:active:invalid,\n.obsidian-dev-utils textarea:focus-visible:invalid,\n.obsidian-dev-utils textarea:focus:invalid {\n box-shadow: 0 0 0 2px var(--text-error);\n}\n.obsidian-dev-utils.setting-component-wrapper {\n position: relative;\n display: inline-flex;\n}\n.obsidian-dev-utils.overlay-validator {\n caret-color: transparent;\n cursor: default;\n position: absolute;\n background-color: transparent;\n border: none;\n outline: none;\n pointer-events: none;\n z-index: 9999;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n}\n.obsidian-dev-utils.tooltip.tooltip-validator {\n position: absolute;\n top: calc(100% + 8px);\n width: max-content;\n}\n\n/*# sourceMappingURL=data:application/json;charset=utf-8,%7B%22version%22:3,%22sourceRoot%22:%22%22,%22sources%22:%5B%22../src/styles/code-highlighter-component.scss%22,%22../src/styles/input.scss%22,%22../src/styles/input-time.scss%22,%22../src/styles/loop.scss%22,%22../src/styles/modal-container.scss%22,%22../src/styles/multiple-dropdown-component.scss%22,%22../src/styles/plugin-settings-tab.scss%22,%22../src/styles/prompt-modal.scss%22,%22../src/styles/tri-state-checkbox-component.scss%22,%22../src/styles/validation.scss%22%5D,%22names%22:%5B%5D,%22mappings%22:%22AAEI;EACE;EACA;EACA;;AAGF;EACE;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;;AAGF;EACE;;AAGF;EACE;EACA;;;ACzCJ;EACE;;AAGF;AAAA;AAAA;AAAA;AAAA;EAKE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGE;EACE;AAAA;AAAA;AAAA;AAAA;IACE;IACA,YACE;;;AAMR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAEE;EACA,YACE;;AAIJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAGE;;AAGF;AAAA;AAAA;AAAA;AAAA;EACE;;AASE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAGE;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;EACA;;;AC7DV;AAAA;AAAA;EAGE;EACA;;AAEA;AAAA;AAAA;EACE;EACA;;AAGF;AAAA;AAAA;EACE;EACA;EACA;EACA;;AAMA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAEE;EACA;EACA;;AAIK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAGP;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;EACA;;;AAKF;AAAA;AAAA;EACE;;;AAMJ;EACE;;;ACjDJ;EACE;;;ACAA;EACE;EACA;;;ACFF;AAAA;AAAA;EAGE;EACA;;AAEA;AAAA;AAAA;EACE;EACA;;;ACRJ;EACE;;;ACDF;EACE;;;ACDF;EACE;;;ACEJ;EAJA;;AAoBI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EApBJ;;AA0BA;EACE;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA%22,%22file%22:%22styles.css%22,%22sourcesContent%22:%5B%22.obsidian-dev-utils%20%7B%5Cn%20%20&.code-highlighter-component%20%7B%5Cn%20%20%20%20textarea,%20pre,%20code%20%7B%5Cn%20%20%20%20%20%20font-family:%20var(--font-monospace);%5Cn%20%20%20%20%20%20line-height:%20var(--line-height-normal);%5Cn%20%20%20%20%20%20margin:%200;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20textarea,%20code%20%7B%5Cn%20%20%20%20%20%20font-size:%20var(--code-size);%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20textarea%20%7B%5Cn%20%20%20%20%20%20background:%20transparent;%5Cn%20%20%20%20%20%20color:%20transparent;%5Cn%20%20%20%20%20%20z-index:%202;%5Cn%20%20%20%20%20%20width:%2020em;%5Cn%20%20%20%20%20%20height:%2010em;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20pre%20%7B%5Cn%20%20%20%20%20%20position:%20absolute;%5Cn%20%20%20%20%20%20pointer-events:%20none;%5Cn%20%20%20%20%20%20border:%20var(--input-border-width)%20solid%20transparent;%5Cn%20%20%20%20%20%20overflow:%20auto;%5Cn%20%20%20%20%20%20inset:%200;%5Cn%20%20%20%20%20%20padding:%20var(--size-4-1)%20var(--size-4-2);%5Cn%20%20%20%20%20%20z-index:%201;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20pre::after%20%7B%5Cn%20%20%20%20%20%20content:%20%5C%22%5C%22;%5Cn%20%20%20%20%20%20display:%20block;%5Cn%20%20%20%20%20%20height:%20var(--bottom-gap,%200);%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20pre.is-placeholder%20%7B%5Cn%20%20%20%20%20%20opacity:%200.6;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20code%20%7B%5Cn%20%20%20%20%20%20display:%20block;%5Cn%20%20%20%20%20%20padding:%200;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20input%5Btype='url'%5D%20%7B%5Cn%20%20%20%20height:%20var(--input-height)%5Cn%20%20%7D%5Cn%5Cn%20%20input%5Btype='month'%5D,%5Cn%20%20input%5Btype='tel'%5D,%5Cn%20%20input%5Btype='time'%5D,%5Cn%20%20input%5Btype='url'%5D,%5Cn%20%20input%5Btype='week'%5D%20%7B%5Cn%20%20%20%20-webkit-app-region:%20no-drag;%5Cn%20%20%20%20background:%20var(--background-modifier-form-field);%5Cn%20%20%20%20border:%20var(--input-border-width)%20solid%20var(--background-modifier-border);%5Cn%20%20%20%20color:%20var(--text-normal);%5Cn%20%20%20%20font-family:%20inherit;%5Cn%20%20%20%20padding:%20var(--size-4-1)%20var(--size-4-2);%5Cn%20%20%20%20font-size:%20var(--font-ui-small);%5Cn%20%20%20%20border-radius:%20var(--input-radius);%5Cn%20%20%20%20outline:%20none;%5Cn%5Cn%20%20%20%20@at-root%20%7B%5Cn%20%20%20%20%20%20@media%20(hover:%20hover)%20%7B%5Cn%20%20%20%20%20%20%20%20&:hover%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20border-color:%20var(--background-modifier-border-hover);%5Cn%20%20%20%20%20%20%20%20%20%20transition:%5Cn%20%20%20%20%20%20%20%20%20%20%20%20box-shadow%200.15s%20ease-in-out,%5Cn%20%20%20%20%20%20%20%20%20%20%20%20border%200.15s%20ease-in-out;%5Cn%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20&:active,%5Cn%20%20%20%20&:focus%20%7B%5Cn%20%20%20%20%20%20border-color:%20var(--background-modifier-border-focus);%5Cn%20%20%20%20%20%20transition:%5Cn%20%20%20%20%20%20%20%20box-shadow%200.15s%20ease-in-out,%5Cn%20%20%20%20%20%20%20%20border%200.15s%20ease-in-out;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20&:active,%5Cn%20%20%20%20&:focus,%5Cn%20%20%20%20&:focus-visible%20%7B%5Cn%20%20%20%20%20%20box-shadow:%200%200%200%202px%20var(--background-modifier-border-focus);%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20&::placeholder%20%7B%5Cn%20%20%20%20%20%20color:%20var(--text-faint);%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20@at-root%20%7B%5Cn%20%20%20%20.mod-rtl,%5Cn%20%20%20%20.is-rtl,%5Cn%20%20%20%20.rtl%20%7B%5Cn%20%20%20%20%20%20&%20%7B%5Cn%20%20%20%20%20%20%20%20input%5Btype='month'%5D,%5Cn%20%20%20%20%20%20%20%20input%5Btype='time'%5D,%5Cn%20%20%20%20%20%20%20%20input%5Btype='week'%5D%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20direction:%20rtl;%5Cn%5Cn%20%20%20%20%20%20%20%20%20%20&::-webkit-calendar-picker-indicator%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20right:%20var(--size-4-1);%5Cn%20%20%20%20%20%20%20%20%20%20%20%20left:%20auto;%5Cn%20%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20input%5Btype='month'%5D,%5Cn%20%20input%5Btype='time'%5D,%5Cn%20%20input%5Btype='week'%5D%20%7B%5Cn%20%20%20%20font-variant-numeric:%20tabular-nums;%5Cn%20%20%20%20position:%20relative;%5Cn%5Cn%20%20%20%20&::-webkit-datetime-edit-text%20%7B%5Cn%20%20%20%20%20%20color:%20var(--text-faint);%5Cn%20%20%20%20%20%20padding-inline-end:%200;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20&::-webkit-calendar-picker-indicator%20%7B%5Cn%20%20%20%20%20%20position:%20absolute;%5Cn%20%20%20%20%20%20left:%20var(--size-4-1);%5Cn%20%20%20%20%20%20right:%20auto;%5Cn%20%20%20%20%20%20opacity:%200.5;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20&::-webkit-datetime-edit-month-field,%5Cn%20%20%20%20&::-webkit-datetime-edit-day-field,%5Cn%20%20%20%20&::-webkit-datetime-edit-year-field%20%7B%5Cn%20%20%20%20%20%20&:active,%5Cn%20%20%20%20%20%20&:focus%20%7B%5Cn%20%20%20%20%20%20%20%20background-color:%20var(--text-selection);%5Cn%20%20%20%20%20%20%20%20color:%20var(--text-normal);%5Cn%20%20%20%20%20%20%20%20cursor:%20text;%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20@at-root%20.mod-rtl%20&,%5Cn%20%20%20%20%20%20.is-rtl%20&,%5Cn%20%20%20%20%20%20.rtl%20&%20%7B%5Cn%20%20%20%20%20%20direction:%20rtl;%5Cn%5Cn%20%20%20%20%20%20&::-webkit-calendar-picker-indicator%20%7B%5Cn%20%20%20%20%20%20%20%20left:%20auto;%5Cn%20%20%20%20%20%20%20%20right:%20var(--size-4-1);%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20@at-root%20%7B%5Cn%20%20%20%20%20%20body:not(.is-ios):not(.is-android)%20&%20%7B%5Cn%20%20%20%20%20%20%20%20padding-inline-start:%20var(--size-4-6);%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20input%5Btype='time'%5D%20%7B%5Cn%20%20%20%20&::-webkit-calendar-picker-indicator%20%7B%5Cn%20%20%20%20%20%20margin-inline-start:%200;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20&progress.loop%20%7B%5Cn%20%20%20%20min-width:%20200px;%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20&.modal-container%20%7B%5Cn%20%20%20%20.ok-button%20%7B%5Cn%20%20%20%20%20%20margin-right:%2010px;%5Cn%20%20%20%20%20%20margin-top:%2020px;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20.multiple-dropdown-component%20%7B%5Cn%20%20%20%20select,%5Cn%20%20%20%20select:focus,%5Cn%20%20%20%20.dropdown%20%7B%5Cn%20%20%20%20%20%20height:%20auto;%5Cn%20%20%20%20%20%20padding-top:%203px;%5Cn%5Cn%20%20%20%20%20%20option:checked%20%7B%5Cn%20%20%20%20%20%20%20%20background-color:%20%231967d2;%5Cn%20%20%20%20%20%20%20%20color:%20%23fff;%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20&.plugin-settings-tab%20%7B%5Cn%20%20%20%20a:focus%20%7B%5Cn%20%20%20%20%20%20outline:%202px%20solid%20var(--link-color);%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cn%20%20&.prompt-modal%20%7B%5Cn%20%20%20%20.text-box%20%7B%5Cn%20%20%20%20%20%20width:%20100%25;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-dev-utils%20%7B%5Cr%5Cn%20%20&.tri-state-checkbox-component%20%7B%5Cr%5Cn%20%20%20%20input%5Btype='checkbox'%5D:indeterminate%20%7B%5Cr%5Cn%20%20%20%20%20%20appearance:%20checkbox;%5Cr%5Cn%20%20%20%20%7D%5Cr%5Cn%20%20%7D%5Cr%5Cn%7D%5Cr%5Cn%22,%22@mixin%20invalid%20%7B%5Cn%20%20box-shadow:%200%200%200%202px%20var(--text-error);%5Cn%7D%5Cn%5Cn.obsidian-dev-utils%20%7B%5Cn%20%20:invalid%20%7B%5Cn%20%20%20%20@include%20invalid;%5Cn%20%20%7D%5Cn%5Cn%20%20input.metadata-input-text,%5Cn%20%20input%5Btype='date'%5D,%5Cn%20%20input%5Btype='datetime-local'%5D,%5Cn%20%20input%5Btype='email'%5D,%5Cn%20%20input%5Btype='number'%5D,%5Cn%20%20input%5Btype='password'%5D,%5Cn%20%20input%5Btype='search'%5D,%5Cn%20%20input%5Btype='text'%5D,%5Cn%20%20textarea%20%7B%5Cn%20%20%20%20&:active,%5Cn%20%20%20%20&:focus-visible,%5Cn%20%20%20%20&:focus%20%7B%5Cn%20%20%20%20%20%20&:invalid%20%7B%5Cn%20%20%20%20%20%20%20%20@include%20invalid;%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20&.setting-component-wrapper%20%7B%5Cn%20%20%20%20position:%20relative;%5Cn%20%20%20%20display:%20inline-flex;%5Cn%20%20%7D%5Cn%5Cn%20%20&.overlay-validator%20%7B%5Cn%20%20%20%20caret-color:%20transparent;%5Cn%20%20%20%20cursor:%20default;%5Cn%20%20%20%20position:%20absolute;%5Cn%20%20%20%20background-color:%20transparent;%5Cn%20%20%20%20border:%20none;%5Cn%20%20%20%20outline:%20none;%5Cn%20%20%20%20pointer-events:%20none;%5Cn%20%20%20%20z-index:%209999;%5Cn%20%20%20%20left:%200;%5Cn%20%20%20%20top:%200;%5Cn%20%20%20%20width:%20100%25;%5Cn%20%20%20%20height:%20100%25;%5Cn%20%20%7D%5Cn%5Cn%20%20&.tooltip.tooltip-validator%20%7B%5Cn%20%20%20%20position:%20absolute;%5Cn%20%20%20%20top:%20calc(100%25%20+%208px);%5Cn%20%20%20%20width:%20max-content;%5Cn%20%20%7D%5Cn%7D%5Cn%22%5D%7D */\n";
|
|
27
27
|
export {
|
|
@@ -15,7 +15,13 @@
|
|
|
15
15
|
*
|
|
16
16
|
* The analysis is whole-program and type-aware: it uses the TypeScript language service's
|
|
17
17
|
* find-all-references to locate every use of each declaration, then classifies the tightest
|
|
18
|
-
* exposure that still covers all references.
|
|
18
|
+
* exposure that still covers all references. Because `findReferences` does not link a string-literal
|
|
19
|
+
* argument back to a member declaration when the parameter is a conditional/mapped key type (e.g.
|
|
20
|
+
* `bind(component, 'someSetting')` where the key is typed `ConditionalKeys<Settings, …>`), member
|
|
21
|
+
* analysis additionally treats a string literal whose text equals the member name as a reference —
|
|
22
|
+
* but only when its contextual type is a string-literal type (or union of them) all of whose members
|
|
23
|
+
* are keys of the declaring class, so incidental same-named strings (`console.log('name')`) are not
|
|
24
|
+
* miscounted. Members invoked by the framework via registration
|
|
19
25
|
* rather than by visible references (Obsidian lifecycle hooks, settings-tab `display`, etc.) are
|
|
20
26
|
* excluded via {@link LIFECYCLE_ALLOWLIST}, as are `override` and `static` members whose exposure is
|
|
21
27
|
* constrained by a base declaration. ECMAScript hard-private members (`#name`) are also excluded —
|
|
@@ -41,6 +41,7 @@ import {
|
|
|
41
41
|
isPropertyDeclaration,
|
|
42
42
|
isSetAccessorDeclaration,
|
|
43
43
|
isSourceFile,
|
|
44
|
+
isStringLiteralLike,
|
|
44
45
|
isTypeAliasDeclaration,
|
|
45
46
|
isVariableStatement,
|
|
46
47
|
ScriptSnapshot,
|
|
@@ -199,7 +200,8 @@ function analyzeMember(node, context) {
|
|
|
199
200
|
return;
|
|
200
201
|
}
|
|
201
202
|
const sourceFile = member.getSourceFile();
|
|
202
|
-
const
|
|
203
|
+
const directReferences = collectReferences(context.languageService.findReferences(sourceFile.fileName, nameNode.getStart())).filter((reference) => !isDeclarationItself(reference, nameNode));
|
|
204
|
+
const references = [...directReferences, ...collectStringLiteralReferences(nameNode, declaringClass, context)];
|
|
203
205
|
const nonTestReferences = references.filter((reference) => !isTestFile(toCanonical(reference.fileName)));
|
|
204
206
|
const neededForSrc = computeNeededExposure(nonTestReferences, declaringClass, context);
|
|
205
207
|
const neededWithTests = computeNeededExposure(references, declaringClass, context);
|
|
@@ -288,6 +290,24 @@ function buildFinding(node, nameNode, currentExposure, suggestedExposure, flags)
|
|
|
288
290
|
wasFixed: false
|
|
289
291
|
};
|
|
290
292
|
}
|
|
293
|
+
function buildStringLiteralIndex(program) {
|
|
294
|
+
const index = /* @__PURE__ */ new Map();
|
|
295
|
+
for (const sourceFile of program.getSourceFiles()) {
|
|
296
|
+
if (sourceFile.isDeclarationFile) {
|
|
297
|
+
continue;
|
|
298
|
+
}
|
|
299
|
+
collectInNode(sourceFile);
|
|
300
|
+
}
|
|
301
|
+
return index;
|
|
302
|
+
function collectInNode(node) {
|
|
303
|
+
if (isStringLiteralLike(node)) {
|
|
304
|
+
const occurrences = index.get(node.text) ?? [];
|
|
305
|
+
occurrences.push({ node, sourceFile: node.getSourceFile() });
|
|
306
|
+
index.set(node.text, occurrences);
|
|
307
|
+
}
|
|
308
|
+
node.forEachChild(collectInNode);
|
|
309
|
+
}
|
|
310
|
+
}
|
|
291
311
|
function collectReferences(referencedSymbols) {
|
|
292
312
|
const references = [];
|
|
293
313
|
for (const referencedSymbol of referencedSymbols ?? []) {
|
|
@@ -297,6 +317,20 @@ function collectReferences(referencedSymbols) {
|
|
|
297
317
|
}
|
|
298
318
|
return references;
|
|
299
319
|
}
|
|
320
|
+
function collectStringLiteralReferences(nameNode, declaringClass, context) {
|
|
321
|
+
const occurrences = context.stringLiteralOccurrencesByText.get(nameNode.getText());
|
|
322
|
+
if (!occurrences || occurrences.length === 0) {
|
|
323
|
+
return [];
|
|
324
|
+
}
|
|
325
|
+
const keySet = getClassKeySet(declaringClass, context.checker);
|
|
326
|
+
const references = [];
|
|
327
|
+
for (const occurrence of occurrences) {
|
|
328
|
+
if (isKeyReferenceToClass(occurrence.node, keySet, context.checker)) {
|
|
329
|
+
references.push({ fileName: occurrence.sourceFile.fileName, start: occurrence.node.getStart() });
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
return references;
|
|
333
|
+
}
|
|
300
334
|
function computeExportRemovalEdit(declaration) {
|
|
301
335
|
const sourceFile = declaration.getSourceFile();
|
|
302
336
|
const modifiers = getModifiers(declaration);
|
|
@@ -436,6 +470,11 @@ function getClassAtPosition(program, fileName, position) {
|
|
|
436
470
|
assertNonNullable(node, `No node found at position ${String(position)} in ${fileName}`);
|
|
437
471
|
return getEnclosingClass(node);
|
|
438
472
|
}
|
|
473
|
+
function getClassKeySet(declaringClass, checker) {
|
|
474
|
+
const classSymbol = declaringClass.name ? checker.getSymbolAtLocation(declaringClass.name) : void 0;
|
|
475
|
+
const classType = classSymbol ? checker.getDeclaredTypeOfSymbol(classSymbol) : checker.getTypeAtLocation(declaringClass);
|
|
476
|
+
return new Set(classType.getProperties().map((property) => property.name));
|
|
477
|
+
}
|
|
439
478
|
function getCurrentMemberExposure(modifierKinds) {
|
|
440
479
|
if (modifierKinds.has(SyntaxKind.PrivateKeyword)) {
|
|
441
480
|
return "private";
|
|
@@ -470,6 +509,22 @@ function getModifierKinds(node) {
|
|
|
470
509
|
}
|
|
471
510
|
return kinds;
|
|
472
511
|
}
|
|
512
|
+
function getStringLiteralConstituents(type) {
|
|
513
|
+
if (type.isStringLiteral()) {
|
|
514
|
+
return [type.value];
|
|
515
|
+
}
|
|
516
|
+
if (type.isUnion()) {
|
|
517
|
+
const literals = [];
|
|
518
|
+
for (const constituent of type.types) {
|
|
519
|
+
if (!constituent.isStringLiteral()) {
|
|
520
|
+
return null;
|
|
521
|
+
}
|
|
522
|
+
literals.push(constituent.value);
|
|
523
|
+
}
|
|
524
|
+
return literals;
|
|
525
|
+
}
|
|
526
|
+
return null;
|
|
527
|
+
}
|
|
473
528
|
function hasTsDocComment(node) {
|
|
474
529
|
const sourceFile = node.getSourceFile();
|
|
475
530
|
const fullText = sourceFile.getFullText();
|
|
@@ -504,6 +559,17 @@ function isDerivedFrom(derived, base, checker) {
|
|
|
504
559
|
}
|
|
505
560
|
return false;
|
|
506
561
|
}
|
|
562
|
+
function isKeyReferenceToClass(node, keySet, checker) {
|
|
563
|
+
const contextualType = checker.getContextualType(node);
|
|
564
|
+
if (!contextualType) {
|
|
565
|
+
return false;
|
|
566
|
+
}
|
|
567
|
+
const literals = getStringLiteralConstituents(contextualType);
|
|
568
|
+
if (!literals) {
|
|
569
|
+
return false;
|
|
570
|
+
}
|
|
571
|
+
return literals.every((literal) => keySet.has(literal));
|
|
572
|
+
}
|
|
507
573
|
function isOwnSourceFile(filePath, srcFolder) {
|
|
508
574
|
return filePath.startsWith(`${srcFolder}/`) && filePath.endsWith(".ts") && !filePath.endsWith(".d.ts");
|
|
509
575
|
}
|
|
@@ -529,7 +595,8 @@ function runOverExposureAnalysis(params) {
|
|
|
529
595
|
findings: [],
|
|
530
596
|
languageService,
|
|
531
597
|
program,
|
|
532
|
-
shouldForce: params.shouldForce ?? false
|
|
598
|
+
shouldForce: params.shouldForce ?? false,
|
|
599
|
+
stringLiteralOccurrencesByText: buildStringLiteralIndex(program)
|
|
533
600
|
};
|
|
534
601
|
const sourceFilesToAnalyze = program.getSourceFiles().filter((sourceFile) => {
|
|
535
602
|
const filePath = toCanonical(sourceFile.fileName);
|
|
@@ -564,4 +631,4 @@ export {
|
|
|
564
631
|
findOverExposure,
|
|
565
632
|
formatOverExposureFindings
|
|
566
633
|
};
|
|
567
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy9saW50ZXJzL292ZXItZXhwb3N1cmUudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBPdmVyLWV4cG9zdXJlIGFuYWx5emVyLlxuICpcbiAqIEZpbmRzIGRlY2xhcmF0aW9ucyBleHBvc2VkIG1vcmUgYnJvYWRseSB0aGFuIHRoZWlyIHJlZmVyZW5jZXMgcmVxdWlyZSwgc28gdGhlIGV4cG9zdXJlIGNhbiBiZVxuICogdGlnaHRlbmVkOlxuICpcbiAqIC0gYGV4cG9ydGBlZCBzeW1ib2xzIHJlZmVyZW5jZWQgb25seSB3aXRoaW4gdGhlaXIgb3duIGZpbGUgXHUyMDE0IHRoZSBgZXhwb3J0YCBjYW4gYmUgZHJvcHBlZC5cbiAqIC0gYHB1YmxpY2AgY2xhc3MgbWVtYmVycyByZWZlcmVuY2VkIG9ubHkgaW5zaWRlIHRoZWlyIG93biBjbGFzcyBcdTIwMTQgdGhleSBjYW4gYmUgYHByaXZhdGVgLlxuICogLSBgcHVibGljYCBjbGFzcyBtZW1iZXJzIHJlZmVyZW5jZWQgb25seSBpbnNpZGUgdGhlaXIgb3duIGNsYXNzIGFuZCBpdHMgc3ViY2xhc3NlcyBcdTIwMTQgdGhleSBjYW4gYmVcbiAqICAgYHByb3RlY3RlZGAuXG4gKiAtIGBwcm90ZWN0ZWRgIGNsYXNzIG1lbWJlcnMgcmVmZXJlbmNlZCBvbmx5IGluc2lkZSB0aGVpciBvd24gY2xhc3MgXHUyMDE0IHRoZXkgY2FuIGJlIGBwcml2YXRlYC5cbiAqXG4gKiBUaGUgYW5hbHlzaXMgaXMgd2hvbGUtcHJvZ3JhbSBhbmQgdHlwZS1hd2FyZTogaXQgdXNlcyB0aGUgVHlwZVNjcmlwdCBsYW5ndWFnZSBzZXJ2aWNlJ3NcbiAqIGZpbmQtYWxsLXJlZmVyZW5jZXMgdG8gbG9jYXRlIGV2ZXJ5IHVzZSBvZiBlYWNoIGRlY2xhcmF0aW9uLCB0aGVuIGNsYXNzaWZpZXMgdGhlIHRpZ2h0ZXN0XG4gKiBleHBvc3VyZSB0aGF0IHN0aWxsIGNvdmVycyBhbGwgcmVmZXJlbmNlcy4gTWVtYmVycyBpbnZva2VkIGJ5IHRoZSBmcmFtZXdvcmsgdmlhIHJlZ2lzdHJhdGlvblxuICogcmF0aGVyIHRoYW4gYnkgdmlzaWJsZSByZWZlcmVuY2VzIChPYnNpZGlhbiBsaWZlY3ljbGUgaG9va3MsIHNldHRpbmdzLXRhYiBgZGlzcGxheWAsIGV0Yy4pIGFyZVxuICogZXhjbHVkZWQgdmlhIHtAbGluayBMSUZFQ1lDTEVfQUxMT1dMSVNUfSwgYXMgYXJlIGBvdmVycmlkZWAgYW5kIGBzdGF0aWNgIG1lbWJlcnMgd2hvc2UgZXhwb3N1cmUgaXNcbiAqIGNvbnN0cmFpbmVkIGJ5IGEgYmFzZSBkZWNsYXJhdGlvbi4gRUNNQVNjcmlwdCBoYXJkLXByaXZhdGUgbWVtYmVycyAoYCNuYW1lYCkgYXJlIGFsc28gZXhjbHVkZWQgXHUyMDE0XG4gKiB0aGV5IGFyZSBhbHJlYWR5IG1heGltYWxseSBwcml2YXRlIGFuZCBjYW5ub3QgY2FycnkgYSB2aXNpYmlsaXR5IG1vZGlmaWVyLiBBIGRlY2xhcmF0aW9uIGNhcnJ5aW5nXG4gKiBhIFRTRG9jIChgLyoqIFx1MjAyNiAqXFwvYCkgZG9jdW1lbnRhdGlvbiBjb21tZW50IGlzIGxpa2V3aXNlIGV4Y2x1ZGVkIFx1MjAxNCB3aGV0aGVyIGEgdG9wLWxldmVsIGBleHBvcnRgIG9yXG4gKiBhIGNsYXNzIG1lbWJlciwgZG9jdW1lbnRpbmcgaXQgaXMgYSBkZWxpYmVyYXRlIHNpZ25hbCB0aGF0IGl0IGlzIHBhcnQgb2YgdGhlIGludGVuZGVkIHB1YmxpYyBBUEksXG4gKiByZWdhcmRsZXNzIG9mIHdoZXJlIGl0IGN1cnJlbnRseSBoYXBwZW5zIHRvIGJlIHJlZmVyZW5jZWQuXG4gKlxuICogQSBtZW1iZXIgcmVmZXJlbmNlZCBvbmx5IGZyb20gdGVzdCBmaWxlcyBpcyByZXBvcnRlZCB3aXRoIHtAbGluayBPdmVyRXhwb3N1cmVGaW5kaW5nLmlzRm9yY2VkQnlUZXN0T25seX1cbiAqIHNldCwgc3VyZmFjaW5nIG1lbWJlcnMgd2lkZW5lZCBwdXJlbHkgZm9yIHRlc3RhYmlsaXR5IFx1MjAxNCB0aGUgY2Fub25pY2FsIGNhc2UgZm9yIGV4dHJhY3RpbmcgbG9naWNcbiAqIGludG8gYW4gaW5kZXBlbmRlbnRseSB0ZXN0YWJsZSBjb21wb25lbnQgaW5zdGVhZC5cbiAqXG4gKiBCZXlvbmQgcmVwb3J0aW5nLCBwYXNzaW5nIGBzaG91bGRGaXhgIHRvIHtAbGluayBmaW5kT3ZlckV4cG9zdXJlfSAvIHtAbGluayBhbmFseXplT3ZlckV4cG9zdXJlfVxuICogcmV3cml0ZXMgdGhlIHNvdXJjZSBpbiBwbGFjZTogZHJvcHBpbmcgdGhlIGBleHBvcnRgIGtleXdvcmQsIG9yIHJlcGxhY2luZy9pbnNlcnRpbmcgYSBgcHJpdmF0ZWBcbiAqIG9yIGBwcm90ZWN0ZWRgIG1vZGlmaWVyLiBFYWNoIGZpbmRpbmcgdGhlbiBjYXJyaWVzIHtAbGluayBPdmVyRXhwb3N1cmVGaW5kaW5nLndhc0ZpeGVkfSAvXG4gKiB7QGxpbmsgT3ZlckV4cG9zdXJlRmluZGluZy5za2lwUmVhc29ufS4gQ2hhbmdlcyB0aGF0IGNhbm5vdCBiZSBzYWZlbHkgYXV0b21hdGVkIFx1MjAxNCB0aG9zZSBmb3JjZWRcbiAqIG9ubHkgYnkgdGVzdCByZWZlcmVuY2VzLCBkZWNvcmF0ZWQgbWVtYmVycywgb3IgYW4gYGV4cG9ydGAgc2hhcmVkIHdpdGggYSBzdGlsbC1leHBvcnRlZCBzaWJsaW5nIFx1MjAxNFxuICogYXJlIHJlcG9ydGVkIGFzIHNraXBwZWQgYW5kIGxlZnQgdW50b3VjaGVkLlxuICpcbiAqIEFkZGl0aW9uYWxseSBwYXNzaW5nIGBzaG91bGRGb3JjZWAgKG9ubHkgbWVhbmluZ2Z1bCB0b2dldGhlciB3aXRoIGBzaG91bGRGaXhgKSB0aWdodGVucyB0aGVcbiAqIGRlY2xhcmF0aW9ucyBoZWxkIHdpZGUgcHVyZWx5IGJ5IHRlc3QgcmVmZXJlbmNlcyB0b28gXHUyMDE0IHRoZSBwcm9kdWN0aW9uIGhhbGYgb2YgdGhlIGNhbm9uaWNhbFxuICogdGVzdC1vbmx5IG1pZ3JhdGlvbjogdGhlIG1lbWJlciBiZWNvbWVzIGBwcml2YXRlYCAvIHRoZSBgZXhwb3J0YCBpcyBkcm9wcGVkLCBsZWF2aW5nIG9ubHkgdGhlXG4gKiB0ZXN0IHRvIHN3aXRjaCB0byBhIGNhc3QtYmFzZWQgYWNjZXNzLiBEZWNvcmF0ZWQgbWVtYmVycyBhbmQgZXhwb3J0cyBzaGFyZWQgd2l0aCBhIHN0aWxsLWV4cG9ydGVkXG4gKiBzaWJsaW5nIHN0YXkgc2tpcHBlZCBldmVuIHVuZGVyIGBzaG91bGRGb3JjZWAsIGJlY2F1c2Ugbm8gZWRpdCBjYW4gYmUgYXBwbGllZCBzYWZlbHkuXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBDbGFzc0RlY2xhcmF0aW9uLFxuICBDbGFzc0xpa2VEZWNsYXJhdGlvbixcbiAgQ29tcGlsZXJPcHRpb25zLFxuICBFbnVtRGVjbGFyYXRpb24sXG4gIEZ1bmN0aW9uRGVjbGFyYXRpb24sXG4gIEdldEFjY2Vzc29yRGVjbGFyYXRpb24sXG4gIEludGVyZmFjZURlY2xhcmF0aW9uLFxuICBJU2NyaXB0U25hcHNob3QsXG4gIExhbmd1YWdlU2VydmljZSxcbiAgTGFuZ3VhZ2VTZXJ2aWNlSG9zdCxcbiAgTWV0aG9kRGVjbGFyYXRpb24sXG4gIE5vZGUsXG4gIFByb2dyYW0sXG4gIFByb3BlcnR5RGVjbGFyYXRpb24sXG4gIFJlZmVyZW5jZWRTeW1ib2wsXG4gIFNldEFjY2Vzc29yRGVjbGFyYXRpb24sXG4gIFR5cGVBbGlhc0RlY2xhcmF0aW9uLFxuICBUeXBlQ2hlY2tlcixcbiAgVmFyaWFibGVTdGF0ZW1lbnRcbn0gZnJvbSAndHlwZXNjcmlwdCc7XG5cbmltcG9ydCB7XG4gIGNhbkhhdmVNb2RpZmllcnMsXG4gIGNyZWF0ZURvY3VtZW50UmVnaXN0cnksXG4gIGNyZWF0ZUxhbmd1YWdlU2VydmljZSxcbiAgZ2V0RGVjb3JhdG9ycyxcbiAgZ2V0RGVmYXVsdExpYkZpbGVQYXRoLFxuICBnZXRMZWFkaW5nQ29tbWVudFJhbmdlcyxcbiAgZ2V0TW9kaWZpZXJzLFxuICBpc0NsYXNzRGVjbGFyYXRpb24sXG4gIGlzQ2xhc3NMaWtlLFxuICBpc0VudW1EZWNsYXJhdGlvbixcbiAgaXNGdW5jdGlvbkRlY2xhcmF0aW9uLFxuICBpc0dldEFjY2Vzc29yRGVjbGFyYXRpb24sXG4gIGlzSWRlbnRpZmllcixcbiAgaXNJbnRlcmZhY2VEZWNsYXJhdGlvbixcbiAgaXNNZXRob2REZWNsYXJhdGlvbixcbiAgaXNQcml2YXRlSWRlbnRpZmllcixcbiAgaXNQcm9wZXJ0eURlY2xhcmF0aW9uLFxuICBpc1NldEFjY2Vzc29yRGVjbGFyYXRpb24sXG4gIGlzU291cmNlRmlsZSxcbiAgaXNUeXBlQWxpYXNEZWNsYXJhdGlvbixcbiAgaXNWYXJpYWJsZVN0YXRlbWVudCxcbiAgU2NyaXB0U25hcHNob3QsXG4gIFN5bnRheEtpbmQsXG4gIHN5c1xufSBmcm9tICd0eXBlc2NyaXB0JztcblxuaW1wb3J0IHsgYXNzZXJ0Tm9uTnVsbGFibGUgfSBmcm9tICcuLi8uLi90eXBlLWd1YXJkcy50cyc7XG5pbXBvcnQge1xuICBwYXJzZVRzQ29uZmlnLFxuICB0b0Nhbm9uaWNhbFxufSBmcm9tICcuLi9jaGVjay1wcm9qZWN0LXR5cGVzLnRzJztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgYW5hbHl6ZU92ZXJFeHBvc3VyZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQW5hbHl6ZU92ZXJFeHBvc3VyZVBhcmFtcyB7XG4gIC8qKiBUaGUgbGFuZ3VhZ2Ugc2VydmljZSB0byBxdWVyeSBmb3IgcmVmZXJlbmNlcyBhbmQgdHlwZXMuICovXG4gIHJlYWRvbmx5IGxhbmd1YWdlU2VydmljZTogTGFuZ3VhZ2VTZXJ2aWNlO1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBjYWxsYmFjayBpbnZva2VkIG9uY2UgcGVyIGFuYWx5emVkIHNvdXJjZSBmaWxlLCBiZWZvcmUgdGhhdCBmaWxlIGlzIHByb2Nlc3NlZC4gVGhlXG4gICAqIHdob2xlLXByb2dyYW0gcmVmZXJlbmNlIGFuYWx5c2lzIGlzIHNsb3csIHNvIHRoaXMgbGV0cyBjYWxsZXJzIHJlcG9ydCBsaXZlIHByb2dyZXNzIGluc3RlYWQgb2ZcbiAgICogYXBwZWFyaW5nIHRvIGhhbmcuXG4gICAqL1xuICBvblByb2dyZXNzPyh0aGlzOiB2b2lkLCBwcm9ncmVzczogT3ZlckV4cG9zdXJlUHJvZ3Jlc3MpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBXaGVuIGB0cnVlYCwgZWFjaCBmaXhhYmxlIGZpbmRpbmcgaXMgdGlnaHRlbmVkIGluIHBsYWNlIHZpYSB7QGxpbmsgd3JpdGVGaWxlfSAod2hpY2ggbXVzdCB0aGVuXG4gICAqIGJlIHByb3ZpZGVkKSwgYW5kIHRoZSByZXR1cm5lZCBmaW5kaW5ncyBjYXJyeSB7QGxpbmsgT3ZlckV4cG9zdXJlRmluZGluZy53YXNGaXhlZH0gL1xuICAgKiB7QGxpbmsgT3ZlckV4cG9zdXJlRmluZGluZy5za2lwUmVhc29ufS4gV2hlbiBgZmFsc2VgIG9yIG9taXR0ZWQsIHRoZSBhbmFseXNpcyBvbmx5IHJlcG9ydHMuXG4gICAqL1xuICByZWFkb25seSBzaG91bGRGaXg/OiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBXaGVuIGB0cnVlYCAob25seSBtZWFuaW5nZnVsIHRvZ2V0aGVyIHdpdGgge0BsaW5rIHNob3VsZEZpeH0pLCBkZWNsYXJhdGlvbnMgaGVsZCB3aWRlIHB1cmVseSBieVxuICAgKiB0ZXN0IHJlZmVyZW5jZXMgYXJlIHRpZ2h0ZW5lZCB0b28sIGluc3RlYWQgb2YgYmVpbmcgc2tpcHBlZCB3aXRoIGEgYHRlc3Qtb25seWBcbiAgICoge0BsaW5rIE92ZXJFeHBvc3VyZUZpbmRpbmcuc2tpcFJlYXNvbn0uIERlY29yYXRlZCBtZW1iZXJzIGFuZCBleHBvcnRzIHNoYXJlZCB3aXRoIGFcbiAgICogc3RpbGwtZXhwb3J0ZWQgc2libGluZyBzdGF5IHNraXBwZWQgcmVnYXJkbGVzcywgYmVjYXVzZSBubyBlZGl0IGNhbiBiZSBhcHBsaWVkIHNhZmVseS5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEZvcmNlPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQWJzb2x1dGUgKGNhbm9uaWNhbCkgcGF0aCBvZiB0aGUgcHJvamVjdCdzIGBzcmNgIGZvbGRlci4gT25seSBkZWNsYXJhdGlvbnMgaW4gbm9uLXRlc3QgZmlsZXNcbiAgICogdW5kZXIgdGhpcyBmb2xkZXIgYXJlIGFuYWx5emVkOyBkZWNsYXJhdGlvbnMgZWxzZXdoZXJlICh0ZXN0IGZpbGVzLCBkZXBlbmRlbmNpZXMpIGFyZSBpZ25vcmVkXG4gICAqIGJ1dCBzdGlsbCBjb3VudGVkIGFzIHJlZmVyZW5jZSBzaXRlcy5cbiAgICovXG4gIHJlYWRvbmx5IHNyY0ZvbGRlcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXcml0ZXMgdGhlIHRpZ2h0ZW5lZCBjb250ZW50cyBvZiBhIGNoYW5nZWQgZmlsZSBiYWNrIHRvIGRpc2suIFJlcXVpcmVkIHdoZW4ge0BsaW5rIHNob3VsZEZpeH1cbiAgICogaXMgYHRydWVgOyBpZ25vcmVkIG90aGVyd2lzZS5cbiAgICpcbiAgICogQHBhcmFtIHBhdGggLSBBYnNvbHV0ZSBwYXRoIG9mIHRoZSBmaWxlIHRvIHdyaXRlIChvcmlnaW5hbCBjYXNpbmcsIGFzIHN0b3JlZCBpbiB0aGUgcHJvZ3JhbSkuXG4gICAqIEBwYXJhbSBjb250ZW50IC0gVGhlIGZ1bGwgbmV3IGZpbGUgY29udGVudHMuXG4gICAqL1xuICB3cml0ZUZpbGU/KHRoaXM6IHZvaWQsIHBhdGg6IHN0cmluZywgY29udGVudDogc3RyaW5nKTogdm9pZDtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgY3JlYXRlTGFuZ3VhZ2VTZXJ2aWNlSG9zdH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlTGFuZ3VhZ2VTZXJ2aWNlSG9zdFBhcmFtcyB7XG4gIC8qKiBUaGUgY29tcGlsZXIgb3B0aW9ucy4gKi9cbiAgcmVhZG9ubHkgY29tcGlsZXJPcHRpb25zOiBDb21waWxlck9wdGlvbnM7XG5cbiAgLyoqIFRoZSBmaWxlcyB0byBpbmNsdWRlIGluIHRoZSBwcm9ncmFtLiAqL1xuICByZWFkb25seSBmaWxlTmFtZXM6IHJlYWRvbmx5IHN0cmluZ1tdO1xuXG4gIC8qKiBUaGUgZmlsZS1zeXN0ZW0gb3BlcmF0aW9ucyB1c2VkIHRvIHJlYWQgc291cmNlcy4gKi9cbiAgcmVhZG9ubHkgZmlsZVN5c3RlbTogT3ZlckV4cG9zdXJlRmlsZVN5c3RlbTtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgY3JlYXRlUHJvamVjdExhbmd1YWdlU2VydmljZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlUHJvamVjdExhbmd1YWdlU2VydmljZVBhcmFtcyB7XG4gIC8qKiBBYnNvbHV0ZSBwYXRoIHRvIHRoZSBwcm9qZWN0J3MgYHRzY29uZmlnLmpzb25gLiAqL1xuICByZWFkb25seSB0c0NvbmZpZ1BhdGg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgZXhwb3N1cmUgbGV2ZWwgYSBkZWNsYXJhdGlvbiBjdXJyZW50bHkgaGFzLlxuICovXG5leHBvcnQgdHlwZSBDdXJyZW50RXhwb3N1cmUgPSAnZXhwb3J0JyB8ICdwcm90ZWN0ZWQnIHwgJ3B1YmxpYyc7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGZpbmRPdmVyRXhwb3N1cmV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZpbmRPdmVyRXhwb3N1cmVQYXJhbXMge1xuICAvKipcbiAgICogT3B0aW9uYWwgY2FsbGJhY2sgaW52b2tlZCBvbmNlIHBlciBhbmFseXplZCBzb3VyY2UgZmlsZSwgZm9yIGxpdmUgcHJvZ3Jlc3MgcmVwb3J0aW5nLiBGb3J3YXJkZWRcbiAgICogdG8ge0BsaW5rIGFuYWx5emVPdmVyRXhwb3N1cmV9LlxuICAgKi9cbiAgb25Qcm9ncmVzcz8odGhpczogdm9pZCwgcHJvZ3Jlc3M6IE92ZXJFeHBvc3VyZVByb2dyZXNzKTogdm9pZDtcblxuICAvKiogQWJzb2x1dGUgcGF0aCB0byB0aGUgcHJvamVjdCByb290ICh0aGUgZm9sZGVyIGNvbnRhaW5pbmcgYHRzY29uZmlnLmpzb25gIGFuZCBgc3JjYCkuICovXG4gIHJlYWRvbmx5IHByb2plY3RGb2xkZXI6IHN0cmluZztcblxuICAvKipcbiAgICogV2hlbiBgdHJ1ZWAsIGZpeGFibGUgZmluZGluZ3MgYXJlIHRpZ2h0ZW5lZCBpbiBwbGFjZSBvbiBkaXNrICh0aGUgYGV4cG9ydGAga2V5d29yZCBpcyBkcm9wcGVkLFxuICAgKiBvciBhIGBwcml2YXRlYCAvIGBwcm90ZWN0ZWRgIG1vZGlmaWVyIGlzIGluc2VydGVkL3JlcGxhY2VkKS4gV2hlbiBgZmFsc2VgIG9yIG9taXR0ZWQsIHRoZVxuICAgKiBwcm9qZWN0IGlzIG9ubHkgYW5hbHl6ZWQuXG4gICAqL1xuICByZWFkb25seSBzaG91bGRGaXg/OiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBXaGVuIGB0cnVlYCAob25seSBtZWFuaW5nZnVsIHRvZ2V0aGVyIHdpdGgge0BsaW5rIHNob3VsZEZpeH0pLCBkZWNsYXJhdGlvbnMgaGVsZCB3aWRlIHB1cmVseSBieVxuICAgKiB0ZXN0IHJlZmVyZW5jZXMgYXJlIHRpZ2h0ZW5lZCB0b28sIGluc3RlYWQgb2YgYmVpbmcgc2tpcHBlZC4gRGVjb3JhdGVkIG1lbWJlcnMgYW5kIGV4cG9ydHNcbiAgICogc2hhcmVkIHdpdGggYSBzdGlsbC1leHBvcnRlZCBzaWJsaW5nIHN0YXkgc2tpcHBlZCByZWdhcmRsZXNzLiBGb3J3YXJkZWQgdG9cbiAgICoge0BsaW5rIGFuYWx5emVPdmVyRXhwb3N1cmV9LlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRm9yY2U/OiBib29sZWFuIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBmb3JtYXRPdmVyRXhwb3N1cmVGaW5kaW5nc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRm9ybWF0T3ZlckV4cG9zdXJlRmluZGluZ3NPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoZW4gc2V0LCBmaWxlIHBhdGhzIGluIHRoZSByZXBvcnQgYXJlIHJlbmRlcmVkIHJlbGF0aXZlIHRvIHRoaXMgZm9sZGVyICh0eXBpY2FsbHkgdGhlIGN1cnJlbnRcbiAgICogd29ya2luZyBkaXJlY3RvcnkpIGluc3RlYWQgb2YgYXMgYWJzb2x1dGUgcGF0aHMuIFBhdGhzIG91dHNpZGUgdGhlIGZvbGRlciBzdGF5IGFic29sdXRlLlxuICAgKi9cbiAgcmVhZG9ubHkgYmFzZUZvbGRlcj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgc3Vic2V0IG9mIGZpbGUtc3lzdGVtIG9wZXJhdGlvbnMgdGhlIGxhbmd1YWdlLXNlcnZpY2UgaG9zdCBuZWVkcy4gSW5qZWN0aW5nIHRoaXMgKHJhdGhlciB0aGFuXG4gKiBhbHdheXMgdXNpbmcgYHR5cGVzY3JpcHRgJ3MgYHN5c2ApIGxldHMgdGVzdHMgZHJpdmUgdGhlIGFuYWx5emVyIGFnYWluc3QgaW4tbWVtb3J5IHNvdXJjZXMgd2l0aCBub1xuICogcmVhbCBmaWxlLXN5c3RlbSBhY2Nlc3MuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3ZlckV4cG9zdXJlRmlsZVN5c3RlbSB7XG4gIC8qKlxuICAgKiBAcGFyYW0gcGF0aCAtIERpcmVjdG9yeSBwYXRoLlxuICAgKiBAcmV0dXJucyBgdHJ1ZWAgd2hlbiB0aGUgZGlyZWN0b3J5IGV4aXN0cy5cbiAgICovXG4gIGRpcmVjdG9yeUV4aXN0cyh0aGlzOiB2b2lkLCBwYXRoOiBzdHJpbmcpOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gcGF0aCAtIEZpbGUgcGF0aC5cbiAgICogQHJldHVybnMgYHRydWVgIHdoZW4gdGhlIGZpbGUgZXhpc3RzLlxuICAgKi9cbiAgZmlsZUV4aXN0cyh0aGlzOiB2b2lkLCBwYXRoOiBzdHJpbmcpOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBAcmV0dXJucyBUaGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS5cbiAgICovXG4gIGdldEN1cnJlbnREaXJlY3RvcnkodGhpczogdm9pZCk6IHN0cmluZztcblxuICAvKipcbiAgICogQHBhcmFtIHBhdGggLSBEaXJlY3RvcnkgcGF0aC5cbiAgICogQHJldHVybnMgVGhlIGltbWVkaWF0ZSBzdWJkaXJlY3RvcnkgbmFtZXMuXG4gICAqL1xuICBnZXREaXJlY3Rvcmllcyh0aGlzOiB2b2lkLCBwYXRoOiBzdHJpbmcpOiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogQHBhcmFtIHBhdGggLSBSb290IGRpcmVjdG9yeS5cbiAgICogQHBhcmFtIGV4dGVuc2lvbnMgLSBFeHRlbnNpb25zIHRvIGluY2x1ZGUuXG4gICAqIEBwYXJhbSBleGNsdWRlIC0gUGF0dGVybnMgdG8gZXhjbHVkZS5cbiAgICogQHBhcmFtIGluY2x1ZGUgLSBQYXR0ZXJucyB0byBpbmNsdWRlLlxuICAgKiBAcGFyYW0gZGVwdGggLSBNYXhpbXVtIHJlY3Vyc2lvbiBkZXB0aC5cbiAgICogQHJldHVybnMgVGhlIG1hdGNoaW5nIGZpbGUgcGF0aHMuXG4gICAqL1xuICByZWFkRGlyZWN0b3J5KHRoaXM6IHZvaWQsIHBhdGg6IHN0cmluZywgZXh0ZW5zaW9ucz86IHJlYWRvbmx5IHN0cmluZ1tdLCBleGNsdWRlPzogcmVhZG9ubHkgc3RyaW5nW10sIGluY2x1ZGU/OiByZWFkb25seSBzdHJpbmdbXSwgZGVwdGg/OiBudW1iZXIpOiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogQHBhcmFtIHBhdGggLSBGaWxlIHBhdGguXG4gICAqIEByZXR1cm5zIFRoZSBmaWxlIGNvbnRlbnRzLCBvciBgdW5kZWZpbmVkYCB3aGVuIGFic2VudC5cbiAgICovXG4gIHJlYWRGaWxlKHRoaXM6IHZvaWQsIHBhdGg6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBBIHNpbmdsZSBvdmVyLWV4cG9zZWQgZGVjbGFyYXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3ZlckV4cG9zdXJlRmluZGluZyB7XG4gIC8qKiAxLWJhc2VkIGNvbHVtbiBvZiB0aGUgZGVjbGFyYXRpb24ncyBuYW1lLiAqL1xuICByZWFkb25seSBjb2x1bW46IG51bWJlcjtcblxuICAvKiogVGhlIGN1cnJlbnQgZXhwb3N1cmUgbGV2ZWwuICovXG4gIHJlYWRvbmx5IGN1cnJlbnRFeHBvc3VyZTogQ3VycmVudEV4cG9zdXJlO1xuXG4gIC8qKiBBYnNvbHV0ZSBwYXRoIG9mIHRoZSBmaWxlIGRlY2xhcmluZyB0aGUgc3ltYm9sLiAqL1xuICByZWFkb25seSBmaWxlUGF0aDogc3RyaW5nO1xuXG4gIC8qKiBgdHJ1ZWAgd2hlbiB0aGUgZGVjbGFyYXRpb24gaGFzIG5vIHJlZmVyZW5jZXMgYXQgYWxsIChiZXNpZGVzIGl0c2VsZikuICovXG4gIHJlYWRvbmx5IGhhc05vUmVmZXJlbmNlczogYm9vbGVhbjtcblxuICAvKipcbiAgICogYHRydWVgIHdoZW4gdGhlIGRlY2xhcmF0aW9uIHdvdWxkIHF1YWxpZnkgZm9yIGEgdGlnaHRlciBleHBvc3VyZSBpZiBub3QgZm9yIHJlZmVyZW5jZXMgY29taW5nXG4gICAqIGV4Y2x1c2l2ZWx5IGZyb20gdGVzdCBmaWxlcyBcdTIwMTQgaS5lLiBpdCBpcyBleHBvc2VkIHB1cmVseSBmb3IgdGVzdGFiaWxpdHkuXG4gICAqL1xuICByZWFkb25seSBpc0ZvcmNlZEJ5VGVzdE9ubHk6IGJvb2xlYW47XG5cbiAgLyoqIGB0cnVlYCBmb3IgYSBjbGFzcyBtZW1iZXIsIGBmYWxzZWAgZm9yIGEgdG9wLWxldmVsIGV4cG9ydC4gKi9cbiAgcmVhZG9ubHkgaXNNZW1iZXI6IGJvb2xlYW47XG5cbiAgLyoqIDEtYmFzZWQgbGluZSBvZiB0aGUgZGVjbGFyYXRpb24ncyBuYW1lLiAqL1xuICByZWFkb25seSBsaW5lOiBudW1iZXI7XG5cbiAgLyoqIFRoZSBkZWNsYXJlZCBuYW1lLiAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEluIGEgZml4IHJ1biwgd2h5IHRoaXMgZmluZGluZyB3YXMgbGVmdCB1bnRvdWNoZWQgaW5zdGVhZCBvZiB0aWdodGVuZWQ7IGBudWxsYCB3aGVuIGl0IHdhc1xuICAgKiBmaXhlZCBvciB3aGVuIHRoZSBhbmFseXNpcyBvbmx5IHJlcG9ydGVkIChgc2hvdWxkRml4YCBvZmYpLlxuICAgKi9cbiAgcmVhZG9ubHkgc2tpcFJlYXNvbjogbnVsbCB8IE92ZXJFeHBvc3VyZVNraXBSZWFzb247XG5cbiAgLyoqIFRoZSBleHBvc3VyZSB0aGUgZGVjbGFyYXRpb24gY291bGQgYmUgdGlnaHRlbmVkIHRvLiAqL1xuICByZWFkb25seSBzdWdnZXN0ZWRFeHBvc3VyZTogU3VnZ2VzdGVkRXhwb3N1cmU7XG5cbiAgLyoqIGB0cnVlYCB3aGVuIGEgZml4IHJ1biB0aWdodGVuZWQgdGhpcyBkZWNsYXJhdGlvbiBpbiBwbGFjZS4gQWx3YXlzIGBmYWxzZWAgaW4gYSByZXBvcnQgcnVuLiAqL1xuICByZWFkb25seSB3YXNGaXhlZDogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQcm9ncmVzcyByZXBvcnRlZCB3aGlsZSBhbmFseXppbmcgYSBwcm9qZWN0LCBvbmUgZXZlbnQgcGVyIGFuYWx5emVkIHNvdXJjZSBmaWxlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE92ZXJFeHBvc3VyZVByb2dyZXNzIHtcbiAgLyoqIE51bWJlciBvZiBzb3VyY2UgZmlsZXMgZnVsbHkgYW5hbHl6ZWQgYmVmb3JlIHRoZSBjdXJyZW50IG9uZSAoMC1iYXNlZCkuICovXG4gIHJlYWRvbmx5IGFuYWx5emVkRmlsZUNvdW50OiBudW1iZXI7XG5cbiAgLyoqIEFic29sdXRlIChjYW5vbmljYWwpIHBhdGggb2YgdGhlIHNvdXJjZSBmaWxlIGFib3V0IHRvIGJlIGFuYWx5emVkLiAqL1xuICByZWFkb25seSBjdXJyZW50RmlsZVBhdGg6IHN0cmluZztcblxuICAvKiogVG90YWwgbnVtYmVyIG9mIHNvdXJjZSBmaWxlcyB0aGF0IHdpbGwgYmUgYW5hbHl6ZWQuICovXG4gIHJlYWRvbmx5IHRvdGFsRmlsZUNvdW50OiBudW1iZXI7XG59XG5cbi8qKlxuICogV2h5IGEgZml4IHJ1biBsZWZ0IGEgZmluZGluZyB1bnRvdWNoZWQ6XG4gKlxuICogLSBgZGVjb3JhdGVkYCBcdTIwMTQgdGhlIG1lbWJlciBjYXJyaWVzIGEgZGVjb3JhdG9yLCBzbyB0aGUgbW9kaWZpZXIgaW5zZXJ0aW9uIHBvaW50IGlzIGFtYmlndW91cy5cbiAqIC0gYHNoYXJlZC1leHBvcnRgIFx1MjAxNCB0aGUgYGV4cG9ydGAga2V5d29yZCBpcyBzaGFyZWQgd2l0aCBhIHN0aWxsLWV4cG9ydGVkIHNpYmxpbmcgZGVjbGFyYXRvci5cbiAqIC0gYHRlc3Qtb25seWAgXHUyMDE0IHRoZSBkZWNsYXJhdGlvbiBpcyBleHBvc2VkIHB1cmVseSBmb3IgdGVzdHMsIHNvIHRpZ2h0ZW5pbmcgd291bGQgYnJlYWsgdGhlIHRlc3QuXG4gKi9cbmV4cG9ydCB0eXBlIE92ZXJFeHBvc3VyZVNraXBSZWFzb24gPSAnZGVjb3JhdGVkJyB8ICdzaGFyZWQtZXhwb3J0JyB8ICd0ZXN0LW9ubHknO1xuXG4vKipcbiAqIFRoZSAodGlnaHRlcikgZXhwb3N1cmUgbGV2ZWwgYSBkZWNsYXJhdGlvbiBjb3VsZCBiZSByZWR1Y2VkIHRvLlxuICovXG5leHBvcnQgdHlwZSBTdWdnZXN0ZWRFeHBvc3VyZSA9ICdmaWxlLWxvY2FsJyB8ICdwcml2YXRlJyB8ICdwcm90ZWN0ZWQnO1xuXG4vKipcbiAqIExpZmVjeWNsZSBhbmQgZnJhbWV3b3JrIG1lbWJlcnMgaW52b2tlZCBieSBPYnNpZGlhbiBvciBhIGJhc2UgY2xhc3MgdmlhIHJlZ2lzdHJhdGlvbiByYXRoZXIgdGhhblxuICogYnkgcmVmZXJlbmNlcyB0aGUgbGFuZ3VhZ2Ugc2VydmljZSBjYW4gc2VlLiBUaWdodGVuaW5nIHRoZXNlIHdvdWxkIGJyZWFrIHRoZSBmcmFtZXdvcmsgY29udHJhY3QsXG4gKiBzbyB0aGV5IGFyZSBuZXZlciByZXBvcnRlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IExJRkVDWUNMRV9BTExPV0xJU1Q6IFJlYWRvbmx5U2V0PHN0cmluZz4gPSBuZXcgU2V0PHN0cmluZz4oW1xuICAnZGlzcGxheScsXG4gICdoaWRlJyxcbiAgJ29uRXh0ZXJuYWxTZXR0aW5nc0NoYW5nZScsXG4gICdvbkxheW91dFJlYWR5JyxcbiAgJ29ubG9hZCcsXG4gICdvbmxvYWRJbXBsJyxcbiAgJ29uTG9hZFNldHRpbmdzJyxcbiAgJ29uU2F2ZVNldHRpbmdzJyxcbiAgJ29udW5sb2FkJyxcbiAgJ29udW5sb2FkSW1wbCdcbl0pO1xuXG5pbnRlcmZhY2UgQW5hbHlzaXNDb250ZXh0IHtcbiAgcmVhZG9ubHkgY2hlY2tlcjogVHlwZUNoZWNrZXI7XG4gIHJlYWRvbmx5IGVkaXRzOiAobnVsbCB8IE92ZXJFeHBvc3VyZVRleHRFZGl0KVtdO1xuICByZWFkb25seSBmaW5kaW5nczogT3ZlckV4cG9zdXJlRmluZGluZ1tdO1xuICByZWFkb25seSBsYW5ndWFnZVNlcnZpY2U6IExhbmd1YWdlU2VydmljZTtcbiAgcmVhZG9ubHkgcHJvZ3JhbTogUHJvZ3JhbTtcbiAgcmVhZG9ubHkgc2hvdWxkRm9yY2U6IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBBbmFseXNpc1Jlc3VsdCB7XG4gIHJlYWRvbmx5IGVkaXRzOiByZWFkb25seSAobnVsbCB8IE92ZXJFeHBvc3VyZVRleHRFZGl0KVtdO1xuICByZWFkb25seSBmaW5kaW5nczogcmVhZG9ubHkgT3ZlckV4cG9zdXJlRmluZGluZ1tdO1xufVxuXG50eXBlIENsYXNzTWVtYmVyRGVjbGFyYXRpb24gPSBHZXRBY2Nlc3NvckRlY2xhcmF0aW9uIHwgTWV0aG9kRGVjbGFyYXRpb24gfCBQcm9wZXJ0eURlY2xhcmF0aW9uIHwgU2V0QWNjZXNzb3JEZWNsYXJhdGlvbjtcblxudHlwZSBFeHBvcnRhYmxlRGVjbGFyYXRpb24gPSBDbGFzc0RlY2xhcmF0aW9uIHwgRW51bURlY2xhcmF0aW9uIHwgRnVuY3Rpb25EZWNsYXJhdGlvbiB8IEludGVyZmFjZURlY2xhcmF0aW9uIHwgVHlwZUFsaWFzRGVjbGFyYXRpb24gfCBWYXJpYWJsZVN0YXRlbWVudDtcblxuaW50ZXJmYWNlIEV4cG9ydEZpbmRpbmdDYW5kaWRhdGUge1xuICByZWFkb25seSBmaW5kaW5nOiBPdmVyRXhwb3N1cmVGaW5kaW5nO1xuICByZWFkb25seSBpc1BsYWluRmlsZUxvY2FsOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgRmluZGluZ0ZsYWdzIHtcbiAgcmVhZG9ubHkgaGFzTm9SZWZlcmVuY2VzOiBib29sZWFuO1xuICByZWFkb25seSBpc0ZvcmNlZEJ5VGVzdE9ubHk6IGJvb2xlYW47XG59XG5cbnR5cGUgTWVtYmVyRXhwb3N1cmUgPSAncHJpdmF0ZScgfCAncHJvdGVjdGVkJyB8ICdwdWJsaWMnO1xuXG4vKipcbiAqIEEgc2luZ2xlIGluLXBsYWNlIHRleHQgcmVwbGFjZW1lbnQgdGhhdCB0aWdodGVucyBhIGRlY2xhcmF0aW9uJ3MgZXhwb3N1cmUuIEEgemVyby1sZW5ndGggZWRpdCBpc1xuICogYW4gaW5zZXJ0aW9uIChlLmcuIGFkZGluZyBhbiBleHBsaWNpdCBgcHJpdmF0ZWAgbW9kaWZpZXIgdG8gYW4gaW1wbGljaXRseS1gcHVibGljYCBtZW1iZXIpLlxuICovXG5pbnRlcmZhY2UgT3ZlckV4cG9zdXJlVGV4dEVkaXQge1xuICByZWFkb25seSBmaWxlTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBsZW5ndGg6IG51bWJlcjtcbiAgcmVhZG9ubHkgbmV3VGV4dDogc3RyaW5nO1xuICByZWFkb25seSBzdGFydDogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgUmVmZXJlbmNlTG9jYXRpb24ge1xuICByZWFkb25seSBmaWxlTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBzdGFydDogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgU291cmNlRmlsZVRleHQge1xuICByZWFkb25seSBmaWxlTmFtZTogc3RyaW5nO1xuICByZWFkb25seSB0ZXh0OiBzdHJpbmc7XG59XG5cbi8vIEEgSlNEb2MvVFNEb2MgY29tbWVudCBvcGVucyB3aXRoIGAvKipgOiB0aGUgY2hhcmFjdGVyIGF0IG9mZnNldCAyIGlzIHRoZSBzZWNvbmQgYCpgLCBhbmQgdG8gZXhjbHVkZSB0aGUgZW1wdHkgYC8qKi9gIGNvbW1lbnQgdGhlIGNoYXJhY3RlciBhdCBvZmZzZXQgMyBtdXN0IG5vdCBiZSB0aGUgY2xvc2luZyBgL2AuXG5jb25zdCBKU0RPQ19TRUNPTkRfQVNURVJJU0tfT0ZGU0VUID0gMjtcbmNvbnN0IEpTRE9DX0ZPVVJUSF9DSEFSQUNURVJfT0ZGU0VUID0gMztcbmNvbnN0IE1FTUJFUl9FWFBPU1VSRV9PUkRFUjogcmVhZG9ubHkgTWVtYmVyRXhwb3N1cmVbXSA9IFsncHJpdmF0ZScsICdwcm90ZWN0ZWQnLCAncHVibGljJ107XG5jb25zdCBTQ09QRV9ERVNDUklQVElPTjogUmVjb3JkPFN1Z2dlc3RlZEV4cG9zdXJlLCBzdHJpbmc+ID0ge1xuICAnZmlsZS1sb2NhbCc6ICd3aXRoaW4gaXRzIG93biBmaWxlJyxcbiAgJ3ByaXZhdGUnOiAnaW5zaWRlIGl0cyBvd24gY2xhc3MnLFxuICAncHJvdGVjdGVkJzogJ2luc2lkZSBpdHMgY2xhc3MgKyBzdWJjbGFzc2VzJ1xufTtcbmNvbnN0IFNLSVBfUkVBU09OX0RFU0NSSVBUSU9OOiBSZWNvcmQ8T3ZlckV4cG9zdXJlU2tpcFJlYXNvbiwgc3RyaW5nPiA9IHtcbiAgJ2RlY29yYXRlZCc6ICdkZWNvcmF0ZWQgbWVtYmVyJyxcbiAgJ3NoYXJlZC1leHBvcnQnOiAnZXhwb3J0IHNoYXJlZCB3aXRoIGEgc3RpbGwtZXhwb3J0ZWQgc2libGluZycsXG4gICd0ZXN0LW9ubHknOiAnZXhwb3NlZCBvbmx5IGZvciB0ZXN0cydcbn07XG5jb25zdCBWSVNJQklMSVRZX01PRElGSUVSX0tJTkRTOiBSZWFkb25seVNldDxTeW50YXhLaW5kPiA9IG5ldyBTZXQ8U3ludGF4S2luZD4oW1N5bnRheEtpbmQuUHJpdmF0ZUtleXdvcmQsIFN5bnRheEtpbmQuUHJvdGVjdGVkS2V5d29yZCwgU3ludGF4S2luZC5QdWJsaWNLZXl3b3JkXSk7XG5jb25zdCBXSElURVNQQUNFX1BBVFRFUk4gPSAvXFxzLztcblxuLyoqXG4gKiBBbmFseXplcyBhIHByb2plY3QgKGFscmVhZHkgbG9hZGVkIGludG8gYSBsYW5ndWFnZSBzZXJ2aWNlKSBmb3Igb3Zlci1leHBvc2VkIGRlY2xhcmF0aW9ucywgYW5kIFx1MjAxNFxuICogd2hlbiB7QGxpbmsgQW5hbHl6ZU92ZXJFeHBvc3VyZVBhcmFtcy5zaG91bGRGaXh9IGlzIHNldCBcdTIwMTQgdGlnaHRlbnMgZXZlcnkgZml4YWJsZSBmaW5kaW5nIGluIHBsYWNlXG4gKiB2aWEge0BsaW5rIEFuYWx5emVPdmVyRXhwb3N1cmVQYXJhbXMud3JpdGVGaWxlfS4gRmluZGluZ3MgdGhhdCBjYW5ub3QgYmUgc2FmZWx5IGF1dG9tYXRlZCAoZXhwb3NlZFxuICogb25seSBmb3IgdGVzdHMsIGRlY29yYXRlZCwgb3Igc2hhcmluZyBhbiBgZXhwb3J0YCBrZXl3b3JkIHdpdGggYSBzdGlsbC1leHBvcnRlZCBzaWJsaW5nKSBjYXJyeSBhXG4gKiB7QGxpbmsgT3ZlckV4cG9zdXJlRmluZGluZy5za2lwUmVhc29ufSBhbmQgYXJlIGxlZnQgdW50b3VjaGVkIFx1MjAxNCB1bmxlc3NcbiAqIHtAbGluayBBbmFseXplT3ZlckV4cG9zdXJlUGFyYW1zLnNob3VsZEZvcmNlfSBpcyBzZXQsIHdoaWNoIGFkZGl0aW9uYWxseSB0aWdodGVucyB0aGUgdGVzdC1vbmx5XG4gKiBmaW5kaW5ncyAoZGVjb3JhdGVkIGFuZCBzaGFyZWQtZXhwb3J0IG9uZXMgc3RpbGwgc3RheSBza2lwcGVkKS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBBbmFseXplT3ZlckV4cG9zdXJlUGFyYW1zfS5cbiAqIEByZXR1cm5zIFRoZSBvdmVyLWV4cG9zZWQgZGVjbGFyYXRpb25zLCBpbiBkaXNjb3Zlcnkgb3JkZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhbmFseXplT3ZlckV4cG9zdXJlKHBhcmFtczogQW5hbHl6ZU92ZXJFeHBvc3VyZVBhcmFtcyk6IE92ZXJFeHBvc3VyZUZpbmRpbmdbXSB7XG4gIGNvbnN0IHJlc3VsdCA9IHJ1bk92ZXJFeHBvc3VyZUFuYWx5c2lzKHBhcmFtcyk7XG4gIGlmICghcGFyYW1zLnNob3VsZEZpeCkge1xuICAgIHJldHVybiBbLi4ucmVzdWx0LmZpbmRpbmdzXTtcbiAgfVxuXG4gIGNvbnN0IHsgd3JpdGVGaWxlIH0gPSBwYXJhbXM7XG4gIGFzc2VydE5vbk51bGxhYmxlKHdyaXRlRmlsZSwgJ3dyaXRlRmlsZSBpcyByZXF1aXJlZCB3aGVuIHNob3VsZEZpeCBpcyB0cnVlLicpO1xuICByZXR1cm4gYXBwbHlPdmVyRXhwb3N1cmVGaXhlcyhyZXN1bHQsIHBhcmFtcy5sYW5ndWFnZVNlcnZpY2UuZ2V0UHJvZ3JhbSgpLCB3cml0ZUZpbGUsIHBhcmFtcy5zaG91bGRGb3JjZSA/PyBmYWxzZSk7XG59XG5cbi8qKlxuICogQnVpbGRzIGEge0BsaW5rIExhbmd1YWdlU2VydmljZUhvc3R9IGJhY2tlZCBieSBhbiBleHBsaWNpdCBmaWxlIGxpc3QgYW5kIGZpbGUgc3lzdGVtLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIENyZWF0ZUxhbmd1YWdlU2VydmljZUhvc3RQYXJhbXN9LlxuICogQHJldHVybnMgVGhlIGxhbmd1YWdlLXNlcnZpY2UgaG9zdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUxhbmd1YWdlU2VydmljZUhvc3QocGFyYW1zOiBDcmVhdGVMYW5ndWFnZVNlcnZpY2VIb3N0UGFyYW1zKTogTGFuZ3VhZ2VTZXJ2aWNlSG9zdCB7XG4gIGNvbnN0IHsgY29tcGlsZXJPcHRpb25zLCBmaWxlTmFtZXMsIGZpbGVTeXN0ZW0gfSA9IHBhcmFtcztcbiAgcmV0dXJuIHtcbiAgICBkaXJlY3RvcnlFeGlzdHM6IChkaXJlY3RvcnkpID0+IGZpbGVTeXN0ZW0uZGlyZWN0b3J5RXhpc3RzKGRpcmVjdG9yeSksXG4gICAgZmlsZUV4aXN0czogKGZpbGUpID0+IGZpbGVTeXN0ZW0uZmlsZUV4aXN0cyhmaWxlKSxcbiAgICBnZXRDb21waWxhdGlvblNldHRpbmdzOiAoKSA9PiBjb21waWxlck9wdGlvbnMsXG4gICAgZ2V0Q3VycmVudERpcmVjdG9yeTogKCkgPT4gZmlsZVN5c3RlbS5nZXRDdXJyZW50RGlyZWN0b3J5KCksXG4gICAgZ2V0RGVmYXVsdExpYkZpbGVOYW1lOiAobGliT3B0aW9ucykgPT4gZ2V0RGVmYXVsdExpYkZpbGVQYXRoKGxpYk9wdGlvbnMpLFxuICAgIGdldERpcmVjdG9yaWVzOiAoZGlyZWN0b3J5KSA9PiBmaWxlU3lzdGVtLmdldERpcmVjdG9yaWVzKGRpcmVjdG9yeSksXG4gICAgZ2V0U2NyaXB0RmlsZU5hbWVzOiAoKSA9PiBbLi4uZmlsZU5hbWVzXSxcbiAgICBnZXRTY3JpcHRTbmFwc2hvdDogKGZpbGVOYW1lKTogSVNjcmlwdFNuYXBzaG90IHwgdW5kZWZpbmVkID0+IHtcbiAgICAgIGNvbnN0IHRleHQgPSBmaWxlU3lzdGVtLnJlYWRGaWxlKGZpbGVOYW1lKTtcbiAgICAgIHJldHVybiB0ZXh0ID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBTY3JpcHRTbmFwc2hvdC5mcm9tU3RyaW5nKHRleHQpO1xuICAgIH0sXG4gICAgZ2V0U2NyaXB0VmVyc2lvbjogKCkgPT4gJzAnLFxuICAgIHJlYWREaXJlY3Rvcnk6IChwYXRoLCBleHRlbnNpb25zLCBleGNsdWRlLCBpbmNsdWRlLCBkZXB0aCkgPT4gZmlsZVN5c3RlbS5yZWFkRGlyZWN0b3J5KHBhdGgsIGV4dGVuc2lvbnMsIGV4Y2x1ZGUsIGluY2x1ZGUsIGRlcHRoKSxcbiAgICByZWFkRmlsZTogKGZpbGUpID0+IGZpbGVTeXN0ZW0ucmVhZEZpbGUoZmlsZSlcbiAgfTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBsYW5ndWFnZSBzZXJ2aWNlIG92ZXIgZXZlcnkgZmlsZSBpbiBhIHByb2plY3QncyBgdHNjb25maWcuanNvbmAuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSB7QGxpbmsgQ3JlYXRlUHJvamVjdExhbmd1YWdlU2VydmljZVBhcmFtc30uXG4gKiBAcmV0dXJucyBBIGxhbmd1YWdlIHNlcnZpY2UgcmVhZHkgZm9yIHtAbGluayBhbmFseXplT3ZlckV4cG9zdXJlfS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVByb2plY3RMYW5ndWFnZVNlcnZpY2UocGFyYW1zOiBDcmVhdGVQcm9qZWN0TGFuZ3VhZ2VTZXJ2aWNlUGFyYW1zKTogTGFuZ3VhZ2VTZXJ2aWNlIHtcbiAgY29uc3QgeyBmaWxlTmFtZXMsIG9wdGlvbnMgfSA9IHBhcnNlVHNDb25maWcocGFyYW1zLnRzQ29uZmlnUGF0aCk7XG4gIHJldHVybiBjcmVhdGVMYW5ndWFnZVNlcnZpY2UoY3JlYXRlTGFuZ3VhZ2VTZXJ2aWNlSG9zdCh7IGNvbXBpbGVyT3B0aW9uczogb3B0aW9ucywgZmlsZU5hbWVzLCBmaWxlU3lzdGVtOiBzeXMgfSksIGNyZWF0ZURvY3VtZW50UmVnaXN0cnkoKSk7XG59XG5cbi8qKlxuICogRmluZHMgb3Zlci1leHBvc2VkIGRlY2xhcmF0aW9ucyBpbiBhIHByb2plY3Qgb24gZGlzay4gV2hlblxuICoge0BsaW5rIEZpbmRPdmVyRXhwb3N1cmVQYXJhbXMuc2hvdWxkRml4fSBpcyBzZXQsIGVhY2ggZml4YWJsZSBmaW5kaW5nIGlzIGFsc28gdGlnaHRlbmVkIGluIHBsYWNlXG4gKiAocmV3cml0aW5nIHRoZSBhZmZlY3RlZCBzb3VyY2UgZmlsZXMgdmlhIGB0eXBlc2NyaXB0YCdzIGBzeXMud3JpdGVGaWxlYCkuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSB7QGxpbmsgRmluZE92ZXJFeHBvc3VyZVBhcmFtc30uXG4gKiBAcmV0dXJucyBUaGUgb3Zlci1leHBvc2VkIGRlY2xhcmF0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRPdmVyRXhwb3N1cmUocGFyYW1zOiBGaW5kT3ZlckV4cG9zdXJlUGFyYW1zKTogT3ZlckV4cG9zdXJlRmluZGluZ1tdIHtcbiAgY29uc3QgcHJvamVjdEZvbGRlciA9IHRvQ2Fub25pY2FsKHBhcmFtcy5wcm9qZWN0Rm9sZGVyKTtcbiAgY29uc3QgbGFuZ3VhZ2VTZXJ2aWNlID0gY3JlYXRlUHJvamVjdExhbmd1YWdlU2VydmljZSh7IHRzQ29uZmlnUGF0aDogYCR7cHJvamVjdEZvbGRlcn0vdHNjb25maWcuanNvbmAgfSk7XG4gIHJldHVybiBhbmFseXplT3ZlckV4cG9zdXJlKHtcbiAgICBsYW5ndWFnZVNlcnZpY2UsXG4gICAgc2hvdWxkRml4OiBwYXJhbXMuc2hvdWxkRml4LFxuICAgIHNob3VsZEZvcmNlOiBwYXJhbXMuc2hvdWxkRm9yY2UsXG4gICAgc3JjRm9sZGVyOiBgJHtwcm9qZWN0Rm9sZGVyfS9zcmNgLFxuICAgIHdyaXRlRmlsZTogKHBhdGgsIGNvbnRlbnQpID0+IHtcbiAgICAgIHN5cy53cml0ZUZpbGUocGF0aCwgY29udGVudCk7XG4gICAgfSxcbiAgICAuLi5wYXJhbXMub25Qcm9ncmVzcyA/IHsgb25Qcm9ncmVzczogcGFyYW1zLm9uUHJvZ3Jlc3MgfSA6IHt9XG4gIH0pO1xufVxuXG4vKipcbiAqIEZvcm1hdHMgb3Zlci1leHBvc3VyZSBmaW5kaW5ncyBhcyBhIGh1bWFuLXJlYWRhYmxlIHJlcG9ydCwgdXNpbmcgdGhlIGdyb3VwZWQgbGF5b3V0IG9mIEVTTGludCdzXG4gKiBgc3R5bGlzaGAgZm9ybWF0dGVyLiBGaW5kaW5ncyBhcmUgZ3JvdXBlZCBieSBmaWxlIGFuZCBzb3J0ZWQgYnkgbGluZTogZWFjaCBmaWxlIGlzIHJlbmRlcmVkIGFzIGFcbiAqIGBwYXRoYCBoZWFkZXIgbGluZSwgZm9sbG93ZWQgYnkgb25lIGluZGVudGVkIGAgIGxpbmU6Y29sdW1uICBjaGFuZ2UgLS0gcmVhc29uYCByb3cgcGVyIGZpbmRpbmcgKHRoZVxuICogYGxpbmU6Y29sdW1uYCBpcyByaWdodC1wYWRkZWQgc28gdGhlIHJvd3MgYWxpZ24gd2l0aGluIGEgZmlsZSkuIFRlcm1pbmFscyBzdWNoIGFzIFZTIENvZGUgcmVuZGVyXG4gKiBlYWNoIGluZGVudGVkIGBsaW5lOmNvbHVtbmAgYXMgYSBjbGlja2FibGUgbGluayBcdTIwMTQgcmVzb2x2ZWQgYWdhaW5zdCB0aGUgZmlsZSBoZWFkZXIgYWJvdmUgaXQgXHUyMDE0IHRoYXRcbiAqIGp1bXBzIHN0cmFpZ2h0IHRvIHRoZSBkZWNsYXJhdGlvbi4gRmlsZSBncm91cHMgYXJlIHNlcGFyYXRlZCBieSBhIGJsYW5rIGxpbmUuIEluIGEgZml4IHJ1biAoZmluZGluZ3NcbiAqIGNhcnJ5aW5nIHtAbGluayBPdmVyRXhwb3N1cmVGaW5kaW5nLndhc0ZpeGVkfSAvIHtAbGluayBPdmVyRXhwb3N1cmVGaW5kaW5nLnNraXBSZWFzb259KSBlYWNoIGNoYW5nZVxuICogcm93IGlzIHN1ZmZpeGVkIHdpdGggYFtmaXhlZF1gIG9yIGBbc2tpcHBlZDogXHUyMDI2XWAsIGFuZCB0aGUgdHJhaWxpbmcgc3VtbWFyeSBhcHBlbmRzIHRoZSBmaXhlZC9za2lwcGVkXG4gKiBjb3VudHMuXG4gKlxuICogQHBhcmFtIGZpbmRpbmdzIC0gVGhlIGZpbmRpbmdzIHRvIGZvcm1hdC5cbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHtAbGluayBGb3JtYXRPdmVyRXhwb3N1cmVGaW5kaW5nc09wdGlvbnN9LlxuICogQHJldHVybnMgVGhlIHJlcG9ydCB0ZXh0LiBFbXB0eS1maW5kaW5nIGlucHV0IHlpZWxkcyBhIHNpbmdsZSBcIm5vIGZpbmRpbmdzXCIgbGluZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdE92ZXJFeHBvc3VyZUZpbmRpbmdzKGZpbmRpbmdzOiByZWFkb25seSBPdmVyRXhwb3N1cmVGaW5kaW5nW10sIG9wdGlvbnM/OiBGb3JtYXRPdmVyRXhwb3N1cmVGaW5kaW5nc09wdGlvbnMpOiBzdHJpbmcge1xuICBpZiAoZmluZGluZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuICdObyBvdmVyLWV4cG9zZWQgZGVjbGFyYXRpb25zIGZvdW5kLlxcbic7XG4gIH1cblxuICBjb25zdCBiYXNlRm9sZGVyID0gb3B0aW9ucz8uYmFzZUZvbGRlciA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogdG9DYW5vbmljYWwob3B0aW9ucy5iYXNlRm9sZGVyKTtcbiAgY29uc3QgbGluZXMgPSBmb3JtYXRGaW5kaW5nQmxvY2tzKGZpbmRpbmdzLCBiYXNlRm9sZGVyKTtcbiAgbGluZXMucHVzaChmb3JtYXRTdW1tYXJ5KGZpbmRpbmdzKSk7XG4gIHJldHVybiBgJHtsaW5lcy5qb2luKCdcXG4nKX1cXG5gO1xufVxuXG5mdW5jdGlvbiBhbmFseXplRXhwb3J0KG5vZGU6IE5vZGUsIGNvbnRleHQ6IEFuYWx5c2lzQ29udGV4dCk6IHZvaWQge1xuICBjb25zdCBzb3VyY2VGaWxlID0gbm9kZS5nZXRTb3VyY2VGaWxlKCk7XG4gIGlmIChub2RlLnBhcmVudCAhPT0gc291cmNlRmlsZSB8fCAhZ2V0TW9kaWZpZXJLaW5kcyhub2RlKS5oYXMoU3ludGF4S2luZC5FeHBvcnRLZXl3b3JkKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGRlY2xhcmF0aW9uID0gYXNFeHBvcnRhYmxlRGVjbGFyYXRpb24obm9kZSk7XG4gIGlmICghZGVjbGFyYXRpb24pIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoaGFzVHNEb2NDb21tZW50KGRlY2xhcmF0aW9uKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGRlY2xGaWxlUGF0aCA9IHRvQ2Fub25pY2FsKHNvdXJjZUZpbGUuZmlsZU5hbWUpO1xuICBjb25zdCBuYW1lTm9kZXMgPSBnZXRFeHBvcnRlZE5hbWVOb2RlcyhkZWNsYXJhdGlvbik7XG4gIGNvbnN0IGNhbmRpZGF0ZXM6IEV4cG9ydEZpbmRpbmdDYW5kaWRhdGVbXSA9IFtdO1xuICBmb3IgKGNvbnN0IG5hbWVOb2RlIG9mIG5hbWVOb2Rlcykge1xuICAgIGNvbnN0IHJlZmVyZW5jZXMgPSBjb2xsZWN0UmVmZXJlbmNlcyhjb250ZXh0Lmxhbmd1YWdlU2VydmljZS5maW5kUmVmZXJlbmNlcyhzb3VyY2VGaWxlLmZpbGVOYW1lLCBuYW1lTm9kZS5nZXRTdGFydCgpKSlcbiAgICAgIC5maWx0ZXIoKHJlZmVyZW5jZSkgPT4gIWlzRGVjbGFyYXRpb25JdHNlbGYocmVmZXJlbmNlLCBuYW1lTm9kZSkpO1xuICAgIGNvbnN0IG90aGVyRmlsZVJlZmVyZW5jZXMgPSByZWZlcmVuY2VzLmZpbHRlcigocmVmZXJlbmNlKSA9PiB0b0Nhbm9uaWNhbChyZWZlcmVuY2UuZmlsZU5hbWUpICE9PSBkZWNsRmlsZVBhdGgpO1xuXG4gICAgaWYgKG90aGVyRmlsZVJlZmVyZW5jZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjYW5kaWRhdGVzLnB1c2goe1xuICAgICAgICBmaW5kaW5nOiBidWlsZEZpbmRpbmcoZGVjbGFyYXRpb24sIG5hbWVOb2RlLCAnZXhwb3J0JywgJ2ZpbGUtbG9jYWwnLCB7IGhhc05vUmVmZXJlbmNlczogcmVmZXJlbmNlcy5sZW5ndGggPT09IDAsIGlzRm9yY2VkQnlUZXN0T25seTogZmFsc2UgfSksXG4gICAgICAgIGlzUGxhaW5GaWxlTG9jYWw6IHRydWVcbiAgICAgIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3Qgbm9uVGVzdFJlZmVyZW5jZXMgPSBvdGhlckZpbGVSZWZlcmVuY2VzLmZpbHRlcigocmVmZXJlbmNlKSA9PiAhaXNUZXN0RmlsZSh0b0Nhbm9uaWNhbChyZWZlcmVuY2UuZmlsZU5hbWUpKSk7XG4gICAgaWYgKG5vblRlc3RSZWZlcmVuY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY2FuZGlkYXRlcy5wdXNoKHtcbiAgICAgICAgZmluZGluZzogYnVpbGRGaW5kaW5nKGRlY2xhcmF0aW9uLCBuYW1lTm9kZSwgJ2V4cG9ydCcsICdmaWxlLWxvY2FsJywgeyBoYXNOb1JlZmVyZW5jZXM6IGZhbHNlLCBpc0ZvcmNlZEJ5VGVzdE9ubHk6IHRydWUgfSksXG4gICAgICAgIGlzUGxhaW5GaWxlTG9jYWw6IGZhbHNlXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBpZiAoY2FuZGlkYXRlcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBjYW5Ecm9wRXhwb3J0ID0gY2FuZGlkYXRlcy5sZW5ndGggPT09IG5hbWVOb2Rlcy5sZW5ndGggJiYgY2FuZGlkYXRlcy5ldmVyeSgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUuaXNQbGFpbkZpbGVMb2NhbCB8fCBjb250ZXh0LnNob3VsZEZvcmNlKTtcbiAgY29uc3QgZXhwb3J0RWRpdCA9IGNhbkRyb3BFeHBvcnQgPyBjb21wdXRlRXhwb3J0UmVtb3ZhbEVkaXQoZGVjbGFyYXRpb24pIDogbnVsbDtcbiAgZm9yIChjb25zdCBjYW5kaWRhdGUgb2YgY2FuZGlkYXRlcykge1xuICAgIHJlY29yZChjb250ZXh0LCBjYW5kaWRhdGUuZmluZGluZywgZXhwb3J0RWRpdCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYW5hbHl6ZU1lbWJlcihub2RlOiBOb2RlLCBjb250ZXh0OiBBbmFseXNpc0NvbnRleHQpOiB2b2lkIHtcbiAgY29uc3QgbWVtYmVyID0gYXNDbGFzc01lbWJlcihub2RlKTtcbiAgaWYgKCFtZW1iZXIgfHwgIWlzQ2xhc3NMaWtlKG5vZGUucGFyZW50KSkge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBuYW1lTm9kZSA9IG1lbWJlci5uYW1lO1xuICBjb25zdCBkZWNsYXJpbmdDbGFzcyA9IG5vZGUucGFyZW50O1xuXG4gIGlmIChpc1ByaXZhdGVJZGVudGlmaWVyKG5hbWVOb2RlKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IG1vZGlmaWVyS2luZHMgPSBnZXRNb2RpZmllcktpbmRzKG1lbWJlcik7XG4gIGlmIChtb2RpZmllcktpbmRzLmhhcyhTeW50YXhLaW5kLlN0YXRpY0tleXdvcmQpIHx8IG1vZGlmaWVyS2luZHMuaGFzKFN5bnRheEtpbmQuT3ZlcnJpZGVLZXl3b3JkKSB8fCBMSUZFQ1lDTEVfQUxMT1dMSVNULmhhcyhuYW1lTm9kZS5nZXRUZXh0KCkpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGhhc1RzRG9jQ29tbWVudChtZW1iZXIpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgY3VycmVudEV4cG9zdXJlID0gZ2V0Q3VycmVudE1lbWJlckV4cG9zdXJlKG1vZGlmaWVyS2luZHMpO1xuICBpZiAoY3VycmVudEV4cG9zdXJlID09PSAncHJpdmF0ZScpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBzb3VyY2VGaWxlID0gbWVtYmVyLmdldFNvdXJjZUZpbGUoKTtcbiAgY29uc3QgcmVmZXJlbmNlcyA9IGNvbGxlY3RSZWZlcmVuY2VzKGNvbnRleHQubGFuZ3VhZ2VTZXJ2aWNlLmZpbmRSZWZlcmVuY2VzKHNvdXJjZUZpbGUuZmlsZU5hbWUsIG5hbWVOb2RlLmdldFN0YXJ0KCkpKVxuICAgIC5maWx0ZXIoKHJlZmVyZW5jZSkgPT4gIWlzRGVjbGFyYXRpb25JdHNlbGYocmVmZXJlbmNlLCBuYW1lTm9kZSkpO1xuICBjb25zdCBub25UZXN0UmVmZXJlbmNlcyA9IHJlZmVyZW5jZXMuZmlsdGVyKChyZWZlcmVuY2UpID0+ICFpc1Rlc3RGaWxlKHRvQ2Fub25pY2FsKHJlZmVyZW5jZS5maWxlTmFtZSkpKTtcblxuICBjb25zdCBuZWVkZWRGb3JTcmMgPSBjb21wdXRlTmVlZGVkRXhwb3N1cmUobm9uVGVzdFJlZmVyZW5jZXMsIGRlY2xhcmluZ0NsYXNzLCBjb250ZXh0KTtcbiAgY29uc3QgbmVlZGVkV2l0aFRlc3RzID0gY29tcHV0ZU5lZWRlZEV4cG9zdXJlKHJlZmVyZW5jZXMsIGRlY2xhcmluZ0NsYXNzLCBjb250ZXh0KTtcblxuICBpZiAobmVlZGVkRm9yU3JjID09PSAncHVibGljJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChyYW5rRXhwb3N1cmUobmVlZGVkRm9yU3JjKSA+PSByYW5rRXhwb3N1cmUoY3VycmVudEV4cG9zdXJlKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGZpbmRpbmcgPSBidWlsZEZpbmRpbmcobWVtYmVyLCBuYW1lTm9kZSwgY3VycmVudEV4cG9zdXJlLCBuZWVkZWRGb3JTcmMsIHtcbiAgICBoYXNOb1JlZmVyZW5jZXM6IHJlZmVyZW5jZXMubGVuZ3RoID09PSAwLFxuICAgIGlzRm9yY2VkQnlUZXN0T25seTogcmFua0V4cG9zdXJlKG5lZWRlZFdpdGhUZXN0cykgPiByYW5rRXhwb3N1cmUobmVlZGVkRm9yU3JjKVxuICB9KTtcbiAgcmVjb3JkKGNvbnRleHQsIGZpbmRpbmcsIGNvbXB1dGVNZW1iZXJFeHBvc3VyZUVkaXQobWVtYmVyLCBuZWVkZWRGb3JTcmMpKTtcbn1cblxuZnVuY3Rpb24gYXBwbHlFZGl0cyh0ZXh0OiBzdHJpbmcsIGVkaXRzOiByZWFkb25seSBPdmVyRXhwb3N1cmVUZXh0RWRpdFtdKTogc3RyaW5nIHtcbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCB1bmlxdWVFZGl0cyA9IGVkaXRzXG4gICAgLmZpbHRlcigoZWRpdCkgPT4ge1xuICAgICAgY29uc3Qga2V5ID0gYCR7U3RyaW5nKGVkaXQuc3RhcnQpfToke1N0cmluZyhlZGl0Lmxlbmd0aCl9OiR7ZWRpdC5uZXdUZXh0fWA7XG4gICAgICBpZiAoc2Vlbi5oYXMoa2V5KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBzZWVuLmFkZChrZXkpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSlcbiAgICAuc29ydCgoYSwgYikgPT4gYi5zdGFydCAtIGEuc3RhcnQpO1xuXG4gIGxldCByZXN1bHQgPSB0ZXh0O1xuICBmb3IgKGNvbnN0IGVkaXQgb2YgdW5pcXVlRWRpdHMpIHtcbiAgICByZXN1bHQgPSBgJHtyZXN1bHQuc2xpY2UoMCwgZWRpdC5zdGFydCl9JHtlZGl0Lm5ld1RleHR9JHtyZXN1bHQuc2xpY2UoZWRpdC5zdGFydCArIGVkaXQubGVuZ3RoKX1gO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGFwcGx5T3ZlckV4cG9zdXJlRml4ZXMoXG4gIHJlc3VsdDogQW5hbHlzaXNSZXN1bHQsXG4gIHByb2dyYW06IFByb2dyYW0gfCB1bmRlZmluZWQsXG4gIHdyaXRlRmlsZTogKHRoaXM6IHZvaWQsIHBhdGg6IHN0cmluZywgY29udGVudDogc3RyaW5nKSA9PiB2b2lkLFxuICBzaG91bGRGb3JjZTogYm9vbGVhblxuKTogT3ZlckV4cG9zdXJlRmluZGluZ1tdIHtcbiAgY29uc3QgZWRpdHNCeUZpbGUgPSBuZXcgTWFwPHN0cmluZywgT3ZlckV4cG9zdXJlVGV4dEVkaXRbXT4oKTtcbiAgY29uc3QgZmluZGluZ3MgPSByZXN1bHQuZmluZGluZ3MubWFwKChmaW5kaW5nLCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IGVkaXQgPSByZXN1bHQuZWRpdHNbaW5kZXhdID8/IG51bGw7XG4gICAgY29uc3Qgc2tpcFJlYXNvbiA9IGRldGVybWluZVNraXBSZWFzb24oZmluZGluZywgZWRpdCwgc2hvdWxkRm9yY2UpO1xuICAgIGlmIChza2lwUmVhc29uICE9PSBudWxsKSB7XG4gICAgICByZXR1cm4geyAuLi5maW5kaW5nLCBza2lwUmVhc29uLCB3YXNGaXhlZDogZmFsc2UgfTtcbiAgICB9XG4gICAgYXNzZXJ0Tm9uTnVsbGFibGUoZWRpdCwgJ0EgZml4YWJsZSBmaW5kaW5nIG11c3QgY2FycnkgYSB0ZXh0IGVkaXQuJyk7XG4gICAgY29uc3QgZmlsZUVkaXRzID0gZWRpdHNCeUZpbGUuZ2V0KGVkaXQuZmlsZU5hbWUpID8/IFtdO1xuICAgIGZpbGVFZGl0cy5wdXNoKGVkaXQpO1xuICAgIGVkaXRzQnlGaWxlLnNldChlZGl0LmZpbGVOYW1lLCBmaWxlRWRpdHMpO1xuICAgIHJldHVybiB7IC4uLmZpbmRpbmcsIHNraXBSZWFzb246IG51bGwsIHdhc0ZpeGVkOiB0cnVlIH07XG4gIH0pO1xuXG4gIGlmIChlZGl0c0J5RmlsZS5zaXplID4gMCkge1xuICAgIGFzc2VydE5vbk51bGxhYmxlKHByb2dyYW0sICdBIHByb2dyYW0gaXMgZXhwZWN0ZWQgd2hlbiB0aGVyZSBhcmUgZWRpdHMgdG8gYXBwbHkuJyk7XG4gICAgY29uc3Qgc291cmNlVGV4dEJ5RmlsZSA9IG5ldyBNYXA8c3RyaW5nLCBTb3VyY2VGaWxlVGV4dD4oKTtcbiAgICBmb3IgKGNvbnN0IHNvdXJjZUZpbGUgb2YgcHJvZ3JhbS5nZXRTb3VyY2VGaWxlcygpKSB7XG4gICAgICBzb3VyY2VUZXh0QnlGaWxlLnNldCh0b0Nhbm9uaWNhbChzb3VyY2VGaWxlLmZpbGVOYW1lKSwgeyBmaWxlTmFtZTogc291cmNlRmlsZS5maWxlTmFtZSwgdGV4dDogc291cmNlRmlsZS50ZXh0IH0pO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtjYW5vbmljYWxGaWxlTmFtZSwgZmlsZUVkaXRzXSBvZiBlZGl0c0J5RmlsZSkge1xuICAgICAgY29uc3Qgc291cmNlID0gc291cmNlVGV4dEJ5RmlsZS5nZXQoY2Fub25pY2FsRmlsZU5hbWUpO1xuICAgICAgYXNzZXJ0Tm9uTnVsbGFibGUoc291cmNlLCBgU291cmNlIGZpbGUgbm90IGZvdW5kIGluIHByb2dyYW06ICR7Y2Fub25pY2FsRmlsZU5hbWV9YCk7XG4gICAgICB3cml0ZUZpbGUoc291cmNlLmZpbGVOYW1lLCBhcHBseUVkaXRzKHNvdXJjZS50ZXh0LCBmaWxlRWRpdHMpKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmluZGluZ3M7XG59XG5cbmZ1bmN0aW9uIGFzQ2xhc3NNZW1iZXIobm9kZTogTm9kZSk6IENsYXNzTWVtYmVyRGVjbGFyYXRpb24gfCB1bmRlZmluZWQge1xuICBpZiAoaXNNZXRob2REZWNsYXJhdGlvbihub2RlKSB8fCBpc1Byb3BlcnR5RGVjbGFyYXRpb24obm9kZSkgfHwgaXNHZXRBY2Nlc3NvckRlY2xhcmF0aW9uKG5vZGUpIHx8IGlzU2V0QWNjZXNzb3JEZWNsYXJhdGlvbihub2RlKSkge1xuICAgIHJldHVybiBub2RlO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGFzRXhwb3J0YWJsZURlY2xhcmF0aW9uKG5vZGU6IE5vZGUpOiBFeHBvcnRhYmxlRGVjbGFyYXRpb24gfCB1bmRlZmluZWQge1xuICBpZiAoXG4gICAgaXNGdW5jdGlvbkRlY2xhcmF0aW9uKG5vZGUpXG4gICAgfHwgaXNDbGFzc0RlY2xhcmF0aW9uKG5vZGUpXG4gICAgfHwgaXNJbnRlcmZhY2VEZWNsYXJhdGlvbihub2RlKVxuICAgIHx8IGlzVHlwZUFsaWFzRGVjbGFyYXRpb24obm9kZSlcbiAgICB8fCBpc0VudW1EZWNsYXJhdGlvbihub2RlKVxuICAgIHx8IGlzVmFyaWFibGVTdGF0ZW1lbnQobm9kZSlcbiAgKSB7XG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gYnVpbGRGaW5kaW5nKFxuICBub2RlOiBOb2RlLFxuICBuYW1lTm9kZTogTm9kZSxcbiAgY3VycmVudEV4cG9zdXJlOiBDdXJyZW50RXhwb3N1cmUsXG4gIHN1Z2dlc3RlZEV4cG9zdXJlOiBTdWdnZXN0ZWRFeHBvc3VyZSxcbiAgZmxhZ3M6IEZpbmRpbmdGbGFnc1xuKTogT3ZlckV4cG9zdXJlRmluZGluZyB7XG4gIGNvbnN0IHNvdXJjZUZpbGUgPSBub2RlLmdldFNvdXJjZUZpbGUoKTtcbiAgY29uc3QgeyBjaGFyYWN0ZXIsIGxpbmUgfSA9IHNvdXJjZUZpbGUuZ2V0TGluZUFuZENoYXJhY3Rlck9mUG9zaXRpb24obmFtZU5vZGUuZ2V0U3RhcnQoKSk7XG4gIHJldHVybiB7XG4gICAgY29sdW1uOiBjaGFyYWN0ZXIgKyAxLFxuICAgIGN1cnJlbnRFeHBvc3VyZSxcbiAgICBmaWxlUGF0aDogdG9DYW5vbmljYWwoc291cmNlRmlsZS5maWxlTmFtZSksXG4gICAgaGFzTm9SZWZlcmVuY2VzOiBmbGFncy5oYXNOb1JlZmVyZW5jZXMsXG4gICAgaXNGb3JjZWRCeVRlc3RPbmx5OiBmbGFncy5pc0ZvcmNlZEJ5VGVzdE9ubHksXG4gICAgaXNNZW1iZXI6IGN1cnJlbnRFeHBvc3VyZSAhPT0gJ2V4cG9ydCcsXG4gICAgbGluZTogbGluZSArIDEsXG4gICAgbmFtZTogbmFtZU5vZGUuZ2V0VGV4dCgpLFxuICAgIHNraXBSZWFzb246IG51bGwsXG4gICAgc3VnZ2VzdGVkRXhwb3N1cmUsXG4gICAgd2FzRml4ZWQ6IGZhbHNlXG4gIH07XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3RSZWZlcmVuY2VzKHJlZmVyZW5jZWRTeW1ib2xzOiBSZWZlcmVuY2VkU3ltYm9sW10gfCB1bmRlZmluZWQpOiBSZWZlcmVuY2VMb2NhdGlvbltdIHtcbiAgY29uc3QgcmVmZXJlbmNlczogUmVmZXJlbmNlTG9jYXRpb25bXSA9IFtdO1xuICBmb3IgKGNvbnN0IHJlZmVyZW5jZWRTeW1ib2wgb2YgcmVmZXJlbmNlZFN5bWJvbHMgPz8gW10pIHtcbiAgICBmb3IgKGNvbnN0IHJlZmVyZW5jZSBvZiByZWZlcmVuY2VkU3ltYm9sLnJlZmVyZW5jZXMpIHtcbiAgICAgIHJlZmVyZW5jZXMucHVzaCh7IGZpbGVOYW1lOiByZWZlcmVuY2UuZmlsZU5hbWUsIHN0YXJ0OiByZWZlcmVuY2UudGV4dFNwYW4uc3RhcnQgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZWZlcmVuY2VzO1xufVxuXG5mdW5jdGlvbiBjb21wdXRlRXhwb3J0UmVtb3ZhbEVkaXQoZGVjbGFyYXRpb246IEV4cG9ydGFibGVEZWNsYXJhdGlvbik6IE92ZXJFeHBvc3VyZVRleHRFZGl0IHtcbiAgY29uc3Qgc291cmNlRmlsZSA9IGRlY2xhcmF0aW9uLmdldFNvdXJjZUZpbGUoKTtcbiAgY29uc3QgbW9kaWZpZXJzID0gZ2V0TW9kaWZpZXJzKGRlY2xhcmF0aW9uKTtcbiAgYXNzZXJ0Tm9uTnVsbGFibGUobW9kaWZpZXJzLCAnTW9kaWZpZXJzIGV4cGVjdGVkIG9uIGFuIGV4cG9ydGVkIGRlY2xhcmF0aW9uLicpO1xuICBjb25zdCBleHBvcnRNb2RpZmllciA9IG1vZGlmaWVycy5maW5kKChtb2RpZmllcikgPT4gbW9kaWZpZXIua2luZCA9PT0gU3ludGF4S2luZC5FeHBvcnRLZXl3b3JkKTtcbiAgYXNzZXJ0Tm9uTnVsbGFibGUoZXhwb3J0TW9kaWZpZXIsICdFeHBvcnQgbW9kaWZpZXIgZXhwZWN0ZWQgb24gYW4gZXhwb3J0ZWQgZGVjbGFyYXRpb24uJyk7XG4gIGNvbnN0IHsgdGV4dCB9ID0gc291cmNlRmlsZTtcbiAgbGV0IGVuZCA9IGV4cG9ydE1vZGlmaWVyLmdldEVuZCgpO1xuICB3aGlsZSAoZW5kIDwgdGV4dC5sZW5ndGggJiYgV0hJVEVTUEFDRV9QQVRURVJOLnRlc3QodGV4dC5jaGFyQXQoZW5kKSkpIHtcbiAgICBlbmQrKztcbiAgfVxuICByZXR1cm4ge1xuICAgIGZpbGVOYW1lOiB0b0Nhbm9uaWNhbChzb3VyY2VGaWxlLmZpbGVOYW1lKSxcbiAgICBsZW5ndGg6IGVuZCAtIGV4cG9ydE1vZGlmaWVyLmdldFN0YXJ0KCksXG4gICAgbmV3VGV4dDogJycsXG4gICAgc3RhcnQ6IGV4cG9ydE1vZGlmaWVyLmdldFN0YXJ0KClcbiAgfTtcbn1cblxuZnVuY3Rpb24gY29tcHV0ZU1lbWJlckV4cG9zdXJlRWRpdChtZW1iZXI6IENsYXNzTWVtYmVyRGVjbGFyYXRpb24sIHN1Z2dlc3RlZEV4cG9zdXJlOiAncHJpdmF0ZScgfCAncHJvdGVjdGVkJyk6IG51bGwgfCBPdmVyRXhwb3N1cmVUZXh0RWRpdCB7XG4gIGlmICgoZ2V0RGVjb3JhdG9ycyhtZW1iZXIpID8/IFtdKS5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBzb3VyY2VGaWxlID0gbWVtYmVyLmdldFNvdXJjZUZpbGUoKTtcbiAgY29uc3QgZmlsZU5hbWUgPSB0b0Nhbm9uaWNhbChzb3VyY2VGaWxlLmZpbGVOYW1lKTtcbiAgY29uc3QgbW9kaWZpZXJzID0gZ2V0TW9kaWZpZXJzKG1lbWJlcikgPz8gW107XG4gIGNvbnN0IHZpc2liaWxpdHlNb2RpZmllciA9IG1vZGlmaWVycy5maW5kKChtb2RpZmllcikgPT4gVklTSUJJTElUWV9NT0RJRklFUl9LSU5EUy5oYXMobW9kaWZpZXIua2luZCkpO1xuICBpZiAodmlzaWJpbGl0eU1vZGlmaWVyKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZpbGVOYW1lLFxuICAgICAgbGVuZ3RoOiB2aXNpYmlsaXR5TW9kaWZpZXIuZ2V0RW5kKCkgLSB2aXNpYmlsaXR5TW9kaWZpZXIuZ2V0U3RhcnQoKSxcbiAgICAgIG5ld1RleHQ6IHN1Z2dlc3RlZEV4cG9zdXJlLFxuICAgICAgc3RhcnQ6IHZpc2liaWxpdHlNb2RpZmllci5nZXRTdGFydCgpXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IGZpcnN0TW9kaWZpZXIgPSBtb2RpZmllcnNbMF07XG4gIGNvbnN0IGluc2VydFN0YXJ0ID0gZmlyc3RNb2RpZmllciA/IGZpcnN0TW9kaWZpZXIuZ2V0U3RhcnQoKSA6IG1lbWJlci5nZXRTdGFydCgpO1xuICByZXR1cm4ge1xuICAgIGZpbGVOYW1lLFxuICAgIGxlbmd0aDogMCxcbiAgICBuZXdUZXh0OiBgJHtzdWdnZXN0ZWRFeHBvc3VyZX0gYCxcbiAgICBzdGFydDogaW5zZXJ0U3RhcnRcbiAgfTtcbn1cblxuZnVuY3Rpb24gY29tcHV0ZU5lZWRlZEV4cG9zdXJlKFxuICByZWZlcmVuY2VzOiByZWFkb25seSBSZWZlcmVuY2VMb2NhdGlvbltdLFxuICBkZWNsYXJpbmdDbGFzczogQ2xhc3NMaWtlRGVjbGFyYXRpb24sXG4gIGNvbnRleHQ6IEFuYWx5c2lzQ29udGV4dFxuKTogTWVtYmVyRXhwb3N1cmUge1xuICBpZiAocmVmZXJlbmNlcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gJ3ByaXZhdGUnO1xuICB9XG5cbiAgbGV0IG5lZWRlZDogTWVtYmVyRXhwb3N1cmUgPSAncHJpdmF0ZSc7XG4gIGZvciAoY29uc3QgcmVmZXJlbmNlIG9mIHJlZmVyZW5jZXMpIHtcbiAgICBjb25zdCByZWZlcmVuY2VDbGFzcyA9IGdldENsYXNzQXRQb3NpdGlvbihjb250ZXh0LnByb2dyYW0sIHJlZmVyZW5jZS5maWxlTmFtZSwgcmVmZXJlbmNlLnN0YXJ0KTtcbiAgICBpZiAocmVmZXJlbmNlQ2xhc3MgPT09IGRlY2xhcmluZ0NsYXNzKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKHJlZmVyZW5jZUNsYXNzICYmIGlzRGVyaXZlZEZyb20ocmVmZXJlbmNlQ2xhc3MsIGRlY2xhcmluZ0NsYXNzLCBjb250ZXh0LmNoZWNrZXIpKSB7XG4gICAgICBuZWVkZWQgPSAncHJvdGVjdGVkJztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICByZXR1cm4gJ3B1YmxpYyc7XG4gIH1cbiAgcmV0dXJuIG5lZWRlZDtcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVGaXhTdGF0dXMoZmluZGluZzogT3ZlckV4cG9zdXJlRmluZGluZyk6IHN0cmluZyB7XG4gIGlmIChmaW5kaW5nLndhc0ZpeGVkKSB7XG4gICAgcmV0dXJuICcgW2ZpeGVkXSc7XG4gIH1cbiAgaWYgKGZpbmRpbmcuc2tpcFJlYXNvbiAhPT0gbnVsbCkge1xuICAgIHJldHVybiBgIFtza2lwcGVkOiAke1NLSVBfUkVBU09OX0RFU0NSSVBUSU9OW2ZpbmRpbmcuc2tpcFJlYXNvbl19XWA7XG4gIH1cbiAgcmV0dXJuICcnO1xufVxuXG5mdW5jdGlvbiBkZXNjcmliZVJlYXNvbihmaW5kaW5nOiBPdmVyRXhwb3N1cmVGaW5kaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgYmFzZSA9IGByZWZlcmVuY2VkIG9ubHkgJHtTQ09QRV9ERVNDUklQVElPTltmaW5kaW5nLnN1Z2dlc3RlZEV4cG9zdXJlXX1gO1xuICBpZiAoZmluZGluZy5pc0ZvcmNlZEJ5VGVzdE9ubHkpIHtcbiAgICByZXR1cm4gYCR7YmFzZX0gKGV4cG9zZWQgb25seSBmb3IgdGVzdHMpYDtcbiAgfVxuICBpZiAoZmluZGluZy5oYXNOb1JlZmVyZW5jZXMpIHtcbiAgICByZXR1cm4gYCR7YmFzZX0gKG5vIHJlZmVyZW5jZXMgYXQgYWxsKWA7XG4gIH1cbiAgcmV0dXJuIGJhc2U7XG59XG5cbmZ1bmN0aW9uIGRldGVybWluZVNraXBSZWFzb24oZmluZGluZzogT3ZlckV4cG9zdXJlRmluZGluZywgZWRpdDogbnVsbCB8IE92ZXJFeHBvc3VyZVRleHRFZGl0LCBzaG91bGRGb3JjZTogYm9vbGVhbik6IG51bGwgfCBPdmVyRXhwb3N1cmVTa2lwUmVhc29uIHtcbiAgaWYgKGZpbmRpbmcuaXNGb3JjZWRCeVRlc3RPbmx5ICYmICFzaG91bGRGb3JjZSkge1xuICAgIHJldHVybiAndGVzdC1vbmx5JztcbiAgfVxuICBpZiAoIWVkaXQpIHtcbiAgICByZXR1cm4gZmluZGluZy5pc01lbWJlciA/ICdkZWNvcmF0ZWQnIDogJ3NoYXJlZC1leHBvcnQnO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBmaW5kTm9kZUF0UG9zaXRpb24obm9kZTogTm9kZSwgcG9zaXRpb246IG51bWJlcik6IE5vZGUgfCB1bmRlZmluZWQge1xuICBpZiAocG9zaXRpb24gPCBub2RlLmdldFN0YXJ0KCkgfHwgcG9zaXRpb24gPj0gbm9kZS5nZXRFbmQoKSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgbGV0IHJlc3VsdDogTm9kZSA9IG5vZGU7XG4gIG5vZGUuZm9yRWFjaENoaWxkKChjaGlsZCkgPT4ge1xuICAgIGNvbnN0IGZvdW5kID0gZmluZE5vZGVBdFBvc2l0aW9uKGNoaWxkLCBwb3NpdGlvbik7XG4gICAgaWYgKGZvdW5kKSB7XG4gICAgICByZXN1bHQgPSBmb3VuZDtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBmb3JtYXRGaW5kaW5nQmxvY2tzKGZpbmRpbmdzOiByZWFkb25seSBPdmVyRXhwb3N1cmVGaW5kaW5nW10sIGJhc2VGb2xkZXI6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZ1tdIHtcbiAgY29uc3QgYnlGaWxlID0gbmV3IE1hcDxzdHJpbmcsIE92ZXJFeHBvc3VyZUZpbmRpbmdbXT4oKTtcbiAgZm9yIChjb25zdCBmaW5kaW5nIG9mIGZpbmRpbmdzKSB7XG4gICAgY29uc3QgbGlzdCA9IGJ5RmlsZS5nZXQoZmluZGluZy5maWxlUGF0aCkgPz8gW107XG4gICAgbGlzdC5wdXNoKGZpbmRpbmcpO1xuICAgIGJ5RmlsZS5zZXQoZmluZGluZy5maWxlUGF0aCwgbGlzdCk7XG4gIH1cblxuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBbZmlsZVBhdGgsIGxpc3RdIG9mIGJ5RmlsZSkge1xuICAgIGNvbnN0IHNvcnRlZCA9IFsuLi5saXN0XS5zb3J0KChhLCBiKSA9PiBhLmxpbmUgLSBiLmxpbmUpO1xuICAgIGNvbnN0IGxvY2F0aW9uV2lkdGggPSBNYXRoLm1heCguLi5zb3J0ZWQubWFwKChmaW5kaW5nKSA9PiBgJHtTdHJpbmcoZmluZGluZy5saW5lKX06JHtTdHJpbmcoZmluZGluZy5jb2x1bW4pfWAubGVuZ3RoKSk7XG4gICAgbGluZXMucHVzaCh0b0Rpc3BsYXlQYXRoKGZpbGVQYXRoLCBiYXNlRm9sZGVyKSk7XG4gICAgZm9yIChjb25zdCBmaW5kaW5nIG9mIHNvcnRlZCkge1xuICAgICAgY29uc3QgbG9jYXRpb24gPSBgJHtTdHJpbmcoZmluZGluZy5saW5lKX06JHtTdHJpbmcoZmluZGluZy5jb2x1bW4pfWAucGFkRW5kKGxvY2F0aW9uV2lkdGgpO1xuICAgICAgY29uc3QgY2hhbmdlID0gYCR7ZmluZGluZy5jdXJyZW50RXhwb3N1cmV9ICR7ZmluZGluZy5uYW1lfSAtPiAke2ZpbmRpbmcuc3VnZ2VzdGVkRXhwb3N1cmV9YDtcbiAgICAgIGxpbmVzLnB1c2goYCAgJHtsb2NhdGlvbn0gICR7Y2hhbmdlfSAtLSAke2Rlc2NyaWJlUmVhc29uKGZpbmRpbmcpfSR7ZGVzY3JpYmVGaXhTdGF0dXMoZmluZGluZyl9YCk7XG4gICAgfVxuICAgIGxpbmVzLnB1c2goJycpO1xuICB9XG4gIHJldHVybiBsaW5lcztcbn1cblxuZnVuY3Rpb24gZm9ybWF0U3VtbWFyeShmaW5kaW5nczogcmVhZG9ubHkgT3ZlckV4cG9zdXJlRmluZGluZ1tdKTogc3RyaW5nIHtcbiAgY29uc3Qgc3VtbWFyeSA9IGAke1N0cmluZyhmaW5kaW5ncy5sZW5ndGgpfSBmaW5kaW5nKHMpLmA7XG4gIGNvbnN0IGZpeGVkQ291bnQgPSBmaW5kaW5ncy5maWx0ZXIoKGZpbmRpbmcpID0+IGZpbmRpbmcud2FzRml4ZWQpLmxlbmd0aDtcbiAgY29uc3Qgc2tpcHBlZENvdW50ID0gZmluZGluZ3MuZmlsdGVyKChmaW5kaW5nKSA9PiBmaW5kaW5nLnNraXBSZWFzb24gIT09IG51bGwpLmxlbmd0aDtcbiAgaWYgKGZpeGVkQ291bnQgPT09IDAgJiYgc2tpcHBlZENvdW50ID09PSAwKSB7XG4gICAgcmV0dXJuIHN1bW1hcnk7XG4gIH1cbiAgcmV0dXJuIGAke3N1bW1hcnl9ICR7U3RyaW5nKGZpeGVkQ291bnQpfSBmaXhlZCwgJHtTdHJpbmcoc2tpcHBlZENvdW50KX0gc2tpcHBlZC5gO1xufVxuXG5mdW5jdGlvbiBnZXRDbGFzc0F0UG9zaXRpb24ocHJvZ3JhbTogUHJvZ3JhbSwgZmlsZU5hbWU6IHN0cmluZywgcG9zaXRpb246IG51bWJlcik6IENsYXNzTGlrZURlY2xhcmF0aW9uIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc291cmNlRmlsZSA9IHByb2dyYW0uZ2V0U291cmNlRmlsZShmaWxlTmFtZSk7XG4gIGFzc2VydE5vbk51bGxhYmxlKHNvdXJjZUZpbGUsIGBTb3VyY2UgZmlsZSBub3QgZm91bmQgaW4gcHJvZ3JhbTogJHtmaWxlTmFtZX1gKTtcbiAgY29uc3Qgbm9kZSA9IGZpbmROb2RlQXRQb3NpdGlvbihzb3VyY2VGaWxlLCBwb3NpdGlvbik7XG4gIGFzc2VydE5vbk51bGxhYmxlKG5vZGUsIGBObyBub2RlIGZvdW5kIGF0IHBvc2l0aW9uICR7U3RyaW5nKHBvc2l0aW9uKX0gaW4gJHtmaWxlTmFtZX1gKTtcbiAgcmV0dXJuIGdldEVuY2xvc2luZ0NsYXNzKG5vZGUpO1xufVxuXG5mdW5jdGlvbiBnZXRDdXJyZW50TWVtYmVyRXhwb3N1cmUobW9kaWZpZXJLaW5kczogUmVhZG9ubHlTZXQ8U3ludGF4S2luZD4pOiBNZW1iZXJFeHBvc3VyZSB7XG4gIGlmIChtb2RpZmllcktpbmRzLmhhcyhTeW50YXhLaW5kLlByaXZhdGVLZXl3b3JkKSkge1xuICAgIHJldHVybiAncHJpdmF0ZSc7XG4gIH1cbiAgaWYgKG1vZGlmaWVyS2luZHMuaGFzKFN5bnRheEtpbmQuUHJvdGVjdGVkS2V5d29yZCkpIHtcbiAgICByZXR1cm4gJ3Byb3RlY3RlZCc7XG4gIH1cbiAgcmV0dXJuICdwdWJsaWMnO1xufVxuXG5mdW5jdGlvbiBnZXRFbmNsb3NpbmdDbGFzcyhub2RlOiBOb2RlKTogQ2xhc3NMaWtlRGVjbGFyYXRpb24gfCB1bmRlZmluZWQge1xuICBsZXQgY3VycmVudDogTm9kZSA9IG5vZGU7XG4gIHdoaWxlICghaXNTb3VyY2VGaWxlKGN1cnJlbnQpKSB7XG4gICAgaWYgKGlzQ2xhc3NMaWtlKGN1cnJlbnQpKSB7XG4gICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9XG4gICAgY3VycmVudCA9IGN1cnJlbnQucGFyZW50O1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGdldEV4cG9ydGVkTmFtZU5vZGVzKGRlY2xhcmF0aW9uOiBFeHBvcnRhYmxlRGVjbGFyYXRpb24pOiBOb2RlW10ge1xuICBpZiAoaXNWYXJpYWJsZVN0YXRlbWVudChkZWNsYXJhdGlvbikpIHtcbiAgICByZXR1cm4gZGVjbGFyYXRpb24uZGVjbGFyYXRpb25MaXN0LmRlY2xhcmF0aW9ucy5tYXAoKHZhcmlhYmxlRGVjbGFyYXRpb24pID0+IHZhcmlhYmxlRGVjbGFyYXRpb24ubmFtZSkuZmlsdGVyKGlzSWRlbnRpZmllcik7XG4gIH1cbiAgcmV0dXJuIGRlY2xhcmF0aW9uLm5hbWUgPyBbZGVjbGFyYXRpb24ubmFtZV0gOiBbXTtcbn1cblxuZnVuY3Rpb24gZ2V0TW9kaWZpZXJLaW5kcyhub2RlOiBOb2RlKTogUmVhZG9ubHlTZXQ8U3ludGF4S2luZD4ge1xuICBjb25zdCBraW5kcyA9IG5ldyBTZXQ8U3ludGF4S2luZD4oKTtcbiAgaWYgKGNhbkhhdmVNb2RpZmllcnMobm9kZSkpIHtcbiAgICBmb3IgKGNvbnN0IG1vZGlmaWVyIG9mIGdldE1vZGlmaWVycyhub2RlKSA/PyBbXSkge1xuICAgICAga2luZHMuYWRkKG1vZGlmaWVyLmtpbmQpO1xuICAgIH1cbiAgfVxuICByZXR1cm4ga2luZHM7XG59XG5cbmZ1bmN0aW9uIGhhc1RzRG9jQ29tbWVudChub2RlOiBOb2RlKTogYm9vbGVhbiB7XG4gIGNvbnN0IHNvdXJjZUZpbGUgPSBub2RlLmdldFNvdXJjZUZpbGUoKTtcbiAgY29uc3QgZnVsbFRleHQgPSBzb3VyY2VGaWxlLmdldEZ1bGxUZXh0KCk7XG4gIGNvbnN0IGNvbW1lbnRSYW5nZXMgPSBnZXRMZWFkaW5nQ29tbWVudFJhbmdlcyhmdWxsVGV4dCwgbm9kZS5nZXRGdWxsU3RhcnQoKSkgPz8gW107XG4gIHJldHVybiBjb21tZW50UmFuZ2VzLnNvbWUoKHJhbmdlKSA9PlxuICAgIHJhbmdlLmtpbmQgPT09IFN5bnRheEtpbmQuTXVsdGlMaW5lQ29tbWVudFRyaXZpYVxuICAgICYmIGZ1bGxUZXh0LmNoYXJBdChyYW5nZS5wb3MgKyBKU0RPQ19TRUNPTkRfQVNURVJJU0tfT0ZGU0VUKSA9PT0gJyonXG4gICAgJiYgZnVsbFRleHQuY2hhckF0KHJhbmdlLnBvcyArIEpTRE9DX0ZPVVJUSF9DSEFSQUNURVJfT0ZGU0VUKSAhPT0gJy8nXG4gICk7XG59XG5cbmZ1bmN0aW9uIGlzRGVjbGFyYXRpb25JdHNlbGYocmVmZXJlbmNlOiBSZWZlcmVuY2VMb2NhdGlvbiwgbmFtZU5vZGU6IE5vZGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIHRvQ2Fub25pY2FsKHJlZmVyZW5jZS5maWxlTmFtZSkgPT09IHRvQ2Fub25pY2FsKG5hbWVOb2RlLmdldFNvdXJjZUZpbGUoKS5maWxlTmFtZSkgJiYgcmVmZXJlbmNlLnN0YXJ0ID09PSBuYW1lTm9kZS5nZXRTdGFydCgpO1xufVxuXG5mdW5jdGlvbiBpc0Rlcml2ZWRGcm9tKGRlcml2ZWQ6IENsYXNzTGlrZURlY2xhcmF0aW9uLCBiYXNlOiBDbGFzc0xpa2VEZWNsYXJhdGlvbiwgY2hlY2tlcjogVHlwZUNoZWNrZXIpOiBib29sZWFuIHtcbiAgY29uc3QgYmFzZVN5bWJvbCA9IGJhc2UubmFtZSA/IGNoZWNrZXIuZ2V0U3ltYm9sQXRMb2NhdGlvbihiYXNlLm5hbWUpIDogdW5kZWZpbmVkO1xuICBpZiAoIWJhc2VTeW1ib2wpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBmb3IgKGNvbnN0IGNsYXVzZSBvZiBkZXJpdmVkLmhlcml0YWdlQ2xhdXNlcyA/PyBbXSkge1xuICAgIGlmIChjbGF1c2UudG9rZW4gIT09IFN5bnRheEtpbmQuRXh0ZW5kc0tleXdvcmQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHR5cGVFeHByZXNzaW9uIG9mIGNsYXVzZS50eXBlcykge1xuICAgICAgY29uc3Qgc3ltYm9sID0gY2hlY2tlci5nZXRUeXBlQXRMb2NhdGlvbih0eXBlRXhwcmVzc2lvbi5leHByZXNzaW9uKS5nZXRTeW1ib2woKTtcbiAgICAgIGlmIChzeW1ib2wgPT09IGJhc2VTeW1ib2wpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGRlY2xhcmF0aW9uIG9mIHN5bWJvbD8uZGVjbGFyYXRpb25zID8/IFtdKSB7XG4gICAgICAgIGlmIChpc0NsYXNzTGlrZShkZWNsYXJhdGlvbikgJiYgaXNEZXJpdmVkRnJvbShkZWNsYXJhdGlvbiwgYmFzZSwgY2hlY2tlcikpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGlzT3duU291cmNlRmlsZShmaWxlUGF0aDogc3RyaW5nLCBzcmNGb2xkZXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZmlsZVBhdGguc3RhcnRzV2l0aChgJHtzcmNGb2xkZXJ9L2ApICYmIGZpbGVQYXRoLmVuZHNXaXRoKCcudHMnKSAmJiAhZmlsZVBhdGguZW5kc1dpdGgoJy5kLnRzJyk7XG59XG5cbmZ1bmN0aW9uIGlzVGVzdEZpbGUoZmlsZVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZmlsZVBhdGguaW5jbHVkZXMoJy50ZXN0LicpIHx8IGZpbGVQYXRoLmluY2x1ZGVzKCcuaW50ZWdyYXRpb24uJyk7XG59XG5cbmZ1bmN0aW9uIHJhbmtFeHBvc3VyZShleHBvc3VyZTogTWVtYmVyRXhwb3N1cmUpOiBudW1iZXIge1xuICByZXR1cm4gTUVNQkVSX0VYUE9TVVJFX09SREVSLmluZGV4T2YoZXhwb3N1cmUpO1xufVxuXG5mdW5jdGlvbiByZWNvcmQoY29udGV4dDogQW5hbHlzaXNDb250ZXh0LCBmaW5kaW5nOiBPdmVyRXhwb3N1cmVGaW5kaW5nLCBlZGl0OiBudWxsIHwgT3ZlckV4cG9zdXJlVGV4dEVkaXQpOiB2b2lkIHtcbiAgY29udGV4dC5maW5kaW5ncy5wdXNoKGZpbmRpbmcpO1xuICBjb250ZXh0LmVkaXRzLnB1c2goZWRpdCk7XG59XG5cbmZ1bmN0aW9uIHJ1bk92ZXJFeHBvc3VyZUFuYWx5c2lzKHBhcmFtczogQW5hbHl6ZU92ZXJFeHBvc3VyZVBhcmFtcyk6IEFuYWx5c2lzUmVzdWx0IHtcbiAgY29uc3QgeyBsYW5ndWFnZVNlcnZpY2UsIG9uUHJvZ3Jlc3MsIHNyY0ZvbGRlciB9ID0gcGFyYW1zO1xuICBjb25zdCBwcm9ncmFtID0gbGFuZ3VhZ2VTZXJ2aWNlLmdldFByb2dyYW0oKTtcbiAgaWYgKCFwcm9ncmFtKSB7XG4gICAgcmV0dXJuIHsgZWRpdHM6IFtdLCBmaW5kaW5nczogW10gfTtcbiAgfVxuXG4gIGNvbnN0IGNvbnRleHQ6IEFuYWx5c2lzQ29udGV4dCA9IHtcbiAgICBjaGVja2VyOiBwcm9ncmFtLmdldFR5cGVDaGVja2VyKCksXG4gICAgZWRpdHM6IFtdLFxuICAgIGZpbmRpbmdzOiBbXSxcbiAgICBsYW5ndWFnZVNlcnZpY2UsXG4gICAgcHJvZ3JhbSxcbiAgICBzaG91bGRGb3JjZTogcGFyYW1zLnNob3VsZEZvcmNlID8/IGZhbHNlXG4gIH07XG5cbiAgY29uc3Qgc291cmNlRmlsZXNUb0FuYWx5emUgPSBwcm9ncmFtLmdldFNvdXJjZUZpbGVzKCkuZmlsdGVyKChzb3VyY2VGaWxlKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSB0b0Nhbm9uaWNhbChzb3VyY2VGaWxlLmZpbGVOYW1lKTtcbiAgICByZXR1cm4gaXNPd25Tb3VyY2VGaWxlKGZpbGVQYXRoLCBzcmNGb2xkZXIpICYmICFpc1Rlc3RGaWxlKGZpbGVQYXRoKTtcbiAgfSk7XG5cbiAgZm9yIChjb25zdCBbYW5hbHl6ZWRGaWxlQ291bnQsIHNvdXJjZUZpbGVdIG9mIHNvdXJjZUZpbGVzVG9BbmFseXplLmVudHJpZXMoKSkge1xuICAgIG9uUHJvZ3Jlc3M/Lih7XG4gICAgICBhbmFseXplZEZpbGVDb3VudCxcbiAgICAgIGN1cnJlbnRGaWxlUGF0aDogdG9DYW5vbmljYWwoc291cmNlRmlsZS5maWxlTmFtZSksXG4gICAgICB0b3RhbEZpbGVDb3VudDogc291cmNlRmlsZXNUb0FuYWx5emUubGVuZ3RoXG4gICAgfSk7XG4gICAgdmlzaXQoc291cmNlRmlsZSk7XG4gIH1cbiAgcmV0dXJuIHsgZWRpdHM6IGNvbnRleHQuZWRpdHMsIGZpbmRpbmdzOiBjb250ZXh0LmZpbmRpbmdzIH07XG5cbiAgZnVuY3Rpb24gdmlzaXQobm9kZTogTm9kZSk6IHZvaWQge1xuICAgIGFuYWx5emVNZW1iZXIobm9kZSwgY29udGV4dCk7XG4gICAgYW5hbHl6ZUV4cG9ydChub2RlLCBjb250ZXh0KTtcbiAgICBub2RlLmZvckVhY2hDaGlsZCh2aXNpdCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdG9EaXNwbGF5UGF0aChmaWxlUGF0aDogc3RyaW5nLCBiYXNlRm9sZGVyOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICBpZiAoYmFzZUZvbGRlciAhPT0gdW5kZWZpbmVkICYmIGZpbGVQYXRoLnN0YXJ0c1dpdGgoYCR7YmFzZUZvbGRlcn0vYCkpIHtcbiAgICByZXR1cm4gZmlsZVBhdGguc2xpY2UoYmFzZUZvbGRlci5sZW5ndGggKyAxKTtcbiAgfVxuICByZXR1cm4gZmlsZVBhdGg7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWlFQTtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFFUCxTQUFTLHlCQUF5QjtBQUNsQztBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQThPQSxNQUFNLHNCQUEyQyxvQkFBSSxJQUFZO0FBQUEsRUFDdEU7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFDRixDQUFDO0FBc0RELE1BQU0sK0JBQStCO0FBQ3JDLE1BQU0sZ0NBQWdDO0FBQ3RDLE1BQU0sd0JBQW1ELENBQUMsV0FBVyxhQUFhLFFBQVE7QUFDMUYsTUFBTSxvQkFBdUQ7QUFBQSxFQUMzRCxjQUFjO0FBQUEsRUFDZCxXQUFXO0FBQUEsRUFDWCxhQUFhO0FBQ2Y7QUFDQSxNQUFNLDBCQUFrRTtBQUFBLEVBQ3RFLGFBQWE7QUFBQSxFQUNiLGlCQUFpQjtBQUFBLEVBQ2pCLGFBQWE7QUFDZjtBQUNBLE1BQU0sNEJB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
|
|
634
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy9saW50ZXJzL292ZXItZXhwb3N1cmUudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBPdmVyLWV4cG9zdXJlIGFuYWx5emVyLlxuICpcbiAqIEZpbmRzIGRlY2xhcmF0aW9ucyBleHBvc2VkIG1vcmUgYnJvYWRseSB0aGFuIHRoZWlyIHJlZmVyZW5jZXMgcmVxdWlyZSwgc28gdGhlIGV4cG9zdXJlIGNhbiBiZVxuICogdGlnaHRlbmVkOlxuICpcbiAqIC0gYGV4cG9ydGBlZCBzeW1ib2xzIHJlZmVyZW5jZWQgb25seSB3aXRoaW4gdGhlaXIgb3duIGZpbGUgXHUyMDE0IHRoZSBgZXhwb3J0YCBjYW4gYmUgZHJvcHBlZC5cbiAqIC0gYHB1YmxpY2AgY2xhc3MgbWVtYmVycyByZWZlcmVuY2VkIG9ubHkgaW5zaWRlIHRoZWlyIG93biBjbGFzcyBcdTIwMTQgdGhleSBjYW4gYmUgYHByaXZhdGVgLlxuICogLSBgcHVibGljYCBjbGFzcyBtZW1iZXJzIHJlZmVyZW5jZWQgb25seSBpbnNpZGUgdGhlaXIgb3duIGNsYXNzIGFuZCBpdHMgc3ViY2xhc3NlcyBcdTIwMTQgdGhleSBjYW4gYmVcbiAqICAgYHByb3RlY3RlZGAuXG4gKiAtIGBwcm90ZWN0ZWRgIGNsYXNzIG1lbWJlcnMgcmVmZXJlbmNlZCBvbmx5IGluc2lkZSB0aGVpciBvd24gY2xhc3MgXHUyMDE0IHRoZXkgY2FuIGJlIGBwcml2YXRlYC5cbiAqXG4gKiBUaGUgYW5hbHlzaXMgaXMgd2hvbGUtcHJvZ3JhbSBhbmQgdHlwZS1hd2FyZTogaXQgdXNlcyB0aGUgVHlwZVNjcmlwdCBsYW5ndWFnZSBzZXJ2aWNlJ3NcbiAqIGZpbmQtYWxsLXJlZmVyZW5jZXMgdG8gbG9jYXRlIGV2ZXJ5IHVzZSBvZiBlYWNoIGRlY2xhcmF0aW9uLCB0aGVuIGNsYXNzaWZpZXMgdGhlIHRpZ2h0ZXN0XG4gKiBleHBvc3VyZSB0aGF0IHN0aWxsIGNvdmVycyBhbGwgcmVmZXJlbmNlcy4gQmVjYXVzZSBgZmluZFJlZmVyZW5jZXNgIGRvZXMgbm90IGxpbmsgYSBzdHJpbmctbGl0ZXJhbFxuICogYXJndW1lbnQgYmFjayB0byBhIG1lbWJlciBkZWNsYXJhdGlvbiB3aGVuIHRoZSBwYXJhbWV0ZXIgaXMgYSBjb25kaXRpb25hbC9tYXBwZWQga2V5IHR5cGUgKGUuZy5cbiAqIGBiaW5kKGNvbXBvbmVudCwgJ3NvbWVTZXR0aW5nJylgIHdoZXJlIHRoZSBrZXkgaXMgdHlwZWQgYENvbmRpdGlvbmFsS2V5czxTZXR0aW5ncywgXHUyMDI2PmApLCBtZW1iZXJcbiAqIGFuYWx5c2lzIGFkZGl0aW9uYWxseSB0cmVhdHMgYSBzdHJpbmcgbGl0ZXJhbCB3aG9zZSB0ZXh0IGVxdWFscyB0aGUgbWVtYmVyIG5hbWUgYXMgYSByZWZlcmVuY2UgXHUyMDE0XG4gKiBidXQgb25seSB3aGVuIGl0cyBjb250ZXh0dWFsIHR5cGUgaXMgYSBzdHJpbmctbGl0ZXJhbCB0eXBlIChvciB1bmlvbiBvZiB0aGVtKSBhbGwgb2Ygd2hvc2UgbWVtYmVyc1xuICogYXJlIGtleXMgb2YgdGhlIGRlY2xhcmluZyBjbGFzcywgc28gaW5jaWRlbnRhbCBzYW1lLW5hbWVkIHN0cmluZ3MgKGBjb25zb2xlLmxvZygnbmFtZScpYCkgYXJlIG5vdFxuICogbWlzY291bnRlZC4gTWVtYmVycyBpbnZva2VkIGJ5IHRoZSBmcmFtZXdvcmsgdmlhIHJlZ2lzdHJhdGlvblxuICogcmF0aGVyIHRoYW4gYnkgdmlzaWJsZSByZWZlcmVuY2VzIChPYnNpZGlhbiBsaWZlY3ljbGUgaG9va3MsIHNldHRpbmdzLXRhYiBgZGlzcGxheWAsIGV0Yy4pIGFyZVxuICogZXhjbHVkZWQgdmlhIHtAbGluayBMSUZFQ1lDTEVfQUxMT1dMSVNUfSwgYXMgYXJlIGBvdmVycmlkZWAgYW5kIGBzdGF0aWNgIG1lbWJlcnMgd2hvc2UgZXhwb3N1cmUgaXNcbiAqIGNvbnN0cmFpbmVkIGJ5IGEgYmFzZSBkZWNsYXJhdGlvbi4gRUNNQVNjcmlwdCBoYXJkLXByaXZhdGUgbWVtYmVycyAoYCNuYW1lYCkgYXJlIGFsc28gZXhjbHVkZWQgXHUyMDE0XG4gKiB0aGV5IGFyZSBhbHJlYWR5IG1heGltYWxseSBwcml2YXRlIGFuZCBjYW5ub3QgY2FycnkgYSB2aXNpYmlsaXR5IG1vZGlmaWVyLiBBIGRlY2xhcmF0aW9uIGNhcnJ5aW5nXG4gKiBhIFRTRG9jIChgLyoqIFx1MjAyNiAqXFwvYCkgZG9jdW1lbnRhdGlvbiBjb21tZW50IGlzIGxpa2V3aXNlIGV4Y2x1ZGVkIFx1MjAxNCB3aGV0aGVyIGEgdG9wLWxldmVsIGBleHBvcnRgIG9yXG4gKiBhIGNsYXNzIG1lbWJlciwgZG9jdW1lbnRpbmcgaXQgaXMgYSBkZWxpYmVyYXRlIHNpZ25hbCB0aGF0IGl0IGlzIHBhcnQgb2YgdGhlIGludGVuZGVkIHB1YmxpYyBBUEksXG4gKiByZWdhcmRsZXNzIG9mIHdoZXJlIGl0IGN1cnJlbnRseSBoYXBwZW5zIHRvIGJlIHJlZmVyZW5jZWQuXG4gKlxuICogQSBtZW1iZXIgcmVmZXJlbmNlZCBvbmx5IGZyb20gdGVzdCBmaWxlcyBpcyByZXBvcnRlZCB3aXRoIHtAbGluayBPdmVyRXhwb3N1cmVGaW5kaW5nLmlzRm9yY2VkQnlUZXN0T25seX1cbiAqIHNldCwgc3VyZmFjaW5nIG1lbWJlcnMgd2lkZW5lZCBwdXJlbHkgZm9yIHRlc3RhYmlsaXR5IFx1MjAxNCB0aGUgY2Fub25pY2FsIGNhc2UgZm9yIGV4dHJhY3RpbmcgbG9naWNcbiAqIGludG8gYW4gaW5kZXBlbmRlbnRseSB0ZXN0YWJsZSBjb21wb25lbnQgaW5zdGVhZC5cbiAqXG4gKiBCZXlvbmQgcmVwb3J0aW5nLCBwYXNzaW5nIGBzaG91bGRGaXhgIHRvIHtAbGluayBmaW5kT3ZlckV4cG9zdXJlfSAvIHtAbGluayBhbmFseXplT3ZlckV4cG9zdXJlfVxuICogcmV3cml0ZXMgdGhlIHNvdXJjZSBpbiBwbGFjZTogZHJvcHBpbmcgdGhlIGBleHBvcnRgIGtleXdvcmQsIG9yIHJlcGxhY2luZy9pbnNlcnRpbmcgYSBgcHJpdmF0ZWBcbiAqIG9yIGBwcm90ZWN0ZWRgIG1vZGlmaWVyLiBFYWNoIGZpbmRpbmcgdGhlbiBjYXJyaWVzIHtAbGluayBPdmVyRXhwb3N1cmVGaW5kaW5nLndhc0ZpeGVkfSAvXG4gKiB7QGxpbmsgT3ZlckV4cG9zdXJlRmluZGluZy5za2lwUmVhc29ufS4gQ2hhbmdlcyB0aGF0IGNhbm5vdCBiZSBzYWZlbHkgYXV0b21hdGVkIFx1MjAxNCB0aG9zZSBmb3JjZWRcbiAqIG9ubHkgYnkgdGVzdCByZWZlcmVuY2VzLCBkZWNvcmF0ZWQgbWVtYmVycywgb3IgYW4gYGV4cG9ydGAgc2hhcmVkIHdpdGggYSBzdGlsbC1leHBvcnRlZCBzaWJsaW5nIFx1MjAxNFxuICogYXJlIHJlcG9ydGVkIGFzIHNraXBwZWQgYW5kIGxlZnQgdW50b3VjaGVkLlxuICpcbiAqIEFkZGl0aW9uYWxseSBwYXNzaW5nIGBzaG91bGRGb3JjZWAgKG9ubHkgbWVhbmluZ2Z1bCB0b2dldGhlciB3aXRoIGBzaG91bGRGaXhgKSB0aWdodGVucyB0aGVcbiAqIGRlY2xhcmF0aW9ucyBoZWxkIHdpZGUgcHVyZWx5IGJ5IHRlc3QgcmVmZXJlbmNlcyB0b28gXHUyMDE0IHRoZSBwcm9kdWN0aW9uIGhhbGYgb2YgdGhlIGNhbm9uaWNhbFxuICogdGVzdC1vbmx5IG1pZ3JhdGlvbjogdGhlIG1lbWJlciBiZWNvbWVzIGBwcml2YXRlYCAvIHRoZSBgZXhwb3J0YCBpcyBkcm9wcGVkLCBsZWF2aW5nIG9ubHkgdGhlXG4gKiB0ZXN0IHRvIHN3aXRjaCB0byBhIGNhc3QtYmFzZWQgYWNjZXNzLiBEZWNvcmF0ZWQgbWVtYmVycyBhbmQgZXhwb3J0cyBzaGFyZWQgd2l0aCBhIHN0aWxsLWV4cG9ydGVkXG4gKiBzaWJsaW5nIHN0YXkgc2tpcHBlZCBldmVuIHVuZGVyIGBzaG91bGRGb3JjZWAsIGJlY2F1c2Ugbm8gZWRpdCBjYW4gYmUgYXBwbGllZCBzYWZlbHkuXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBDbGFzc0RlY2xhcmF0aW9uLFxuICBDbGFzc0xpa2VEZWNsYXJhdGlvbixcbiAgQ29tcGlsZXJPcHRpb25zLFxuICBFbnVtRGVjbGFyYXRpb24sXG4gIEZ1bmN0aW9uRGVjbGFyYXRpb24sXG4gIEdldEFjY2Vzc29yRGVjbGFyYXRpb24sXG4gIEludGVyZmFjZURlY2xhcmF0aW9uLFxuICBJU2NyaXB0U25hcHNob3QsXG4gIExhbmd1YWdlU2VydmljZSxcbiAgTGFuZ3VhZ2VTZXJ2aWNlSG9zdCxcbiAgTWV0aG9kRGVjbGFyYXRpb24sXG4gIE5vZGUsXG4gIFByb2dyYW0sXG4gIFByb3BlcnR5RGVjbGFyYXRpb24sXG4gIFJlZmVyZW5jZWRTeW1ib2wsXG4gIFNldEFjY2Vzc29yRGVjbGFyYXRpb24sXG4gIFNvdXJjZUZpbGUsXG4gIFN0cmluZ0xpdGVyYWxMaWtlLFxuICBUeXBlLFxuICBUeXBlQWxpYXNEZWNsYXJhdGlvbixcbiAgVHlwZUNoZWNrZXIsXG4gIFZhcmlhYmxlU3RhdGVtZW50XG59IGZyb20gJ3R5cGVzY3JpcHQnO1xuXG5pbXBvcnQge1xuICBjYW5IYXZlTW9kaWZpZXJzLFxuICBjcmVhdGVEb2N1bWVudFJlZ2lzdHJ5LFxuICBjcmVhdGVMYW5ndWFnZVNlcnZpY2UsXG4gIGdldERlY29yYXRvcnMsXG4gIGdldERlZmF1bHRMaWJGaWxlUGF0aCxcbiAgZ2V0TGVhZGluZ0NvbW1lbnRSYW5nZXMsXG4gIGdldE1vZGlmaWVycyxcbiAgaXNDbGFzc0RlY2xhcmF0aW9uLFxuICBpc0NsYXNzTGlrZSxcbiAgaXNFbnVtRGVjbGFyYXRpb24sXG4gIGlzRnVuY3Rpb25EZWNsYXJhdGlvbixcbiAgaXNHZXRBY2Nlc3NvckRlY2xhcmF0aW9uLFxuICBpc0lkZW50aWZpZXIsXG4gIGlzSW50ZXJmYWNlRGVjbGFyYXRpb24sXG4gIGlzTWV0aG9kRGVjbGFyYXRpb24sXG4gIGlzUHJpdmF0ZUlkZW50aWZpZXIsXG4gIGlzUHJvcGVydHlEZWNsYXJhdGlvbixcbiAgaXNTZXRBY2Nlc3NvckRlY2xhcmF0aW9uLFxuICBpc1NvdXJjZUZpbGUsXG4gIGlzU3RyaW5nTGl0ZXJhbExpa2UsXG4gIGlzVHlwZUFsaWFzRGVjbGFyYXRpb24sXG4gIGlzVmFyaWFibGVTdGF0ZW1lbnQsXG4gIFNjcmlwdFNuYXBzaG90LFxuICBTeW50YXhLaW5kLFxuICBzeXNcbn0gZnJvbSAndHlwZXNjcmlwdCc7XG5cbmltcG9ydCB7IGFzc2VydE5vbk51bGxhYmxlIH0gZnJvbSAnLi4vLi4vdHlwZS1ndWFyZHMudHMnO1xuaW1wb3J0IHtcbiAgcGFyc2VUc0NvbmZpZyxcbiAgdG9DYW5vbmljYWxcbn0gZnJvbSAnLi4vY2hlY2stcHJvamVjdC10eXBlcy50cyc7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGFuYWx5emVPdmVyRXhwb3N1cmV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFuYWx5emVPdmVyRXhwb3N1cmVQYXJhbXMge1xuICAvKiogVGhlIGxhbmd1YWdlIHNlcnZpY2UgdG8gcXVlcnkgZm9yIHJlZmVyZW5jZXMgYW5kIHR5cGVzLiAqL1xuICByZWFkb25seSBsYW5ndWFnZVNlcnZpY2U6IExhbmd1YWdlU2VydmljZTtcblxuICAvKipcbiAgICogT3B0aW9uYWwgY2FsbGJhY2sgaW52b2tlZCBvbmNlIHBlciBhbmFseXplZCBzb3VyY2UgZmlsZSwgYmVmb3JlIHRoYXQgZmlsZSBpcyBwcm9jZXNzZWQuIFRoZVxuICAgKiB3aG9sZS1wcm9ncmFtIHJlZmVyZW5jZSBhbmFseXNpcyBpcyBzbG93LCBzbyB0aGlzIGxldHMgY2FsbGVycyByZXBvcnQgbGl2ZSBwcm9ncmVzcyBpbnN0ZWFkIG9mXG4gICAqIGFwcGVhcmluZyB0byBoYW5nLlxuICAgKi9cbiAgb25Qcm9ncmVzcz8odGhpczogdm9pZCwgcHJvZ3Jlc3M6IE92ZXJFeHBvc3VyZVByb2dyZXNzKTogdm9pZDtcblxuICAvKipcbiAgICogV2hlbiBgdHJ1ZWAsIGVhY2ggZml4YWJsZSBmaW5kaW5nIGlzIHRpZ2h0ZW5lZCBpbiBwbGFjZSB2aWEge0BsaW5rIHdyaXRlRmlsZX0gKHdoaWNoIG11c3QgdGhlblxuICAgKiBiZSBwcm92aWRlZCksIGFuZCB0aGUgcmV0dXJuZWQgZmluZGluZ3MgY2Fycnkge0BsaW5rIE92ZXJFeHBvc3VyZUZpbmRpbmcud2FzRml4ZWR9IC9cbiAgICoge0BsaW5rIE92ZXJFeHBvc3VyZUZpbmRpbmcuc2tpcFJlYXNvbn0uIFdoZW4gYGZhbHNlYCBvciBvbWl0dGVkLCB0aGUgYW5hbHlzaXMgb25seSByZXBvcnRzLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRml4PzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogV2hlbiBgdHJ1ZWAgKG9ubHkgbWVhbmluZ2Z1bCB0b2dldGhlciB3aXRoIHtAbGluayBzaG91bGRGaXh9KSwgZGVjbGFyYXRpb25zIGhlbGQgd2lkZSBwdXJlbHkgYnlcbiAgICogdGVzdCByZWZlcmVuY2VzIGFyZSB0aWdodGVuZWQgdG9vLCBpbnN0ZWFkIG9mIGJlaW5nIHNraXBwZWQgd2l0aCBhIGB0ZXN0LW9ubHlgXG4gICAqIHtAbGluayBPdmVyRXhwb3N1cmVGaW5kaW5nLnNraXBSZWFzb259LiBEZWNvcmF0ZWQgbWVtYmVycyBhbmQgZXhwb3J0cyBzaGFyZWQgd2l0aCBhXG4gICAqIHN0aWxsLWV4cG9ydGVkIHNpYmxpbmcgc3RheSBza2lwcGVkIHJlZ2FyZGxlc3MsIGJlY2F1c2Ugbm8gZWRpdCBjYW4gYmUgYXBwbGllZCBzYWZlbHkuXG4gICAqL1xuICByZWFkb25seSBzaG91bGRGb3JjZT86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEFic29sdXRlIChjYW5vbmljYWwpIHBhdGggb2YgdGhlIHByb2plY3QncyBgc3JjYCBmb2xkZXIuIE9ubHkgZGVjbGFyYXRpb25zIGluIG5vbi10ZXN0IGZpbGVzXG4gICAqIHVuZGVyIHRoaXMgZm9sZGVyIGFyZSBhbmFseXplZDsgZGVjbGFyYXRpb25zIGVsc2V3aGVyZSAodGVzdCBmaWxlcywgZGVwZW5kZW5jaWVzKSBhcmUgaWdub3JlZFxuICAgKiBidXQgc3RpbGwgY291bnRlZCBhcyByZWZlcmVuY2Ugc2l0ZXMuXG4gICAqL1xuICByZWFkb25seSBzcmNGb2xkZXI6IHN0cmluZztcblxuICAvKipcbiAgICogV3JpdGVzIHRoZSB0aWdodGVuZWQgY29udGVudHMgb2YgYSBjaGFuZ2VkIGZpbGUgYmFjayB0byBkaXNrLiBSZXF1aXJlZCB3aGVuIHtAbGluayBzaG91bGRGaXh9XG4gICAqIGlzIGB0cnVlYDsgaWdub3JlZCBvdGhlcndpc2UuXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoIC0gQWJzb2x1dGUgcGF0aCBvZiB0aGUgZmlsZSB0byB3cml0ZSAob3JpZ2luYWwgY2FzaW5nLCBhcyBzdG9yZWQgaW4gdGhlIHByb2dyYW0pLlxuICAgKiBAcGFyYW0gY29udGVudCAtIFRoZSBmdWxsIG5ldyBmaWxlIGNvbnRlbnRzLlxuICAgKi9cbiAgd3JpdGVGaWxlPyh0aGlzOiB2b2lkLCBwYXRoOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZyk6IHZvaWQ7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGNyZWF0ZUxhbmd1YWdlU2VydmljZUhvc3R9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZUxhbmd1YWdlU2VydmljZUhvc3RQYXJhbXMge1xuICAvKiogVGhlIGNvbXBpbGVyIG9wdGlvbnMuICovXG4gIHJlYWRvbmx5IGNvbXBpbGVyT3B0aW9uczogQ29tcGlsZXJPcHRpb25zO1xuXG4gIC8qKiBUaGUgZmlsZXMgdG8gaW5jbHVkZSBpbiB0aGUgcHJvZ3JhbS4gKi9cbiAgcmVhZG9ubHkgZmlsZU5hbWVzOiByZWFkb25seSBzdHJpbmdbXTtcblxuICAvKiogVGhlIGZpbGUtc3lzdGVtIG9wZXJhdGlvbnMgdXNlZCB0byByZWFkIHNvdXJjZXMuICovXG4gIHJlYWRvbmx5IGZpbGVTeXN0ZW06IE92ZXJFeHBvc3VyZUZpbGVTeXN0ZW07XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGNyZWF0ZVByb2plY3RMYW5ndWFnZVNlcnZpY2V9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZVByb2plY3RMYW5ndWFnZVNlcnZpY2VQYXJhbXMge1xuICAvKiogQWJzb2x1dGUgcGF0aCB0byB0aGUgcHJvamVjdCdzIGB0c2NvbmZpZy5qc29uYC4gKi9cbiAgcmVhZG9ubHkgdHNDb25maWdQYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIGV4cG9zdXJlIGxldmVsIGEgZGVjbGFyYXRpb24gY3VycmVudGx5IGhhcy5cbiAqL1xuZXhwb3J0IHR5cGUgQ3VycmVudEV4cG9zdXJlID0gJ2V4cG9ydCcgfCAncHJvdGVjdGVkJyB8ICdwdWJsaWMnO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBmaW5kT3ZlckV4cG9zdXJlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGaW5kT3ZlckV4cG9zdXJlUGFyYW1zIHtcbiAgLyoqXG4gICAqIE9wdGlvbmFsIGNhbGxiYWNrIGludm9rZWQgb25jZSBwZXIgYW5hbHl6ZWQgc291cmNlIGZpbGUsIGZvciBsaXZlIHByb2dyZXNzIHJlcG9ydGluZy4gRm9yd2FyZGVkXG4gICAqIHRvIHtAbGluayBhbmFseXplT3ZlckV4cG9zdXJlfS5cbiAgICovXG4gIG9uUHJvZ3Jlc3M/KHRoaXM6IHZvaWQsIHByb2dyZXNzOiBPdmVyRXhwb3N1cmVQcm9ncmVzcyk6IHZvaWQ7XG5cbiAgLyoqIEFic29sdXRlIHBhdGggdG8gdGhlIHByb2plY3Qgcm9vdCAodGhlIGZvbGRlciBjb250YWluaW5nIGB0c2NvbmZpZy5qc29uYCBhbmQgYHNyY2ApLiAqL1xuICByZWFkb25seSBwcm9qZWN0Rm9sZGVyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZW4gYHRydWVgLCBmaXhhYmxlIGZpbmRpbmdzIGFyZSB0aWdodGVuZWQgaW4gcGxhY2Ugb24gZGlzayAodGhlIGBleHBvcnRgIGtleXdvcmQgaXMgZHJvcHBlZCxcbiAgICogb3IgYSBgcHJpdmF0ZWAgLyBgcHJvdGVjdGVkYCBtb2RpZmllciBpcyBpbnNlcnRlZC9yZXBsYWNlZCkuIFdoZW4gYGZhbHNlYCBvciBvbWl0dGVkLCB0aGVcbiAgICogcHJvamVjdCBpcyBvbmx5IGFuYWx5emVkLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRml4PzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogV2hlbiBgdHJ1ZWAgKG9ubHkgbWVhbmluZ2Z1bCB0b2dldGhlciB3aXRoIHtAbGluayBzaG91bGRGaXh9KSwgZGVjbGFyYXRpb25zIGhlbGQgd2lkZSBwdXJlbHkgYnlcbiAgICogdGVzdCByZWZlcmVuY2VzIGFyZSB0aWdodGVuZWQgdG9vLCBpbnN0ZWFkIG9mIGJlaW5nIHNraXBwZWQuIERlY29yYXRlZCBtZW1iZXJzIGFuZCBleHBvcnRzXG4gICAqIHNoYXJlZCB3aXRoIGEgc3RpbGwtZXhwb3J0ZWQgc2libGluZyBzdGF5IHNraXBwZWQgcmVnYXJkbGVzcy4gRm9yd2FyZGVkIHRvXG4gICAqIHtAbGluayBhbmFseXplT3ZlckV4cG9zdXJlfS5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEZvcmNlPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgZm9ybWF0T3ZlckV4cG9zdXJlRmluZGluZ3N9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1hdE92ZXJFeHBvc3VyZUZpbmRpbmdzT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXaGVuIHNldCwgZmlsZSBwYXRocyBpbiB0aGUgcmVwb3J0IGFyZSByZW5kZXJlZCByZWxhdGl2ZSB0byB0aGlzIGZvbGRlciAodHlwaWNhbGx5IHRoZSBjdXJyZW50XG4gICAqIHdvcmtpbmcgZGlyZWN0b3J5KSBpbnN0ZWFkIG9mIGFzIGFic29sdXRlIHBhdGhzLiBQYXRocyBvdXRzaWRlIHRoZSBmb2xkZXIgc3RheSBhYnNvbHV0ZS5cbiAgICovXG4gIHJlYWRvbmx5IGJhc2VGb2xkZXI/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHN1YnNldCBvZiBmaWxlLXN5c3RlbSBvcGVyYXRpb25zIHRoZSBsYW5ndWFnZS1zZXJ2aWNlIGhvc3QgbmVlZHMuIEluamVjdGluZyB0aGlzIChyYXRoZXIgdGhhblxuICogYWx3YXlzIHVzaW5nIGB0eXBlc2NyaXB0YCdzIGBzeXNgKSBsZXRzIHRlc3RzIGRyaXZlIHRoZSBhbmFseXplciBhZ2FpbnN0IGluLW1lbW9yeSBzb3VyY2VzIHdpdGggbm9cbiAqIHJlYWwgZmlsZS1zeXN0ZW0gYWNjZXNzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE92ZXJFeHBvc3VyZUZpbGVTeXN0ZW0ge1xuICAvKipcbiAgICogQHBhcmFtIHBhdGggLSBEaXJlY3RvcnkgcGF0aC5cbiAgICogQHJldHVybnMgYHRydWVgIHdoZW4gdGhlIGRpcmVjdG9yeSBleGlzdHMuXG4gICAqL1xuICBkaXJlY3RvcnlFeGlzdHModGhpczogdm9pZCwgcGF0aDogc3RyaW5nKTogYm9vbGVhbjtcblxuICAvKipcbiAgICogQHBhcmFtIHBhdGggLSBGaWxlIHBhdGguXG4gICAqIEByZXR1cm5zIGB0cnVlYCB3aGVuIHRoZSBmaWxlIGV4aXN0cy5cbiAgICovXG4gIGZpbGVFeGlzdHModGhpczogdm9pZCwgcGF0aDogc3RyaW5nKTogYm9vbGVhbjtcblxuICAvKipcbiAgICogQHJldHVybnMgVGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuXG4gICAqL1xuICBnZXRDdXJyZW50RGlyZWN0b3J5KHRoaXM6IHZvaWQpOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBwYXRoIC0gRGlyZWN0b3J5IHBhdGguXG4gICAqIEByZXR1cm5zIFRoZSBpbW1lZGlhdGUgc3ViZGlyZWN0b3J5IG5hbWVzLlxuICAgKi9cbiAgZ2V0RGlyZWN0b3JpZXModGhpczogdm9pZCwgcGF0aDogc3RyaW5nKTogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBwYXRoIC0gUm9vdCBkaXJlY3RvcnkuXG4gICAqIEBwYXJhbSBleHRlbnNpb25zIC0gRXh0ZW5zaW9ucyB0byBpbmNsdWRlLlxuICAgKiBAcGFyYW0gZXhjbHVkZSAtIFBhdHRlcm5zIHRvIGV4Y2x1ZGUuXG4gICAqIEBwYXJhbSBpbmNsdWRlIC0gUGF0dGVybnMgdG8gaW5jbHVkZS5cbiAgICogQHBhcmFtIGRlcHRoIC0gTWF4aW11bSByZWN1cnNpb24gZGVwdGguXG4gICAqIEByZXR1cm5zIFRoZSBtYXRjaGluZyBmaWxlIHBhdGhzLlxuICAgKi9cbiAgcmVhZERpcmVjdG9yeSh0aGlzOiB2b2lkLCBwYXRoOiBzdHJpbmcsIGV4dGVuc2lvbnM/OiByZWFkb25seSBzdHJpbmdbXSwgZXhjbHVkZT86IHJlYWRvbmx5IHN0cmluZ1tdLCBpbmNsdWRlPzogcmVhZG9ubHkgc3RyaW5nW10sIGRlcHRoPzogbnVtYmVyKTogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBwYXRoIC0gRmlsZSBwYXRoLlxuICAgKiBAcmV0dXJucyBUaGUgZmlsZSBjb250ZW50cywgb3IgYHVuZGVmaW5lZGAgd2hlbiBhYnNlbnQuXG4gICAqL1xuICByZWFkRmlsZSh0aGlzOiB2b2lkLCBwYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQSBzaW5nbGUgb3Zlci1leHBvc2VkIGRlY2xhcmF0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE92ZXJFeHBvc3VyZUZpbmRpbmcge1xuICAvKiogMS1iYXNlZCBjb2x1bW4gb2YgdGhlIGRlY2xhcmF0aW9uJ3MgbmFtZS4gKi9cbiAgcmVhZG9ubHkgY29sdW1uOiBudW1iZXI7XG5cbiAgLyoqIFRoZSBjdXJyZW50IGV4cG9zdXJlIGxldmVsLiAqL1xuICByZWFkb25seSBjdXJyZW50RXhwb3N1cmU6IEN1cnJlbnRFeHBvc3VyZTtcblxuICAvKiogQWJzb2x1dGUgcGF0aCBvZiB0aGUgZmlsZSBkZWNsYXJpbmcgdGhlIHN5bWJvbC4gKi9cbiAgcmVhZG9ubHkgZmlsZVBhdGg6IHN0cmluZztcblxuICAvKiogYHRydWVgIHdoZW4gdGhlIGRlY2xhcmF0aW9uIGhhcyBubyByZWZlcmVuY2VzIGF0IGFsbCAoYmVzaWRlcyBpdHNlbGYpLiAqL1xuICByZWFkb25seSBoYXNOb1JlZmVyZW5jZXM6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIGB0cnVlYCB3aGVuIHRoZSBkZWNsYXJhdGlvbiB3b3VsZCBxdWFsaWZ5IGZvciBhIHRpZ2h0ZXIgZXhwb3N1cmUgaWYgbm90IGZvciByZWZlcmVuY2VzIGNvbWluZ1xuICAgKiBleGNsdXNpdmVseSBmcm9tIHRlc3QgZmlsZXMgXHUyMDE0IGkuZS4gaXQgaXMgZXhwb3NlZCBwdXJlbHkgZm9yIHRlc3RhYmlsaXR5LlxuICAgKi9cbiAgcmVhZG9ubHkgaXNGb3JjZWRCeVRlc3RPbmx5OiBib29sZWFuO1xuXG4gIC8qKiBgdHJ1ZWAgZm9yIGEgY2xhc3MgbWVtYmVyLCBgZmFsc2VgIGZvciBhIHRvcC1sZXZlbCBleHBvcnQuICovXG4gIHJlYWRvbmx5IGlzTWVtYmVyOiBib29sZWFuO1xuXG4gIC8qKiAxLWJhc2VkIGxpbmUgb2YgdGhlIGRlY2xhcmF0aW9uJ3MgbmFtZS4gKi9cbiAgcmVhZG9ubHkgbGluZTogbnVtYmVyO1xuXG4gIC8qKiBUaGUgZGVjbGFyZWQgbmFtZS4gKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJbiBhIGZpeCBydW4sIHdoeSB0aGlzIGZpbmRpbmcgd2FzIGxlZnQgdW50b3VjaGVkIGluc3RlYWQgb2YgdGlnaHRlbmVkOyBgbnVsbGAgd2hlbiBpdCB3YXNcbiAgICogZml4ZWQgb3Igd2hlbiB0aGUgYW5hbHlzaXMgb25seSByZXBvcnRlZCAoYHNob3VsZEZpeGAgb2ZmKS5cbiAgICovXG4gIHJlYWRvbmx5IHNraXBSZWFzb246IG51bGwgfCBPdmVyRXhwb3N1cmVTa2lwUmVhc29uO1xuXG4gIC8qKiBUaGUgZXhwb3N1cmUgdGhlIGRlY2xhcmF0aW9uIGNvdWxkIGJlIHRpZ2h0ZW5lZCB0by4gKi9cbiAgcmVhZG9ubHkgc3VnZ2VzdGVkRXhwb3N1cmU6IFN1Z2dlc3RlZEV4cG9zdXJlO1xuXG4gIC8qKiBgdHJ1ZWAgd2hlbiBhIGZpeCBydW4gdGlnaHRlbmVkIHRoaXMgZGVjbGFyYXRpb24gaW4gcGxhY2UuIEFsd2F5cyBgZmFsc2VgIGluIGEgcmVwb3J0IHJ1bi4gKi9cbiAgcmVhZG9ubHkgd2FzRml4ZWQ6IGJvb2xlYW47XG59XG5cbi8qKlxuICogUHJvZ3Jlc3MgcmVwb3J0ZWQgd2hpbGUgYW5hbHl6aW5nIGEgcHJvamVjdCwgb25lIGV2ZW50IHBlciBhbmFseXplZCBzb3VyY2UgZmlsZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPdmVyRXhwb3N1cmVQcm9ncmVzcyB7XG4gIC8qKiBOdW1iZXIgb2Ygc291cmNlIGZpbGVzIGZ1bGx5IGFuYWx5emVkIGJlZm9yZSB0aGUgY3VycmVudCBvbmUgKDAtYmFzZWQpLiAqL1xuICByZWFkb25seSBhbmFseXplZEZpbGVDb3VudDogbnVtYmVyO1xuXG4gIC8qKiBBYnNvbHV0ZSAoY2Fub25pY2FsKSBwYXRoIG9mIHRoZSBzb3VyY2UgZmlsZSBhYm91dCB0byBiZSBhbmFseXplZC4gKi9cbiAgcmVhZG9ubHkgY3VycmVudEZpbGVQYXRoOiBzdHJpbmc7XG5cbiAgLyoqIFRvdGFsIG51bWJlciBvZiBzb3VyY2UgZmlsZXMgdGhhdCB3aWxsIGJlIGFuYWx5emVkLiAqL1xuICByZWFkb25seSB0b3RhbEZpbGVDb3VudDogbnVtYmVyO1xufVxuXG4vKipcbiAqIFdoeSBhIGZpeCBydW4gbGVmdCBhIGZpbmRpbmcgdW50b3VjaGVkOlxuICpcbiAqIC0gYGRlY29yYXRlZGAgXHUyMDE0IHRoZSBtZW1iZXIgY2FycmllcyBhIGRlY29yYXRvciwgc28gdGhlIG1vZGlmaWVyIGluc2VydGlvbiBwb2ludCBpcyBhbWJpZ3VvdXMuXG4gKiAtIGBzaGFyZWQtZXhwb3J0YCBcdTIwMTQgdGhlIGBleHBvcnRgIGtleXdvcmQgaXMgc2hhcmVkIHdpdGggYSBzdGlsbC1leHBvcnRlZCBzaWJsaW5nIGRlY2xhcmF0b3IuXG4gKiAtIGB0ZXN0LW9ubHlgIFx1MjAxNCB0aGUgZGVjbGFyYXRpb24gaXMgZXhwb3NlZCBwdXJlbHkgZm9yIHRlc3RzLCBzbyB0aWdodGVuaW5nIHdvdWxkIGJyZWFrIHRoZSB0ZXN0LlxuICovXG5leHBvcnQgdHlwZSBPdmVyRXhwb3N1cmVTa2lwUmVhc29uID0gJ2RlY29yYXRlZCcgfCAnc2hhcmVkLWV4cG9ydCcgfCAndGVzdC1vbmx5JztcblxuLyoqXG4gKiBUaGUgKHRpZ2h0ZXIpIGV4cG9zdXJlIGxldmVsIGEgZGVjbGFyYXRpb24gY291bGQgYmUgcmVkdWNlZCB0by5cbiAqL1xuZXhwb3J0IHR5cGUgU3VnZ2VzdGVkRXhwb3N1cmUgPSAnZmlsZS1sb2NhbCcgfCAncHJpdmF0ZScgfCAncHJvdGVjdGVkJztcblxuLyoqXG4gKiBMaWZlY3ljbGUgYW5kIGZyYW1ld29yayBtZW1iZXJzIGludm9rZWQgYnkgT2JzaWRpYW4gb3IgYSBiYXNlIGNsYXNzIHZpYSByZWdpc3RyYXRpb24gcmF0aGVyIHRoYW5cbiAqIGJ5IHJlZmVyZW5jZXMgdGhlIGxhbmd1YWdlIHNlcnZpY2UgY2FuIHNlZS4gVGlnaHRlbmluZyB0aGVzZSB3b3VsZCBicmVhayB0aGUgZnJhbWV3b3JrIGNvbnRyYWN0LFxuICogc28gdGhleSBhcmUgbmV2ZXIgcmVwb3J0ZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBMSUZFQ1lDTEVfQUxMT1dMSVNUOiBSZWFkb25seVNldDxzdHJpbmc+ID0gbmV3IFNldDxzdHJpbmc+KFtcbiAgJ2Rpc3BsYXknLFxuICAnaGlkZScsXG4gICdvbkV4dGVybmFsU2V0dGluZ3NDaGFuZ2UnLFxuICAnb25MYXlvdXRSZWFkeScsXG4gICdvbmxvYWQnLFxuICAnb25sb2FkSW1wbCcsXG4gICdvbkxvYWRTZXR0aW5ncycsXG4gICdvblNhdmVTZXR0aW5ncycsXG4gICdvbnVubG9hZCcsXG4gICdvbnVubG9hZEltcGwnXG5dKTtcblxuaW50ZXJmYWNlIEFuYWx5c2lzQ29udGV4dCB7XG4gIHJlYWRvbmx5IGNoZWNrZXI6IFR5cGVDaGVja2VyO1xuICByZWFkb25seSBlZGl0czogKG51bGwgfCBPdmVyRXhwb3N1cmVUZXh0RWRpdClbXTtcbiAgcmVhZG9ubHkgZmluZGluZ3M6IE92ZXJFeHBvc3VyZUZpbmRpbmdbXTtcbiAgcmVhZG9ubHkgbGFuZ3VhZ2VTZXJ2aWNlOiBMYW5ndWFnZVNlcnZpY2U7XG4gIHJlYWRvbmx5IHByb2dyYW06IFByb2dyYW07XG4gIHJlYWRvbmx5IHNob3VsZEZvcmNlOiBib29sZWFuO1xuICByZWFkb25seSBzdHJpbmdMaXRlcmFsT2NjdXJyZW5jZXNCeVRleHQ6IFJlYWRvbmx5TWFwPHN0cmluZywgcmVhZG9ubHkgU3RyaW5nTGl0ZXJhbE9jY3VycmVuY2VbXT47XG59XG5cbmludGVyZmFjZSBBbmFseXNpc1Jlc3VsdCB7XG4gIHJlYWRvbmx5IGVkaXRzOiByZWFkb25seSAobnVsbCB8IE92ZXJFeHBvc3VyZVRleHRFZGl0KVtdO1xuICByZWFkb25seSBmaW5kaW5nczogcmVhZG9ubHkgT3ZlckV4cG9zdXJlRmluZGluZ1tdO1xufVxuXG50eXBlIENsYXNzTWVtYmVyRGVjbGFyYXRpb24gPSBHZXRBY2Nlc3NvckRlY2xhcmF0aW9uIHwgTWV0aG9kRGVjbGFyYXRpb24gfCBQcm9wZXJ0eURlY2xhcmF0aW9uIHwgU2V0QWNjZXNzb3JEZWNsYXJhdGlvbjtcblxudHlwZSBFeHBvcnRhYmxlRGVjbGFyYXRpb24gPSBDbGFzc0RlY2xhcmF0aW9uIHwgRW51bURlY2xhcmF0aW9uIHwgRnVuY3Rpb25EZWNsYXJhdGlvbiB8IEludGVyZmFjZURlY2xhcmF0aW9uIHwgVHlwZUFsaWFzRGVjbGFyYXRpb24gfCBWYXJpYWJsZVN0YXRlbWVudDtcblxuaW50ZXJmYWNlIEV4cG9ydEZpbmRpbmdDYW5kaWRhdGUge1xuICByZWFkb25seSBmaW5kaW5nOiBPdmVyRXhwb3N1cmVGaW5kaW5nO1xuICByZWFkb25seSBpc1BsYWluRmlsZUxvY2FsOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgRmluZGluZ0ZsYWdzIHtcbiAgcmVhZG9ubHkgaGFzTm9SZWZlcmVuY2VzOiBib29sZWFuO1xuICByZWFkb25seSBpc0ZvcmNlZEJ5VGVzdE9ubHk6IGJvb2xlYW47XG59XG5cbnR5cGUgTWVtYmVyRXhwb3N1cmUgPSAncHJpdmF0ZScgfCAncHJvdGVjdGVkJyB8ICdwdWJsaWMnO1xuXG4vKipcbiAqIEEgc2luZ2xlIGluLXBsYWNlIHRleHQgcmVwbGFjZW1lbnQgdGhhdCB0aWdodGVucyBhIGRlY2xhcmF0aW9uJ3MgZXhwb3N1cmUuIEEgemVyby1sZW5ndGggZWRpdCBpc1xuICogYW4gaW5zZXJ0aW9uIChlLmcuIGFkZGluZyBhbiBleHBsaWNpdCBgcHJpdmF0ZWAgbW9kaWZpZXIgdG8gYW4gaW1wbGljaXRseS1gcHVibGljYCBtZW1iZXIpLlxuICovXG5pbnRlcmZhY2UgT3ZlckV4cG9zdXJlVGV4dEVkaXQge1xuICByZWFkb25seSBmaWxlTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBsZW5ndGg6IG51bWJlcjtcbiAgcmVhZG9ubHkgbmV3VGV4dDogc3RyaW5nO1xuICByZWFkb25seSBzdGFydDogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgUmVmZXJlbmNlTG9jYXRpb24ge1xuICByZWFkb25seSBmaWxlTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBzdGFydDogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgU291cmNlRmlsZVRleHQge1xuICByZWFkb25seSBmaWxlTmFtZTogc3RyaW5nO1xuICByZWFkb25seSB0ZXh0OiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBTdHJpbmdMaXRlcmFsT2NjdXJyZW5jZSB7XG4gIHJlYWRvbmx5IG5vZGU6IFN0cmluZ0xpdGVyYWxMaWtlO1xuICByZWFkb25seSBzb3VyY2VGaWxlOiBTb3VyY2VGaWxlO1xufVxuXG4vLyBBIEpTRG9jL1RTRG9jIGNvbW1lbnQgb3BlbnMgd2l0aCBgLyoqYDogdGhlIGNoYXJhY3RlciBhdCBvZmZzZXQgMiBpcyB0aGUgc2Vjb25kIGAqYCwgYW5kIHRvIGV4Y2x1ZGUgdGhlIGVtcHR5IGAvKiovYCBjb21tZW50IHRoZSBjaGFyYWN0ZXIgYXQgb2Zmc2V0IDMgbXVzdCBub3QgYmUgdGhlIGNsb3NpbmcgYC9gLlxuY29uc3QgSlNET0NfU0VDT05EX0FTVEVSSVNLX09GRlNFVCA9IDI7XG5jb25zdCBKU0RPQ19GT1VSVEhfQ0hBUkFDVEVSX09GRlNFVCA9IDM7XG5jb25zdCBNRU1CRVJfRVhQT1NVUkVfT1JERVI6IHJlYWRvbmx5IE1lbWJlckV4cG9zdXJlW10gPSBbJ3ByaXZhdGUnLCAncHJvdGVjdGVkJywgJ3B1YmxpYyddO1xuY29uc3QgU0NPUEVfREVTQ1JJUFRJT046IFJlY29yZDxTdWdnZXN0ZWRFeHBvc3VyZSwgc3RyaW5nPiA9IHtcbiAgJ2ZpbGUtbG9jYWwnOiAnd2l0aGluIGl0cyBvd24gZmlsZScsXG4gICdwcml2YXRlJzogJ2luc2lkZSBpdHMgb3duIGNsYXNzJyxcbiAgJ3Byb3RlY3RlZCc6ICdpbnNpZGUgaXRzIGNsYXNzICsgc3ViY2xhc3Nlcydcbn07XG5jb25zdCBTS0lQX1JFQVNPTl9ERVNDUklQVElPTjogUmVjb3JkPE92ZXJFeHBvc3VyZVNraXBSZWFzb24sIHN0cmluZz4gPSB7XG4gICdkZWNvcmF0ZWQnOiAnZGVjb3JhdGVkIG1lbWJlcicsXG4gICdzaGFyZWQtZXhwb3J0JzogJ2V4cG9ydCBzaGFyZWQgd2l0aCBhIHN0aWxsLWV4cG9ydGVkIHNpYmxpbmcnLFxuICAndGVzdC1vbmx5JzogJ2V4cG9zZWQgb25seSBmb3IgdGVzdHMnXG59O1xuY29uc3QgVklTSUJJTElUWV9NT0RJRklFUl9LSU5EUzogUmVhZG9ubHlTZXQ8U3ludGF4S2luZD4gPSBuZXcgU2V0PFN5bnRheEtpbmQ+KFtTeW50YXhLaW5kLlByaXZhdGVLZXl3b3JkLCBTeW50YXhLaW5kLlByb3RlY3RlZEtleXdvcmQsIFN5bnRheEtpbmQuUHVibGljS2V5d29yZF0pO1xuY29uc3QgV0hJVEVTUEFDRV9QQVRURVJOID0gL1xccy87XG5cbi8qKlxuICogQW5hbHl6ZXMgYSBwcm9qZWN0IChhbHJlYWR5IGxvYWRlZCBpbnRvIGEgbGFuZ3VhZ2Ugc2VydmljZSkgZm9yIG92ZXItZXhwb3NlZCBkZWNsYXJhdGlvbnMsIGFuZCBcdTIwMTRcbiAqIHdoZW4ge0BsaW5rIEFuYWx5emVPdmVyRXhwb3N1cmVQYXJhbXMuc2hvdWxkRml4fSBpcyBzZXQgXHUyMDE0IHRpZ2h0ZW5zIGV2ZXJ5IGZpeGFibGUgZmluZGluZyBpbiBwbGFjZVxuICogdmlhIHtAbGluayBBbmFseXplT3ZlckV4cG9zdXJlUGFyYW1zLndyaXRlRmlsZX0uIEZpbmRpbmdzIHRoYXQgY2Fubm90IGJlIHNhZmVseSBhdXRvbWF0ZWQgKGV4cG9zZWRcbiAqIG9ubHkgZm9yIHRlc3RzLCBkZWNvcmF0ZWQsIG9yIHNoYXJpbmcgYW4gYGV4cG9ydGAga2V5d29yZCB3aXRoIGEgc3RpbGwtZXhwb3J0ZWQgc2libGluZykgY2FycnkgYVxuICoge0BsaW5rIE92ZXJFeHBvc3VyZUZpbmRpbmcuc2tpcFJlYXNvbn0gYW5kIGFyZSBsZWZ0IHVudG91Y2hlZCBcdTIwMTQgdW5sZXNzXG4gKiB7QGxpbmsgQW5hbHl6ZU92ZXJFeHBvc3VyZVBhcmFtcy5zaG91bGRGb3JjZX0gaXMgc2V0LCB3aGljaCBhZGRpdGlvbmFsbHkgdGlnaHRlbnMgdGhlIHRlc3Qtb25seVxuICogZmluZGluZ3MgKGRlY29yYXRlZCBhbmQgc2hhcmVkLWV4cG9ydCBvbmVzIHN0aWxsIHN0YXkgc2tpcHBlZCkuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSB7QGxpbmsgQW5hbHl6ZU92ZXJFeHBvc3VyZVBhcmFtc30uXG4gKiBAcmV0dXJucyBUaGUgb3Zlci1leHBvc2VkIGRlY2xhcmF0aW9ucywgaW4gZGlzY292ZXJ5IG9yZGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYW5hbHl6ZU92ZXJFeHBvc3VyZShwYXJhbXM6IEFuYWx5emVPdmVyRXhwb3N1cmVQYXJhbXMpOiBPdmVyRXhwb3N1cmVGaW5kaW5nW10ge1xuICBjb25zdCByZXN1bHQgPSBydW5PdmVyRXhwb3N1cmVBbmFseXNpcyhwYXJhbXMpO1xuICBpZiAoIXBhcmFtcy5zaG91bGRGaXgpIHtcbiAgICByZXR1cm4gWy4uLnJlc3VsdC5maW5kaW5nc107XG4gIH1cblxuICBjb25zdCB7IHdyaXRlRmlsZSB9ID0gcGFyYW1zO1xuICBhc3NlcnROb25OdWxsYWJsZSh3cml0ZUZpbGUsICd3cml0ZUZpbGUgaXMgcmVxdWlyZWQgd2hlbiBzaG91bGRGaXggaXMgdHJ1ZS4nKTtcbiAgcmV0dXJuIGFwcGx5T3ZlckV4cG9zdXJlRml4ZXMocmVzdWx0LCBwYXJhbXMubGFuZ3VhZ2VTZXJ2aWNlLmdldFByb2dyYW0oKSwgd3JpdGVGaWxlLCBwYXJhbXMuc2hvdWxkRm9yY2UgPz8gZmFsc2UpO1xufVxuXG4vKipcbiAqIEJ1aWxkcyBhIHtAbGluayBMYW5ndWFnZVNlcnZpY2VIb3N0fSBiYWNrZWQgYnkgYW4gZXhwbGljaXQgZmlsZSBsaXN0IGFuZCBmaWxlIHN5c3RlbS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBDcmVhdGVMYW5ndWFnZVNlcnZpY2VIb3N0UGFyYW1zfS5cbiAqIEByZXR1cm5zIFRoZSBsYW5ndWFnZS1zZXJ2aWNlIGhvc3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVMYW5ndWFnZVNlcnZpY2VIb3N0KHBhcmFtczogQ3JlYXRlTGFuZ3VhZ2VTZXJ2aWNlSG9zdFBhcmFtcyk6IExhbmd1YWdlU2VydmljZUhvc3Qge1xuICBjb25zdCB7IGNvbXBpbGVyT3B0aW9ucywgZmlsZU5hbWVzLCBmaWxlU3lzdGVtIH0gPSBwYXJhbXM7XG4gIHJldHVybiB7XG4gICAgZGlyZWN0b3J5RXhpc3RzOiAoZGlyZWN0b3J5KSA9PiBmaWxlU3lzdGVtLmRpcmVjdG9yeUV4aXN0cyhkaXJlY3RvcnkpLFxuICAgIGZpbGVFeGlzdHM6IChmaWxlKSA9PiBmaWxlU3lzdGVtLmZpbGVFeGlzdHMoZmlsZSksXG4gICAgZ2V0Q29tcGlsYXRpb25TZXR0aW5nczogKCkgPT4gY29tcGlsZXJPcHRpb25zLFxuICAgIGdldEN1cnJlbnREaXJlY3Rvcnk6ICgpID0+IGZpbGVTeXN0ZW0uZ2V0Q3VycmVudERpcmVjdG9yeSgpLFxuICAgIGdldERlZmF1bHRMaWJGaWxlTmFtZTogKGxpYk9wdGlvbnMpID0+IGdldERlZmF1bHRMaWJGaWxlUGF0aChsaWJPcHRpb25zKSxcbiAgICBnZXREaXJlY3RvcmllczogKGRpcmVjdG9yeSkgPT4gZmlsZVN5c3RlbS5nZXREaXJlY3RvcmllcyhkaXJlY3RvcnkpLFxuICAgIGdldFNjcmlwdEZpbGVOYW1lczogKCkgPT4gWy4uLmZpbGVOYW1lc10sXG4gICAgZ2V0U2NyaXB0U25hcHNob3Q6IChmaWxlTmFtZSk6IElTY3JpcHRTbmFwc2hvdCB8IHVuZGVmaW5lZCA9PiB7XG4gICAgICBjb25zdCB0ZXh0ID0gZmlsZVN5c3RlbS5yZWFkRmlsZShmaWxlTmFtZSk7XG4gICAgICByZXR1cm4gdGV4dCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogU2NyaXB0U25hcHNob3QuZnJvbVN0cmluZyh0ZXh0KTtcbiAgICB9LFxuICAgIGdldFNjcmlwdFZlcnNpb246ICgpID0+ICcwJyxcbiAgICByZWFkRGlyZWN0b3J5OiAocGF0aCwgZXh0ZW5zaW9ucywgZXhjbHVkZSwgaW5jbHVkZSwgZGVwdGgpID0+IGZpbGVTeXN0ZW0ucmVhZERpcmVjdG9yeShwYXRoLCBleHRlbnNpb25zLCBleGNsdWRlLCBpbmNsdWRlLCBkZXB0aCksXG4gICAgcmVhZEZpbGU6IChmaWxlKSA9PiBmaWxlU3lzdGVtLnJlYWRGaWxlKGZpbGUpXG4gIH07XG59XG5cbi8qKlxuICogQnVpbGRzIGEgbGFuZ3VhZ2Ugc2VydmljZSBvdmVyIGV2ZXJ5IGZpbGUgaW4gYSBwcm9qZWN0J3MgYHRzY29uZmlnLmpzb25gLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIENyZWF0ZVByb2plY3RMYW5ndWFnZVNlcnZpY2VQYXJhbXN9LlxuICogQHJldHVybnMgQSBsYW5ndWFnZSBzZXJ2aWNlIHJlYWR5IGZvciB7QGxpbmsgYW5hbHl6ZU92ZXJFeHBvc3VyZX0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQcm9qZWN0TGFuZ3VhZ2VTZXJ2aWNlKHBhcmFtczogQ3JlYXRlUHJvamVjdExhbmd1YWdlU2VydmljZVBhcmFtcyk6IExhbmd1YWdlU2VydmljZSB7XG4gIGNvbnN0IHsgZmlsZU5hbWVzLCBvcHRpb25zIH0gPSBwYXJzZVRzQ29uZmlnKHBhcmFtcy50c0NvbmZpZ1BhdGgpO1xuICByZXR1cm4gY3JlYXRlTGFuZ3VhZ2VTZXJ2aWNlKGNyZWF0ZUxhbmd1YWdlU2VydmljZUhvc3QoeyBjb21waWxlck9wdGlvbnM6IG9wdGlvbnMsIGZpbGVOYW1lcywgZmlsZVN5c3RlbTogc3lzIH0pLCBjcmVhdGVEb2N1bWVudFJlZ2lzdHJ5KCkpO1xufVxuXG4vKipcbiAqIEZpbmRzIG92ZXItZXhwb3NlZCBkZWNsYXJhdGlvbnMgaW4gYSBwcm9qZWN0IG9uIGRpc2suIFdoZW5cbiAqIHtAbGluayBGaW5kT3ZlckV4cG9zdXJlUGFyYW1zLnNob3VsZEZpeH0gaXMgc2V0LCBlYWNoIGZpeGFibGUgZmluZGluZyBpcyBhbHNvIHRpZ2h0ZW5lZCBpbiBwbGFjZVxuICogKHJld3JpdGluZyB0aGUgYWZmZWN0ZWQgc291cmNlIGZpbGVzIHZpYSBgdHlwZXNjcmlwdGAncyBgc3lzLndyaXRlRmlsZWApLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIEZpbmRPdmVyRXhwb3N1cmVQYXJhbXN9LlxuICogQHJldHVybnMgVGhlIG92ZXItZXhwb3NlZCBkZWNsYXJhdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kT3ZlckV4cG9zdXJlKHBhcmFtczogRmluZE92ZXJFeHBvc3VyZVBhcmFtcyk6IE92ZXJFeHBvc3VyZUZpbmRpbmdbXSB7XG4gIGNvbnN0IHByb2plY3RGb2xkZXIgPSB0b0Nhbm9uaWNhbChwYXJhbXMucHJvamVjdEZvbGRlcik7XG4gIGNvbnN0IGxhbmd1YWdlU2VydmljZSA9IGNyZWF0ZVByb2plY3RMYW5ndWFnZVNlcnZpY2UoeyB0c0NvbmZpZ1BhdGg6IGAke3Byb2plY3RGb2xkZXJ9L3RzY29uZmlnLmpzb25gIH0pO1xuICByZXR1cm4gYW5hbHl6ZU92ZXJFeHBvc3VyZSh7XG4gICAgbGFuZ3VhZ2VTZXJ2aWNlLFxuICAgIHNob3VsZEZpeDogcGFyYW1zLnNob3VsZEZpeCxcbiAgICBzaG91bGRGb3JjZTogcGFyYW1zLnNob3VsZEZvcmNlLFxuICAgIHNyY0ZvbGRlcjogYCR7cHJvamVjdEZvbGRlcn0vc3JjYCxcbiAgICB3cml0ZUZpbGU6IChwYXRoLCBjb250ZW50KSA9PiB7XG4gICAgICBzeXMud3JpdGVGaWxlKHBhdGgsIGNvbnRlbnQpO1xuICAgIH0sXG4gICAgLi4ucGFyYW1zLm9uUHJvZ3Jlc3MgPyB7IG9uUHJvZ3Jlc3M6IHBhcmFtcy5vblByb2dyZXNzIH0gOiB7fVxuICB9KTtcbn1cblxuLyoqXG4gKiBGb3JtYXRzIG92ZXItZXhwb3N1cmUgZmluZGluZ3MgYXMgYSBodW1hbi1yZWFkYWJsZSByZXBvcnQsIHVzaW5nIHRoZSBncm91cGVkIGxheW91dCBvZiBFU0xpbnQnc1xuICogYHN0eWxpc2hgIGZvcm1hdHRlci4gRmluZGluZ3MgYXJlIGdyb3VwZWQgYnkgZmlsZSBhbmQgc29ydGVkIGJ5IGxpbmU6IGVhY2ggZmlsZSBpcyByZW5kZXJlZCBhcyBhXG4gKiBgcGF0aGAgaGVhZGVyIGxpbmUsIGZvbGxvd2VkIGJ5IG9uZSBpbmRlbnRlZCBgICBsaW5lOmNvbHVtbiAgY2hhbmdlIC0tIHJlYXNvbmAgcm93IHBlciBmaW5kaW5nICh0aGVcbiAqIGBsaW5lOmNvbHVtbmAgaXMgcmlnaHQtcGFkZGVkIHNvIHRoZSByb3dzIGFsaWduIHdpdGhpbiBhIGZpbGUpLiBUZXJtaW5hbHMgc3VjaCBhcyBWUyBDb2RlIHJlbmRlclxuICogZWFjaCBpbmRlbnRlZCBgbGluZTpjb2x1bW5gIGFzIGEgY2xpY2thYmxlIGxpbmsgXHUyMDE0IHJlc29sdmVkIGFnYWluc3QgdGhlIGZpbGUgaGVhZGVyIGFib3ZlIGl0IFx1MjAxNCB0aGF0XG4gKiBqdW1wcyBzdHJhaWdodCB0byB0aGUgZGVjbGFyYXRpb24uIEZpbGUgZ3JvdXBzIGFyZSBzZXBhcmF0ZWQgYnkgYSBibGFuayBsaW5lLiBJbiBhIGZpeCBydW4gKGZpbmRpbmdzXG4gKiBjYXJyeWluZyB7QGxpbmsgT3ZlckV4cG9zdXJlRmluZGluZy53YXNGaXhlZH0gLyB7QGxpbmsgT3ZlckV4cG9zdXJlRmluZGluZy5za2lwUmVhc29ufSkgZWFjaCBjaGFuZ2VcbiAqIHJvdyBpcyBzdWZmaXhlZCB3aXRoIGBbZml4ZWRdYCBvciBgW3NraXBwZWQ6IFx1MjAyNl1gLCBhbmQgdGhlIHRyYWlsaW5nIHN1bW1hcnkgYXBwZW5kcyB0aGUgZml4ZWQvc2tpcHBlZFxuICogY291bnRzLlxuICpcbiAqIEBwYXJhbSBmaW5kaW5ncyAtIFRoZSBmaW5kaW5ncyB0byBmb3JtYXQuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSB7QGxpbmsgRm9ybWF0T3ZlckV4cG9zdXJlRmluZGluZ3NPcHRpb25zfS5cbiAqIEByZXR1cm5zIFRoZSByZXBvcnQgdGV4dC4gRW1wdHktZmluZGluZyBpbnB1dCB5aWVsZHMgYSBzaW5nbGUgXCJubyBmaW5kaW5nc1wiIGxpbmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRPdmVyRXhwb3N1cmVGaW5kaW5ncyhmaW5kaW5nczogcmVhZG9ubHkgT3ZlckV4cG9zdXJlRmluZGluZ1tdLCBvcHRpb25zPzogRm9ybWF0T3ZlckV4cG9zdXJlRmluZGluZ3NPcHRpb25zKTogc3RyaW5nIHtcbiAgaWYgKGZpbmRpbmdzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiAnTm8gb3Zlci1leHBvc2VkIGRlY2xhcmF0aW9ucyBmb3VuZC5cXG4nO1xuICB9XG5cbiAgY29uc3QgYmFzZUZvbGRlciA9IG9wdGlvbnM/LmJhc2VGb2xkZXIgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHRvQ2Fub25pY2FsKG9wdGlvbnMuYmFzZUZvbGRlcik7XG4gIGNvbnN0IGxpbmVzID0gZm9ybWF0RmluZGluZ0Jsb2NrcyhmaW5kaW5ncywgYmFzZUZvbGRlcik7XG4gIGxpbmVzLnB1c2goZm9ybWF0U3VtbWFyeShmaW5kaW5ncykpO1xuICByZXR1cm4gYCR7bGluZXMuam9pbignXFxuJyl9XFxuYDtcbn1cblxuZnVuY3Rpb24gYW5hbHl6ZUV4cG9ydChub2RlOiBOb2RlLCBjb250ZXh0OiBBbmFseXNpc0NvbnRleHQpOiB2b2lkIHtcbiAgY29uc3Qgc291cmNlRmlsZSA9IG5vZGUuZ2V0U291cmNlRmlsZSgpO1xuICBpZiAobm9kZS5wYXJlbnQgIT09IHNvdXJjZUZpbGUgfHwgIWdldE1vZGlmaWVyS2luZHMobm9kZSkuaGFzKFN5bnRheEtpbmQuRXhwb3J0S2V5d29yZCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBkZWNsYXJhdGlvbiA9IGFzRXhwb3J0YWJsZURlY2xhcmF0aW9uKG5vZGUpO1xuICBpZiAoIWRlY2xhcmF0aW9uKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGhhc1RzRG9jQ29tbWVudChkZWNsYXJhdGlvbikpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBkZWNsRmlsZVBhdGggPSB0b0Nhbm9uaWNhbChzb3VyY2VGaWxlLmZpbGVOYW1lKTtcbiAgY29uc3QgbmFtZU5vZGVzID0gZ2V0RXhwb3J0ZWROYW1lTm9kZXMoZGVjbGFyYXRpb24pO1xuICBjb25zdCBjYW5kaWRhdGVzOiBFeHBvcnRGaW5kaW5nQ2FuZGlkYXRlW10gPSBbXTtcbiAgZm9yIChjb25zdCBuYW1lTm9kZSBvZiBuYW1lTm9kZXMpIHtcbiAgICBjb25zdCByZWZlcmVuY2VzID0gY29sbGVjdFJlZmVyZW5jZXMoY29udGV4dC5sYW5ndWFnZVNlcnZpY2UuZmluZFJlZmVyZW5jZXMoc291cmNlRmlsZS5maWxlTmFtZSwgbmFtZU5vZGUuZ2V0U3RhcnQoKSkpXG4gICAgICAuZmlsdGVyKChyZWZlcmVuY2UpID0+ICFpc0RlY2xhcmF0aW9uSXRzZWxmKHJlZmVyZW5jZSwgbmFtZU5vZGUpKTtcbiAgICBjb25zdCBvdGhlckZpbGVSZWZlcmVuY2VzID0gcmVmZXJlbmNlcy5maWx0ZXIoKHJlZmVyZW5jZSkgPT4gdG9DYW5vbmljYWwocmVmZXJlbmNlLmZpbGVOYW1lKSAhPT0gZGVjbEZpbGVQYXRoKTtcblxuICAgIGlmIChvdGhlckZpbGVSZWZlcmVuY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY2FuZGlkYXRlcy5wdXNoKHtcbiAgICAgICAgZmluZGluZzogYnVpbGRGaW5kaW5nKGRlY2xhcmF0aW9uLCBuYW1lTm9kZSwgJ2V4cG9ydCcsICdmaWxlLWxvY2FsJywgeyBoYXNOb1JlZmVyZW5jZXM6IHJlZmVyZW5jZXMubGVuZ3RoID09PSAwLCBpc0ZvcmNlZEJ5VGVzdE9ubHk6IGZhbHNlIH0pLFxuICAgICAgICBpc1BsYWluRmlsZUxvY2FsOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IG5vblRlc3RSZWZlcmVuY2VzID0gb3RoZXJGaWxlUmVmZXJlbmNlcy5maWx0ZXIoKHJlZmVyZW5jZSkgPT4gIWlzVGVzdEZpbGUodG9DYW5vbmljYWwocmVmZXJlbmNlLmZpbGVOYW1lKSkpO1xuICAgIGlmIChub25UZXN0UmVmZXJlbmNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNhbmRpZGF0ZXMucHVzaCh7XG4gICAgICAgIGZpbmRpbmc6IGJ1aWxkRmluZGluZyhkZWNsYXJhdGlvbiwgbmFtZU5vZGUsICdleHBvcnQnLCAnZmlsZS1sb2NhbCcsIHsgaGFzTm9SZWZlcmVuY2VzOiBmYWxzZSwgaXNGb3JjZWRCeVRlc3RPbmx5OiB0cnVlIH0pLFxuICAgICAgICBpc1BsYWluRmlsZUxvY2FsOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNhbmRpZGF0ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgY2FuRHJvcEV4cG9ydCA9IGNhbmRpZGF0ZXMubGVuZ3RoID09PSBuYW1lTm9kZXMubGVuZ3RoICYmIGNhbmRpZGF0ZXMuZXZlcnkoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLmlzUGxhaW5GaWxlTG9jYWwgfHwgY29udGV4dC5zaG91bGRGb3JjZSk7XG4gIGNvbnN0IGV4cG9ydEVkaXQgPSBjYW5Ecm9wRXhwb3J0ID8gY29tcHV0ZUV4cG9ydFJlbW92YWxFZGl0KGRlY2xhcmF0aW9uKSA6IG51bGw7XG4gIGZvciAoY29uc3QgY2FuZGlkYXRlIG9mIGNhbmRpZGF0ZXMpIHtcbiAgICByZWNvcmQoY29udGV4dCwgY2FuZGlkYXRlLmZpbmRpbmcsIGV4cG9ydEVkaXQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGFuYWx5emVNZW1iZXIobm9kZTogTm9kZSwgY29udGV4dDogQW5hbHlzaXNDb250ZXh0KTogdm9pZCB7XG4gIGNvbnN0IG1lbWJlciA9IGFzQ2xhc3NNZW1iZXIobm9kZSk7XG4gIGlmICghbWVtYmVyIHx8ICFpc0NsYXNzTGlrZShub2RlLnBhcmVudCkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgbmFtZU5vZGUgPSBtZW1iZXIubmFtZTtcbiAgY29uc3QgZGVjbGFyaW5nQ2xhc3MgPSBub2RlLnBhcmVudDtcblxuICBpZiAoaXNQcml2YXRlSWRlbnRpZmllcihuYW1lTm9kZSkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBtb2RpZmllcktpbmRzID0gZ2V0TW9kaWZpZXJLaW5kcyhtZW1iZXIpO1xuICBpZiAobW9kaWZpZXJLaW5kcy5oYXMoU3ludGF4S2luZC5TdGF0aWNLZXl3b3JkKSB8fCBtb2RpZmllcktpbmRzLmhhcyhTeW50YXhLaW5kLk92ZXJyaWRlS2V5d29yZCkgfHwgTElGRUNZQ0xFX0FMTE9XTElTVC5oYXMobmFtZU5vZGUuZ2V0VGV4dCgpKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChoYXNUc0RvY0NvbW1lbnQobWVtYmVyKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGN1cnJlbnRFeHBvc3VyZSA9IGdldEN1cnJlbnRNZW1iZXJFeHBvc3VyZShtb2RpZmllcktpbmRzKTtcbiAgaWYgKGN1cnJlbnRFeHBvc3VyZSA9PT0gJ3ByaXZhdGUnKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgc291cmNlRmlsZSA9IG1lbWJlci5nZXRTb3VyY2VGaWxlKCk7XG4gIGNvbnN0IGRpcmVjdFJlZmVyZW5jZXMgPSBjb2xsZWN0UmVmZXJlbmNlcyhjb250ZXh0Lmxhbmd1YWdlU2VydmljZS5maW5kUmVmZXJlbmNlcyhzb3VyY2VGaWxlLmZpbGVOYW1lLCBuYW1lTm9kZS5nZXRTdGFydCgpKSlcbiAgICAuZmlsdGVyKChyZWZlcmVuY2UpID0+ICFpc0RlY2xhcmF0aW9uSXRzZWxmKHJlZmVyZW5jZSwgbmFtZU5vZGUpKTtcbiAgY29uc3QgcmVmZXJlbmNlcyA9IFsuLi5kaXJlY3RSZWZlcmVuY2VzLCAuLi5jb2xsZWN0U3RyaW5nTGl0ZXJhbFJlZmVyZW5jZXMobmFtZU5vZGUsIGRlY2xhcmluZ0NsYXNzLCBjb250ZXh0KV07XG4gIGNvbnN0IG5vblRlc3RSZWZlcmVuY2VzID0gcmVmZXJlbmNlcy5maWx0ZXIoKHJlZmVyZW5jZSkgPT4gIWlzVGVzdEZpbGUodG9DYW5vbmljYWwocmVmZXJlbmNlLmZpbGVOYW1lKSkpO1xuXG4gIGNvbnN0IG5lZWRlZEZvclNyYyA9IGNvbXB1dGVOZWVkZWRFeHBvc3VyZShub25UZXN0UmVmZXJlbmNlcywgZGVjbGFyaW5nQ2xhc3MsIGNvbnRleHQpO1xuICBjb25zdCBuZWVkZWRXaXRoVGVzdHMgPSBjb21wdXRlTmVlZGVkRXhwb3N1cmUocmVmZXJlbmNlcywgZGVjbGFyaW5nQ2xhc3MsIGNvbnRleHQpO1xuXG4gIGlmIChuZWVkZWRGb3JTcmMgPT09ICdwdWJsaWMnKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHJhbmtFeHBvc3VyZShuZWVkZWRGb3JTcmMpID49IHJhbmtFeHBvc3VyZShjdXJyZW50RXhwb3N1cmUpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgZmluZGluZyA9IGJ1aWxkRmluZGluZyhtZW1iZXIsIG5hbWVOb2RlLCBjdXJyZW50RXhwb3N1cmUsIG5lZWRlZEZvclNyYywge1xuICAgIGhhc05vUmVmZXJlbmNlczogcmVmZXJlbmNlcy5sZW5ndGggPT09IDAsXG4gICAgaXNGb3JjZWRCeVRlc3RPbmx5OiByYW5rRXhwb3N1cmUobmVlZGVkV2l0aFRlc3RzKSA+IHJhbmtFeHBvc3VyZShuZWVkZWRGb3JTcmMpXG4gIH0pO1xuICByZWNvcmQoY29udGV4dCwgZmluZGluZywgY29tcHV0ZU1lbWJlckV4cG9zdXJlRWRpdChtZW1iZXIsIG5lZWRlZEZvclNyYykpO1xufVxuXG5mdW5jdGlvbiBhcHBseUVkaXRzKHRleHQ6IHN0cmluZywgZWRpdHM6IHJlYWRvbmx5IE92ZXJFeHBvc3VyZVRleHRFZGl0W10pOiBzdHJpbmcge1xuICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IHVuaXF1ZUVkaXRzID0gZWRpdHNcbiAgICAuZmlsdGVyKChlZGl0KSA9PiB7XG4gICAgICBjb25zdCBrZXkgPSBgJHtTdHJpbmcoZWRpdC5zdGFydCl9OiR7U3RyaW5nKGVkaXQubGVuZ3RoKX06JHtlZGl0Lm5ld1RleHR9YDtcbiAgICAgIGlmIChzZWVuLmhhcyhrZXkpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHNlZW4uYWRkKGtleSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KVxuICAgIC5zb3J0KChhLCBiKSA9PiBiLnN0YXJ0IC0gYS5zdGFydCk7XG5cbiAgbGV0IHJlc3VsdCA9IHRleHQ7XG4gIGZvciAoY29uc3QgZWRpdCBvZiB1bmlxdWVFZGl0cykge1xuICAgIHJlc3VsdCA9IGAke3Jlc3VsdC5zbGljZSgwLCBlZGl0LnN0YXJ0KX0ke2VkaXQubmV3VGV4dH0ke3Jlc3VsdC5zbGljZShlZGl0LnN0YXJ0ICsgZWRpdC5sZW5ndGgpfWA7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gYXBwbHlPdmVyRXhwb3N1cmVGaXhlcyhcbiAgcmVzdWx0OiBBbmFseXNpc1Jlc3VsdCxcbiAgcHJvZ3JhbTogUHJvZ3JhbSB8IHVuZGVmaW5lZCxcbiAgd3JpdGVGaWxlOiAodGhpczogdm9pZCwgcGF0aDogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcpID0+IHZvaWQsXG4gIHNob3VsZEZvcmNlOiBib29sZWFuXG4pOiBPdmVyRXhwb3N1cmVGaW5kaW5nW10ge1xuICBjb25zdCBlZGl0c0J5RmlsZSA9IG5ldyBNYXA8c3RyaW5nLCBPdmVyRXhwb3N1cmVUZXh0RWRpdFtdPigpO1xuICBjb25zdCBmaW5kaW5ncyA9IHJlc3VsdC5maW5kaW5ncy5tYXAoKGZpbmRpbmcsIGluZGV4KSA9PiB7XG4gICAgY29uc3QgZWRpdCA9IHJlc3VsdC5lZGl0c1tpbmRleF0gPz8gbnVsbDtcbiAgICBjb25zdCBza2lwUmVhc29uID0gZGV0ZXJtaW5lU2tpcFJlYXNvbihmaW5kaW5nLCBlZGl0LCBzaG91bGRGb3JjZSk7XG4gICAgaWYgKHNraXBSZWFzb24gIT09IG51bGwpIHtcbiAgICAgIHJldHVybiB7IC4uLmZpbmRpbmcsIHNraXBSZWFzb24sIHdhc0ZpeGVkOiBmYWxzZSB9O1xuICAgIH1cbiAgICBhc3NlcnROb25OdWxsYWJsZShlZGl0LCAnQSBmaXhhYmxlIGZpbmRpbmcgbXVzdCBjYXJyeSBhIHRleHQgZWRpdC4nKTtcbiAgICBjb25zdCBmaWxlRWRpdHMgPSBlZGl0c0J5RmlsZS5nZXQoZWRpdC5maWxlTmFtZSkgPz8gW107XG4gICAgZmlsZUVkaXRzLnB1c2goZWRpdCk7XG4gICAgZWRpdHNCeUZpbGUuc2V0KGVkaXQuZmlsZU5hbWUsIGZpbGVFZGl0cyk7XG4gICAgcmV0dXJuIHsgLi4uZmluZGluZywgc2tpcFJlYXNvbjogbnVsbCwgd2FzRml4ZWQ6IHRydWUgfTtcbiAgfSk7XG5cbiAgaWYgKGVkaXRzQnlGaWxlLnNpemUgPiAwKSB7XG4gICAgYXNzZXJ0Tm9uTnVsbGFibGUocHJvZ3JhbSwgJ0EgcHJvZ3JhbSBpcyBleHBlY3RlZCB3aGVuIHRoZXJlIGFyZSBlZGl0cyB0byBhcHBseS4nKTtcbiAgICBjb25zdCBzb3VyY2VUZXh0QnlGaWxlID0gbmV3IE1hcDxzdHJpbmcsIFNvdXJjZUZpbGVUZXh0PigpO1xuICAgIGZvciAoY29uc3Qgc291cmNlRmlsZSBvZiBwcm9ncmFtLmdldFNvdXJjZUZpbGVzKCkpIHtcbiAgICAgIHNvdXJjZVRleHRCeUZpbGUuc2V0KHRvQ2Fub25pY2FsKHNvdXJjZUZpbGUuZmlsZU5hbWUpLCB7IGZpbGVOYW1lOiBzb3VyY2VGaWxlLmZpbGVOYW1lLCB0ZXh0OiBzb3VyY2VGaWxlLnRleHQgfSk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgW2Nhbm9uaWNhbEZpbGVOYW1lLCBmaWxlRWRpdHNdIG9mIGVkaXRzQnlGaWxlKSB7XG4gICAgICBjb25zdCBzb3VyY2UgPSBzb3VyY2VUZXh0QnlGaWxlLmdldChjYW5vbmljYWxGaWxlTmFtZSk7XG4gICAgICBhc3NlcnROb25OdWxsYWJsZShzb3VyY2UsIGBTb3VyY2UgZmlsZSBub3QgZm91bmQgaW4gcHJvZ3JhbTogJHtjYW5vbmljYWxGaWxlTmFtZX1gKTtcbiAgICAgIHdyaXRlRmlsZShzb3VyY2UuZmlsZU5hbWUsIGFwcGx5RWRpdHMoc291cmNlLnRleHQsIGZpbGVFZGl0cykpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmaW5kaW5ncztcbn1cblxuZnVuY3Rpb24gYXNDbGFzc01lbWJlcihub2RlOiBOb2RlKTogQ2xhc3NNZW1iZXJEZWNsYXJhdGlvbiB8IHVuZGVmaW5lZCB7XG4gIGlmIChpc01ldGhvZERlY2xhcmF0aW9uKG5vZGUpIHx8IGlzUHJvcGVydHlEZWNsYXJhdGlvbihub2RlKSB8fCBpc0dldEFjY2Vzc29yRGVjbGFyYXRpb24obm9kZSkgfHwgaXNTZXRBY2Nlc3NvckRlY2xhcmF0aW9uKG5vZGUpKSB7XG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gYXNFeHBvcnRhYmxlRGVjbGFyYXRpb24obm9kZTogTm9kZSk6IEV4cG9ydGFibGVEZWNsYXJhdGlvbiB8IHVuZGVmaW5lZCB7XG4gIGlmIChcbiAgICBpc0Z1bmN0aW9uRGVjbGFyYXRpb24obm9kZSlcbiAgICB8fCBpc0NsYXNzRGVjbGFyYXRpb24obm9kZSlcbiAgICB8fCBpc0ludGVyZmFjZURlY2xhcmF0aW9uKG5vZGUpXG4gICAgfHwgaXNUeXBlQWxpYXNEZWNsYXJhdGlvbihub2RlKVxuICAgIHx8IGlzRW51bURlY2xhcmF0aW9uKG5vZGUpXG4gICAgfHwgaXNWYXJpYWJsZVN0YXRlbWVudChub2RlKVxuICApIHtcbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBidWlsZEZpbmRpbmcoXG4gIG5vZGU6IE5vZGUsXG4gIG5hbWVOb2RlOiBOb2RlLFxuICBjdXJyZW50RXhwb3N1cmU6IEN1cnJlbnRFeHBvc3VyZSxcbiAgc3VnZ2VzdGVkRXhwb3N1cmU6IFN1Z2dlc3RlZEV4cG9zdXJlLFxuICBmbGFnczogRmluZGluZ0ZsYWdzXG4pOiBPdmVyRXhwb3N1cmVGaW5kaW5nIHtcbiAgY29uc3Qgc291cmNlRmlsZSA9IG5vZGUuZ2V0U291cmNlRmlsZSgpO1xuICBjb25zdCB7IGNoYXJhY3RlciwgbGluZSB9ID0gc291cmNlRmlsZS5nZXRMaW5lQW5kQ2hhcmFjdGVyT2ZQb3NpdGlvbihuYW1lTm9kZS5nZXRTdGFydCgpKTtcbiAgcmV0dXJuIHtcbiAgICBjb2x1bW46IGNoYXJhY3RlciArIDEsXG4gICAgY3VycmVudEV4cG9zdXJlLFxuICAgIGZpbGVQYXRoOiB0b0Nhbm9uaWNhbChzb3VyY2VGaWxlLmZpbGVOYW1lKSxcbiAgICBoYXNOb1JlZmVyZW5jZXM6IGZsYWdzLmhhc05vUmVmZXJlbmNlcyxcbiAgICBpc0ZvcmNlZEJ5VGVzdE9ubHk6IGZsYWdzLmlzRm9yY2VkQnlUZXN0T25seSxcbiAgICBpc01lbWJlcjogY3VycmVudEV4cG9zdXJlICE9PSAnZXhwb3J0JyxcbiAgICBsaW5lOiBsaW5lICsgMSxcbiAgICBuYW1lOiBuYW1lTm9kZS5nZXRUZXh0KCksXG4gICAgc2tpcFJlYXNvbjogbnVsbCxcbiAgICBzdWdnZXN0ZWRFeHBvc3VyZSxcbiAgICB3YXNGaXhlZDogZmFsc2VcbiAgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRTdHJpbmdMaXRlcmFsSW5kZXgocHJvZ3JhbTogUHJvZ3JhbSk6IFJlYWRvbmx5TWFwPHN0cmluZywgcmVhZG9ubHkgU3RyaW5nTGl0ZXJhbE9jY3VycmVuY2VbXT4ge1xuICBjb25zdCBpbmRleCA9IG5ldyBNYXA8c3RyaW5nLCBTdHJpbmdMaXRlcmFsT2NjdXJyZW5jZVtdPigpO1xuICBmb3IgKGNvbnN0IHNvdXJjZUZpbGUgb2YgcHJvZ3JhbS5nZXRTb3VyY2VGaWxlcygpKSB7XG4gICAgaWYgKHNvdXJjZUZpbGUuaXNEZWNsYXJhdGlvbkZpbGUpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb2xsZWN0SW5Ob2RlKHNvdXJjZUZpbGUpO1xuICB9XG4gIHJldHVybiBpbmRleDtcblxuICBmdW5jdGlvbiBjb2xsZWN0SW5Ob2RlKG5vZGU6IE5vZGUpOiB2b2lkIHtcbiAgICBpZiAoaXNTdHJpbmdMaXRlcmFsTGlrZShub2RlKSkge1xuICAgICAgY29uc3Qgb2NjdXJyZW5jZXMgPSBpbmRleC5nZXQobm9kZS50ZXh0KSA/PyBbXTtcbiAgICAgIG9jY3VycmVuY2VzLnB1c2goeyBub2RlLCBzb3VyY2VGaWxlOiBub2RlLmdldFNvdXJjZUZpbGUoKSB9KTtcbiAgICAgIGluZGV4LnNldChub2RlLnRleHQsIG9jY3VycmVuY2VzKTtcbiAgICB9XG4gICAgbm9kZS5mb3JFYWNoQ2hpbGQoY29sbGVjdEluTm9kZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29sbGVjdFJlZmVyZW5jZXMocmVmZXJlbmNlZFN5bWJvbHM6IFJlZmVyZW5jZWRTeW1ib2xbXSB8IHVuZGVmaW5lZCk6IFJlZmVyZW5jZUxvY2F0aW9uW10ge1xuICBjb25zdCByZWZlcmVuY2VzOiBSZWZlcmVuY2VMb2NhdGlvbltdID0gW107XG4gIGZvciAoY29uc3QgcmVmZXJlbmNlZFN5bWJvbCBvZiByZWZlcmVuY2VkU3ltYm9scyA/PyBbXSkge1xuICAgIGZvciAoY29uc3QgcmVmZXJlbmNlIG9mIHJlZmVyZW5jZWRTeW1ib2wucmVmZXJlbmNlcykge1xuICAgICAgcmVmZXJlbmNlcy5wdXNoKHsgZmlsZU5hbWU6IHJlZmVyZW5jZS5maWxlTmFtZSwgc3RhcnQ6IHJlZmVyZW5jZS50ZXh0U3Bhbi5zdGFydCB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlZmVyZW5jZXM7XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3RTdHJpbmdMaXRlcmFsUmVmZXJlbmNlcyhuYW1lTm9kZTogTm9kZSwgZGVjbGFyaW5nQ2xhc3M6IENsYXNzTGlrZURlY2xhcmF0aW9uLCBjb250ZXh0OiBBbmFseXNpc0NvbnRleHQpOiBSZWZlcmVuY2VMb2NhdGlvbltdIHtcbiAgY29uc3Qgb2NjdXJyZW5jZXMgPSBjb250ZXh0LnN0cmluZ0xpdGVyYWxPY2N1cnJlbmNlc0J5VGV4dC5nZXQobmFtZU5vZGUuZ2V0VGV4dCgpKTtcbiAgaWYgKCFvY2N1cnJlbmNlcyB8fCBvY2N1cnJlbmNlcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBjb25zdCBrZXlTZXQgPSBnZXRDbGFzc0tleVNldChkZWNsYXJpbmdDbGFzcywgY29udGV4dC5jaGVja2VyKTtcbiAgY29uc3QgcmVmZXJlbmNlczogUmVmZXJlbmNlTG9jYXRpb25bXSA9IFtdO1xuICBmb3IgKGNvbnN0IG9jY3VycmVuY2Ugb2Ygb2NjdXJyZW5jZXMpIHtcbiAgICBpZiAoaXNLZXlSZWZlcmVuY2VUb0NsYXNzKG9jY3VycmVuY2Uubm9kZSwga2V5U2V0LCBjb250ZXh0LmNoZWNrZXIpKSB7XG4gICAgICByZWZlcmVuY2VzLnB1c2goeyBmaWxlTmFtZTogb2NjdXJyZW5jZS5zb3VyY2VGaWxlLmZpbGVOYW1lLCBzdGFydDogb2NjdXJyZW5jZS5ub2RlLmdldFN0YXJ0KCkgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZWZlcmVuY2VzO1xufVxuXG5mdW5jdGlvbiBjb21wdXRlRXhwb3J0UmVtb3ZhbEVkaXQoZGVjbGFyYXRpb246IEV4cG9ydGFibGVEZWNsYXJhdGlvbik6IE92ZXJFeHBvc3VyZVRleHRFZGl0IHtcbiAgY29uc3Qgc291cmNlRmlsZSA9IGRlY2xhcmF0aW9uLmdldFNvdXJjZUZpbGUoKTtcbiAgY29uc3QgbW9kaWZpZXJzID0gZ2V0TW9kaWZpZXJzKGRlY2xhcmF0aW9uKTtcbiAgYXNzZXJ0Tm9uTnVsbGFibGUobW9kaWZpZXJzLCAnTW9kaWZpZXJzIGV4cGVjdGVkIG9uIGFuIGV4cG9ydGVkIGRlY2xhcmF0aW9uLicpO1xuICBjb25zdCBleHBvcnRNb2RpZmllciA9IG1vZGlmaWVycy5maW5kKChtb2RpZmllcikgPT4gbW9kaWZpZXIua2luZCA9PT0gU3ludGF4S2luZC5FeHBvcnRLZXl3b3JkKTtcbiAgYXNzZXJ0Tm9uTnVsbGFibGUoZXhwb3J0TW9kaWZpZXIsICdFeHBvcnQgbW9kaWZpZXIgZXhwZWN0ZWQgb24gYW4gZXhwb3J0ZWQgZGVjbGFyYXRpb24uJyk7XG4gIGNvbnN0IHsgdGV4dCB9ID0gc291cmNlRmlsZTtcbiAgbGV0IGVuZCA9IGV4cG9ydE1vZGlmaWVyLmdldEVuZCgpO1xuICB3aGlsZSAoZW5kIDwgdGV4dC5sZW5ndGggJiYgV0hJVEVTUEFDRV9QQVRURVJOLnRlc3QodGV4dC5jaGFyQXQoZW5kKSkpIHtcbiAgICBlbmQrKztcbiAgfVxuICByZXR1cm4ge1xuICAgIGZpbGVOYW1lOiB0b0Nhbm9uaWNhbChzb3VyY2VGaWxlLmZpbGVOYW1lKSxcbiAgICBsZW5ndGg6IGVuZCAtIGV4cG9ydE1vZGlmaWVyLmdldFN0YXJ0KCksXG4gICAgbmV3VGV4dDogJycsXG4gICAgc3RhcnQ6IGV4cG9ydE1vZGlmaWVyLmdldFN0YXJ0KClcbiAgfTtcbn1cblxuZnVuY3Rpb24gY29tcHV0ZU1lbWJlckV4cG9zdXJlRWRpdChtZW1iZXI6IENsYXNzTWVtYmVyRGVjbGFyYXRpb24sIHN1Z2dlc3RlZEV4cG9zdXJlOiAncHJpdmF0ZScgfCAncHJvdGVjdGVkJyk6IG51bGwgfCBPdmVyRXhwb3N1cmVUZXh0RWRpdCB7XG4gIGlmICgoZ2V0RGVjb3JhdG9ycyhtZW1iZXIpID8/IFtdKS5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBzb3VyY2VGaWxlID0gbWVtYmVyLmdldFNvdXJjZUZpbGUoKTtcbiAgY29uc3QgZmlsZU5hbWUgPSB0b0Nhbm9uaWNhbChzb3VyY2VGaWxlLmZpbGVOYW1lKTtcbiAgY29uc3QgbW9kaWZpZXJzID0gZ2V0TW9kaWZpZXJzKG1lbWJlcikgPz8gW107XG4gIGNvbnN0IHZpc2liaWxpdHlNb2RpZmllciA9IG1vZGlmaWVycy5maW5kKChtb2RpZmllcikgPT4gVklTSUJJTElUWV9NT0RJRklFUl9LSU5EUy5oYXMobW9kaWZpZXIua2luZCkpO1xuICBpZiAodmlzaWJpbGl0eU1vZGlmaWVyKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZpbGVOYW1lLFxuICAgICAgbGVuZ3RoOiB2aXNpYmlsaXR5TW9kaWZpZXIuZ2V0RW5kKCkgLSB2aXNpYmlsaXR5TW9kaWZpZXIuZ2V0U3RhcnQoKSxcbiAgICAgIG5ld1RleHQ6IHN1Z2dlc3RlZEV4cG9zdXJlLFxuICAgICAgc3RhcnQ6IHZpc2liaWxpdHlNb2RpZmllci5nZXRTdGFydCgpXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IGZpcnN0TW9kaWZpZXIgPSBtb2RpZmllcnNbMF07XG4gIGNvbnN0IGluc2VydFN0YXJ0ID0gZmlyc3RNb2RpZmllciA/IGZpcnN0TW9kaWZpZXIuZ2V0U3RhcnQoKSA6IG1lbWJlci5nZXRTdGFydCgpO1xuICByZXR1cm4ge1xuICAgIGZpbGVOYW1lLFxuICAgIGxlbmd0aDogMCxcbiAgICBuZXdUZXh0OiBgJHtzdWdnZXN0ZWRFeHBvc3VyZX0gYCxcbiAgICBzdGFydDogaW5zZXJ0U3RhcnRcbiAgfTtcbn1cblxuZnVuY3Rpb24gY29tcHV0ZU5lZWRlZEV4cG9zdXJlKFxuICByZWZlcmVuY2VzOiByZWFkb25seSBSZWZlcmVuY2VMb2NhdGlvbltdLFxuICBkZWNsYXJpbmdDbGFzczogQ2xhc3NMaWtlRGVjbGFyYXRpb24sXG4gIGNvbnRleHQ6IEFuYWx5c2lzQ29udGV4dFxuKTogTWVtYmVyRXhwb3N1cmUge1xuICBpZiAocmVmZXJlbmNlcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gJ3ByaXZhdGUnO1xuICB9XG5cbiAgbGV0IG5lZWRlZDogTWVtYmVyRXhwb3N1cmUgPSAncHJpdmF0ZSc7XG4gIGZvciAoY29uc3QgcmVmZXJlbmNlIG9mIHJlZmVyZW5jZXMpIHtcbiAgICBjb25zdCByZWZlcmVuY2VDbGFzcyA9IGdldENsYXNzQXRQb3NpdGlvbihjb250ZXh0LnByb2dyYW0sIHJlZmVyZW5jZS5maWxlTmFtZSwgcmVmZXJlbmNlLnN0YXJ0KTtcbiAgICBpZiAocmVmZXJlbmNlQ2xhc3MgPT09IGRlY2xhcmluZ0NsYXNzKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKHJlZmVyZW5jZUNsYXNzICYmIGlzRGVyaXZlZEZyb20ocmVmZXJlbmNlQ2xhc3MsIGRlY2xhcmluZ0NsYXNzLCBjb250ZXh0LmNoZWNrZXIpKSB7XG4gICAgICBuZWVkZWQgPSAncHJvdGVjdGVkJztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICByZXR1cm4gJ3B1YmxpYyc7XG4gIH1cbiAgcmV0dXJuIG5lZWRlZDtcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVGaXhTdGF0dXMoZmluZGluZzogT3ZlckV4cG9zdXJlRmluZGluZyk6IHN0cmluZyB7XG4gIGlmIChmaW5kaW5nLndhc0ZpeGVkKSB7XG4gICAgcmV0dXJuICcgW2ZpeGVkXSc7XG4gIH1cbiAgaWYgKGZpbmRpbmcuc2tpcFJlYXNvbiAhPT0gbnVsbCkge1xuICAgIHJldHVybiBgIFtza2lwcGVkOiAke1NLSVBfUkVBU09OX0RFU0NSSVBUSU9OW2ZpbmRpbmcuc2tpcFJlYXNvbl19XWA7XG4gIH1cbiAgcmV0dXJuICcnO1xufVxuXG5mdW5jdGlvbiBkZXNjcmliZVJlYXNvbihmaW5kaW5nOiBPdmVyRXhwb3N1cmVGaW5kaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgYmFzZSA9IGByZWZlcmVuY2VkIG9ubHkgJHtTQ09QRV9ERVNDUklQVElPTltmaW5kaW5nLnN1Z2dlc3RlZEV4cG9zdXJlXX1gO1xuICBpZiAoZmluZGluZy5pc0ZvcmNlZEJ5VGVzdE9ubHkpIHtcbiAgICByZXR1cm4gYCR7YmFzZX0gKGV4cG9zZWQgb25seSBmb3IgdGVzdHMpYDtcbiAgfVxuICBpZiAoZmluZGluZy5oYXNOb1JlZmVyZW5jZXMpIHtcbiAgICByZXR1cm4gYCR7YmFzZX0gKG5vIHJlZmVyZW5jZXMgYXQgYWxsKWA7XG4gIH1cbiAgcmV0dXJuIGJhc2U7XG59XG5cbmZ1bmN0aW9uIGRldGVybWluZVNraXBSZWFzb24oZmluZGluZzogT3ZlckV4cG9zdXJlRmluZGluZywgZWRpdDogbnVsbCB8IE92ZXJFeHBvc3VyZVRleHRFZGl0LCBzaG91bGRGb3JjZTogYm9vbGVhbik6IG51bGwgfCBPdmVyRXhwb3N1cmVTa2lwUmVhc29uIHtcbiAgaWYgKGZpbmRpbmcuaXNGb3JjZWRCeVRlc3RPbmx5ICYmICFzaG91bGRGb3JjZSkge1xuICAgIHJldHVybiAndGVzdC1vbmx5JztcbiAgfVxuICBpZiAoIWVkaXQpIHtcbiAgICByZXR1cm4gZmluZGluZy5pc01lbWJlciA/ICdkZWNvcmF0ZWQnIDogJ3NoYXJlZC1leHBvcnQnO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBmaW5kTm9kZUF0UG9zaXRpb24obm9kZTogTm9kZSwgcG9zaXRpb246IG51bWJlcik6IE5vZGUgfCB1bmRlZmluZWQge1xuICBpZiAocG9zaXRpb24gPCBub2RlLmdldFN0YXJ0KCkgfHwgcG9zaXRpb24gPj0gbm9kZS5nZXRFbmQoKSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgbGV0IHJlc3VsdDogTm9kZSA9IG5vZGU7XG4gIG5vZGUuZm9yRWFjaENoaWxkKChjaGlsZCkgPT4ge1xuICAgIGNvbnN0IGZvdW5kID0gZmluZE5vZGVBdFBvc2l0aW9uKGNoaWxkLCBwb3NpdGlvbik7XG4gICAgaWYgKGZvdW5kKSB7XG4gICAgICByZXN1bHQgPSBmb3VuZDtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBmb3JtYXRGaW5kaW5nQmxvY2tzKGZpbmRpbmdzOiByZWFkb25seSBPdmVyRXhwb3N1cmVGaW5kaW5nW10sIGJhc2VGb2xkZXI6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZ1tdIHtcbiAgY29uc3QgYnlGaWxlID0gbmV3IE1hcDxzdHJpbmcsIE92ZXJFeHBvc3VyZUZpbmRpbmdbXT4oKTtcbiAgZm9yIChjb25zdCBmaW5kaW5nIG9mIGZpbmRpbmdzKSB7XG4gICAgY29uc3QgbGlzdCA9IGJ5RmlsZS5nZXQoZmluZGluZy5maWxlUGF0aCkgPz8gW107XG4gICAgbGlzdC5wdXNoKGZpbmRpbmcpO1xuICAgIGJ5RmlsZS5zZXQoZmluZGluZy5maWxlUGF0aCwgbGlzdCk7XG4gIH1cblxuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBbZmlsZVBhdGgsIGxpc3RdIG9mIGJ5RmlsZSkge1xuICAgIGNvbnN0IHNvcnRlZCA9IFsuLi5saXN0XS5zb3J0KChhLCBiKSA9PiBhLmxpbmUgLSBiLmxpbmUpO1xuICAgIGNvbnN0IGxvY2F0aW9uV2lkdGggPSBNYXRoLm1heCguLi5zb3J0ZWQubWFwKChmaW5kaW5nKSA9PiBgJHtTdHJpbmcoZmluZGluZy5saW5lKX06JHtTdHJpbmcoZmluZGluZy5jb2x1bW4pfWAubGVuZ3RoKSk7XG4gICAgbGluZXMucHVzaCh0b0Rpc3BsYXlQYXRoKGZpbGVQYXRoLCBiYXNlRm9sZGVyKSk7XG4gICAgZm9yIChjb25zdCBmaW5kaW5nIG9mIHNvcnRlZCkge1xuICAgICAgY29uc3QgbG9jYXRpb24gPSBgJHtTdHJpbmcoZmluZGluZy5saW5lKX06JHtTdHJpbmcoZmluZGluZy5jb2x1bW4pfWAucGFkRW5kKGxvY2F0aW9uV2lkdGgpO1xuICAgICAgY29uc3QgY2hhbmdlID0gYCR7ZmluZGluZy5jdXJyZW50RXhwb3N1cmV9ICR7ZmluZGluZy5uYW1lfSAtPiAke2ZpbmRpbmcuc3VnZ2VzdGVkRXhwb3N1cmV9YDtcbiAgICAgIGxpbmVzLnB1c2goYCAgJHtsb2NhdGlvbn0gICR7Y2hhbmdlfSAtLSAke2Rlc2NyaWJlUmVhc29uKGZpbmRpbmcpfSR7ZGVzY3JpYmVGaXhTdGF0dXMoZmluZGluZyl9YCk7XG4gICAgfVxuICAgIGxpbmVzLnB1c2goJycpO1xuICB9XG4gIHJldHVybiBsaW5lcztcbn1cblxuZnVuY3Rpb24gZm9ybWF0U3VtbWFyeShmaW5kaW5nczogcmVhZG9ubHkgT3ZlckV4cG9zdXJlRmluZGluZ1tdKTogc3RyaW5nIHtcbiAgY29uc3Qgc3VtbWFyeSA9IGAke1N0cmluZyhmaW5kaW5ncy5sZW5ndGgpfSBmaW5kaW5nKHMpLmA7XG4gIGNvbnN0IGZpeGVkQ291bnQgPSBmaW5kaW5ncy5maWx0ZXIoKGZpbmRpbmcpID0+IGZpbmRpbmcud2FzRml4ZWQpLmxlbmd0aDtcbiAgY29uc3Qgc2tpcHBlZENvdW50ID0gZmluZGluZ3MuZmlsdGVyKChmaW5kaW5nKSA9PiBmaW5kaW5nLnNraXBSZWFzb24gIT09IG51bGwpLmxlbmd0aDtcbiAgaWYgKGZpeGVkQ291bnQgPT09IDAgJiYgc2tpcHBlZENvdW50ID09PSAwKSB7XG4gICAgcmV0dXJuIHN1bW1hcnk7XG4gIH1cbiAgcmV0dXJuIGAke3N1bW1hcnl9ICR7U3RyaW5nKGZpeGVkQ291bnQpfSBmaXhlZCwgJHtTdHJpbmcoc2tpcHBlZENvdW50KX0gc2tpcHBlZC5gO1xufVxuXG5mdW5jdGlvbiBnZXRDbGFzc0F0UG9zaXRpb24ocHJvZ3JhbTogUHJvZ3JhbSwgZmlsZU5hbWU6IHN0cmluZywgcG9zaXRpb246IG51bWJlcik6IENsYXNzTGlrZURlY2xhcmF0aW9uIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc291cmNlRmlsZSA9IHByb2dyYW0uZ2V0U291cmNlRmlsZShmaWxlTmFtZSk7XG4gIGFzc2VydE5vbk51bGxhYmxlKHNvdXJjZUZpbGUsIGBTb3VyY2UgZmlsZSBub3QgZm91bmQgaW4gcHJvZ3JhbTogJHtmaWxlTmFtZX1gKTtcbiAgY29uc3Qgbm9kZSA9IGZpbmROb2RlQXRQb3NpdGlvbihzb3VyY2VGaWxlLCBwb3NpdGlvbik7XG4gIGFzc2VydE5vbk51bGxhYmxlKG5vZGUsIGBObyBub2RlIGZvdW5kIGF0IHBvc2l0aW9uICR7U3RyaW5nKHBvc2l0aW9uKX0gaW4gJHtmaWxlTmFtZX1gKTtcbiAgcmV0dXJuIGdldEVuY2xvc2luZ0NsYXNzKG5vZGUpO1xufVxuXG5mdW5jdGlvbiBnZXRDbGFzc0tleVNldChkZWNsYXJpbmdDbGFzczogQ2xhc3NMaWtlRGVjbGFyYXRpb24sIGNoZWNrZXI6IFR5cGVDaGVja2VyKTogUmVhZG9ubHlTZXQ8c3RyaW5nPiB7XG4gIGNvbnN0IGNsYXNzU3ltYm9sID0gZGVjbGFyaW5nQ2xhc3MubmFtZSA/IGNoZWNrZXIuZ2V0U3ltYm9sQXRMb2NhdGlvbihkZWNsYXJpbmdDbGFzcy5uYW1lKSA6IHVuZGVmaW5lZDtcbiAgY29uc3QgY2xhc3NUeXBlID0gY2xhc3NTeW1ib2wgPyBjaGVja2VyLmdldERlY2xhcmVkVHlwZU9mU3ltYm9sKGNsYXNzU3ltYm9sKSA6IGNoZWNrZXIuZ2V0VHlwZUF0TG9jYXRpb24oZGVjbGFyaW5nQ2xhc3MpO1xuICByZXR1cm4gbmV3IFNldChjbGFzc1R5cGUuZ2V0UHJvcGVydGllcygpLm1hcCgocHJvcGVydHkpID0+IHByb3BlcnR5Lm5hbWUpKTtcbn1cblxuZnVuY3Rpb24gZ2V0Q3VycmVudE1lbWJlckV4cG9zdXJlKG1vZGlmaWVyS2luZHM6IFJlYWRvbmx5U2V0PFN5bnRheEtpbmQ+KTogTWVtYmVyRXhwb3N1cmUge1xuICBpZiAobW9kaWZpZXJLaW5kcy5oYXMoU3ludGF4S2luZC5Qcml2YXRlS2V5d29yZCkpIHtcbiAgICByZXR1cm4gJ3ByaXZhdGUnO1xuICB9XG4gIGlmIChtb2RpZmllcktpbmRzLmhhcyhTeW50YXhLaW5kLlByb3RlY3RlZEtleXdvcmQpKSB7XG4gICAgcmV0dXJuICdwcm90ZWN0ZWQnO1xuICB9XG4gIHJldHVybiAncHVibGljJztcbn1cblxuZnVuY3Rpb24gZ2V0RW5jbG9zaW5nQ2xhc3Mobm9kZTogTm9kZSk6IENsYXNzTGlrZURlY2xhcmF0aW9uIHwgdW5kZWZpbmVkIHtcbiAgbGV0IGN1cnJlbnQ6IE5vZGUgPSBub2RlO1xuICB3aGlsZSAoIWlzU291cmNlRmlsZShjdXJyZW50KSkge1xuICAgIGlmIChpc0NsYXNzTGlrZShjdXJyZW50KSkge1xuICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfVxuICAgIGN1cnJlbnQgPSBjdXJyZW50LnBhcmVudDtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBnZXRFeHBvcnRlZE5hbWVOb2RlcyhkZWNsYXJhdGlvbjogRXhwb3J0YWJsZURlY2xhcmF0aW9uKTogTm9kZVtdIHtcbiAgaWYgKGlzVmFyaWFibGVTdGF0ZW1lbnQoZGVjbGFyYXRpb24pKSB7XG4gICAgcmV0dXJuIGRlY2xhcmF0aW9uLmRlY2xhcmF0aW9uTGlzdC5kZWNsYXJhdGlvbnMubWFwKCh2YXJpYWJsZURlY2xhcmF0aW9uKSA9PiB2YXJpYWJsZURlY2xhcmF0aW9uLm5hbWUpLmZpbHRlcihpc0lkZW50aWZpZXIpO1xuICB9XG4gIHJldHVybiBkZWNsYXJhdGlvbi5uYW1lID8gW2RlY2xhcmF0aW9uLm5hbWVdIDogW107XG59XG5cbmZ1bmN0aW9uIGdldE1vZGlmaWVyS2luZHMobm9kZTogTm9kZSk6IFJlYWRvbmx5U2V0PFN5bnRheEtpbmQ+IHtcbiAgY29uc3Qga2luZHMgPSBuZXcgU2V0PFN5bnRheEtpbmQ+KCk7XG4gIGlmIChjYW5IYXZlTW9kaWZpZXJzKG5vZGUpKSB7XG4gICAgZm9yIChjb25zdCBtb2RpZmllciBvZiBnZXRNb2RpZmllcnMobm9kZSkgPz8gW10pIHtcbiAgICAgIGtpbmRzLmFkZChtb2RpZmllci5raW5kKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGtpbmRzO1xufVxuXG5mdW5jdGlvbiBnZXRTdHJpbmdMaXRlcmFsQ29uc3RpdHVlbnRzKHR5cGU6IFR5cGUpOiBudWxsIHwgc3RyaW5nW10ge1xuICBpZiAodHlwZS5pc1N0cmluZ0xpdGVyYWwoKSkge1xuICAgIHJldHVybiBbdHlwZS52YWx1ZV07XG4gIH1cbiAgaWYgKHR5cGUuaXNVbmlvbigpKSB7XG4gICAgY29uc3QgbGl0ZXJhbHM6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChjb25zdCBjb25zdGl0dWVudCBvZiB0eXBlLnR5cGVzKSB7XG4gICAgICBpZiAoIWNvbnN0aXR1ZW50LmlzU3RyaW5nTGl0ZXJhbCgpKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgbGl0ZXJhbHMucHVzaChjb25zdGl0dWVudC52YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiBsaXRlcmFscztcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gaGFzVHNEb2NDb21tZW50KG5vZGU6IE5vZGUpOiBib29sZWFuIHtcbiAgY29uc3Qgc291cmNlRmlsZSA9IG5vZGUuZ2V0U291cmNlRmlsZSgpO1xuICBjb25zdCBmdWxsVGV4dCA9IHNvdXJjZUZpbGUuZ2V0RnVsbFRleHQoKTtcbiAgY29uc3QgY29tbWVudFJhbmdlcyA9IGdldExlYWRpbmdDb21tZW50UmFuZ2VzKGZ1bGxUZXh0LCBub2RlLmdldEZ1bGxTdGFydCgpKSA/PyBbXTtcbiAgcmV0dXJuIGNvbW1lbnRSYW5nZXMuc29tZSgocmFuZ2UpID0+XG4gICAgcmFuZ2Uua2luZCA9PT0gU3ludGF4S2luZC5NdWx0aUxpbmVDb21tZW50VHJpdmlhXG4gICAgJiYgZnVsbFRleHQuY2hhckF0KHJhbmdlLnBvcyArIEpTRE9DX1NFQ09ORF9BU1RFUklTS19PRkZTRVQpID09PSAnKidcbiAgICAmJiBmdWxsVGV4dC5jaGFyQXQocmFuZ2UucG9zICsgSlNET0NfRk9VUlRIX0NIQVJBQ1RFUl9PRkZTRVQpICE9PSAnLydcbiAgKTtcbn1cblxuZnVuY3Rpb24gaXNEZWNsYXJhdGlvbkl0c2VsZihyZWZlcmVuY2U6IFJlZmVyZW5jZUxvY2F0aW9uLCBuYW1lTm9kZTogTm9kZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gdG9DYW5vbmljYWwocmVmZXJlbmNlLmZpbGVOYW1lKSA9PT0gdG9DYW5vbmljYWwobmFtZU5vZGUuZ2V0U291cmNlRmlsZSgpLmZpbGVOYW1lKSAmJiByZWZlcmVuY2Uuc3RhcnQgPT09IG5hbWVOb2RlLmdldFN0YXJ0KCk7XG59XG5cbmZ1bmN0aW9uIGlzRGVyaXZlZEZyb20oZGVyaXZlZDogQ2xhc3NMaWtlRGVjbGFyYXRpb24sIGJhc2U6IENsYXNzTGlrZURlY2xhcmF0aW9uLCBjaGVja2VyOiBUeXBlQ2hlY2tlcik6IGJvb2xlYW4ge1xuICBjb25zdCBiYXNlU3ltYm9sID0gYmFzZS5uYW1lID8gY2hlY2tlci5nZXRTeW1ib2xBdExvY2F0aW9uKGJhc2UubmFtZSkgOiB1bmRlZmluZWQ7XG4gIGlmICghYmFzZVN5bWJvbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGZvciAoY29uc3QgY2xhdXNlIG9mIGRlcml2ZWQuaGVyaXRhZ2VDbGF1c2VzID8/IFtdKSB7XG4gICAgaWYgKGNsYXVzZS50b2tlbiAhPT0gU3ludGF4S2luZC5FeHRlbmRzS2V5d29yZCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGZvciAoY29uc3QgdHlwZUV4cHJlc3Npb24gb2YgY2xhdXNlLnR5cGVzKSB7XG4gICAgICBjb25zdCBzeW1ib2wgPSBjaGVja2VyLmdldFR5cGVBdExvY2F0aW9uKHR5cGVFeHByZXNzaW9uLmV4cHJlc3Npb24pLmdldFN5bWJvbCgpO1xuICAgICAgaWYgKHN5bWJvbCA9PT0gYmFzZVN5bWJvbCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgZGVjbGFyYXRpb24gb2Ygc3ltYm9sPy5kZWNsYXJhdGlvbnMgPz8gW10pIHtcbiAgICAgICAgaWYgKGlzQ2xhc3NMaWtlKGRlY2xhcmF0aW9uKSAmJiBpc0Rlcml2ZWRGcm9tKGRlY2xhcmF0aW9uLCBiYXNlLCBjaGVja2VyKSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaXNLZXlSZWZlcmVuY2VUb0NsYXNzKG5vZGU6IFN0cmluZ0xpdGVyYWxMaWtlLCBrZXlTZXQ6IFJlYWRvbmx5U2V0PHN0cmluZz4sIGNoZWNrZXI6IFR5cGVDaGVja2VyKTogYm9vbGVhbiB7XG4gIGNvbnN0IGNvbnRleHR1YWxUeXBlID0gY2hlY2tlci5nZXRDb250ZXh0dWFsVHlwZShub2RlKTtcbiAgaWYgKCFjb250ZXh0dWFsVHlwZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBsaXRlcmFscyA9IGdldFN0cmluZ0xpdGVyYWxDb25zdGl0dWVudHMoY29udGV4dHVhbFR5cGUpO1xuICBpZiAoIWxpdGVyYWxzKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiBsaXRlcmFscy5ldmVyeSgobGl0ZXJhbCkgPT4ga2V5U2V0LmhhcyhsaXRlcmFsKSk7XG59XG5cbmZ1bmN0aW9uIGlzT3duU291cmNlRmlsZShmaWxlUGF0aDogc3RyaW5nLCBzcmNGb2xkZXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZmlsZVBhdGguc3RhcnRzV2l0aChgJHtzcmNGb2xkZXJ9L2ApICYmIGZpbGVQYXRoLmVuZHNXaXRoKCcudHMnKSAmJiAhZmlsZVBhdGguZW5kc1dpdGgoJy5kLnRzJyk7XG59XG5cbmZ1bmN0aW9uIGlzVGVzdEZpbGUoZmlsZVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZmlsZVBhdGguaW5jbHVkZXMoJy50ZXN0LicpIHx8IGZpbGVQYXRoLmluY2x1ZGVzKCcuaW50ZWdyYXRpb24uJyk7XG59XG5cbmZ1bmN0aW9uIHJhbmtFeHBvc3VyZShleHBvc3VyZTogTWVtYmVyRXhwb3N1cmUpOiBudW1iZXIge1xuICByZXR1cm4gTUVNQkVSX0VYUE9TVVJFX09SREVSLmluZGV4T2YoZXhwb3N1cmUpO1xufVxuXG5mdW5jdGlvbiByZWNvcmQoY29udGV4dDogQW5hbHlzaXNDb250ZXh0LCBmaW5kaW5nOiBPdmVyRXhwb3N1cmVGaW5kaW5nLCBlZGl0OiBudWxsIHwgT3ZlckV4cG9zdXJlVGV4dEVkaXQpOiB2b2lkIHtcbiAgY29udGV4dC5maW5kaW5ncy5wdXNoKGZpbmRpbmcpO1xuICBjb250ZXh0LmVkaXRzLnB1c2goZWRpdCk7XG59XG5cbmZ1bmN0aW9uIHJ1bk92ZXJFeHBvc3VyZUFuYWx5c2lzKHBhcmFtczogQW5hbHl6ZU92ZXJFeHBvc3VyZVBhcmFtcyk6IEFuYWx5c2lzUmVzdWx0IHtcbiAgY29uc3QgeyBsYW5ndWFnZVNlcnZpY2UsIG9uUHJvZ3Jlc3MsIHNyY0ZvbGRlciB9ID0gcGFyYW1zO1xuICBjb25zdCBwcm9ncmFtID0gbGFuZ3VhZ2VTZXJ2aWNlLmdldFByb2dyYW0oKTtcbiAgaWYgKCFwcm9ncmFtKSB7XG4gICAgcmV0dXJuIHsgZWRpdHM6IFtdLCBmaW5kaW5nczogW10gfTtcbiAgfVxuXG4gIGNvbnN0IGNvbnRleHQ6IEFuYWx5c2lzQ29udGV4dCA9IHtcbiAgICBjaGVja2VyOiBwcm9ncmFtLmdldFR5cGVDaGVja2VyKCksXG4gICAgZWRpdHM6IFtdLFxuICAgIGZpbmRpbmdzOiBbXSxcbiAgICBsYW5ndWFnZVNlcnZpY2UsXG4gICAgcHJvZ3JhbSxcbiAgICBzaG91bGRGb3JjZTogcGFyYW1zLnNob3VsZEZvcmNlID8/IGZhbHNlLFxuICAgIHN0cmluZ0xpdGVyYWxPY2N1cnJlbmNlc0J5VGV4dDogYnVpbGRTdHJpbmdMaXRlcmFsSW5kZXgocHJvZ3JhbSlcbiAgfTtcblxuICBjb25zdCBzb3VyY2VGaWxlc1RvQW5hbHl6ZSA9IHByb2dyYW0uZ2V0U291cmNlRmlsZXMoKS5maWx0ZXIoKHNvdXJjZUZpbGUpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHRvQ2Fub25pY2FsKHNvdXJjZUZpbGUuZmlsZU5hbWUpO1xuICAgIHJldHVybiBpc093blNvdXJjZUZpbGUoZmlsZVBhdGgsIHNyY0ZvbGRlcikgJiYgIWlzVGVzdEZpbGUoZmlsZVBhdGgpO1xuICB9KTtcblxuICBmb3IgKGNvbnN0IFthbmFseXplZEZpbGVDb3VudCwgc291cmNlRmlsZV0gb2Ygc291cmNlRmlsZXNUb0FuYWx5emUuZW50cmllcygpKSB7XG4gICAgb25Qcm9ncmVzcz8uKHtcbiAgICAgIGFuYWx5emVkRmlsZUNvdW50LFxuICAgICAgY3VycmVudEZpbGVQYXRoOiB0b0Nhbm9uaWNhbChzb3VyY2VGaWxlLmZpbGVOYW1lKSxcbiAgICAgIHRvdGFsRmlsZUNvdW50OiBzb3VyY2VGaWxlc1RvQW5hbHl6ZS5sZW5ndGhcbiAgICB9KTtcbiAgICB2aXNpdChzb3VyY2VGaWxlKTtcbiAgfVxuICByZXR1cm4geyBlZGl0czogY29udGV4dC5lZGl0cywgZmluZGluZ3M6IGNvbnRleHQuZmluZGluZ3MgfTtcblxuICBmdW5jdGlvbiB2aXNpdChub2RlOiBOb2RlKTogdm9pZCB7XG4gICAgYW5hbHl6ZU1lbWJlcihub2RlLCBjb250ZXh0KTtcbiAgICBhbmFseXplRXhwb3J0KG5vZGUsIGNvbnRleHQpO1xuICAgIG5vZGUuZm9yRWFjaENoaWxkKHZpc2l0KTtcbiAgfVxufVxuXG5mdW5jdGlvbiB0b0Rpc3BsYXlQYXRoKGZpbGVQYXRoOiBzdHJpbmcsIGJhc2VGb2xkZXI6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIGlmIChiYXNlRm9sZGVyICE9PSB1bmRlZmluZWQgJiYgZmlsZVBhdGguc3RhcnRzV2l0aChgJHtiYXNlRm9sZGVyfS9gKSkge1xuICAgIHJldHVybiBmaWxlUGF0aC5zbGljZShiYXNlRm9sZGVyLmxlbmd0aCArIDEpO1xuICB9XG4gIHJldHVybiBmaWxlUGF0aDtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBMEVBO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFFUCxTQUFTLHlCQUF5QjtBQUNsQztBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQThPQSxNQUFNLHNCQUEyQyxvQkFBSSxJQUFZO0FBQUEsRUFDdEU7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFDRixDQUFDO0FBNERELE1BQU0sK0JBQStCO0FBQ3JDLE1BQU0sZ0NBQWdDO0FBQ3RDLE1BQU0sd0JBQW1ELENBQUMsV0FBVyxhQUFhLFFBQVE7QUFDMUYsTUFBTSxvQkFBdUQ7QUFBQSxFQUMzRCxjQUFjO0FBQUEsRUFDZCxXQUFXO0FBQUEsRUFDWCxhQUFhO0FBQ2Y7QUFDQSxNQUFNLDBCQUFrRTtBQUFBLEVBQ3RFLGFB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
|