@seniorsistemas/angular-components 19.5.5 → 19.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/accordion/README.md +95 -59
- package/calendar-mask/lib/calendar-mask/calendar-mask.directive.d.ts +4 -0
- package/datepicker/README.md +175 -0
- package/datepicker/index.d.ts +5 -0
- package/datepicker/lib/datepicker/date.utils.d.ts +21 -0
- package/datepicker/lib/datepicker/datepicker.component.d.ts +254 -0
- package/datepicker/lib/datepicker/models/index.d.ts +16 -0
- package/datepicker/public-api.d.ts +2 -0
- package/dynamic-form/dynamic-form/components/lookup/lookup.component.d.ts +3 -1
- package/dynamic-form/dynamic-form/components/lookup/models/lookup-alert-config.d.ts +5 -0
- package/dynamic-form/dynamic-form/form-field/configurations/fields/calendar-field.d.ts +119 -24
- package/dynamic-form/dynamic-form/form-field/configurations/fields/lookup-field.d.ts +6 -0
- package/dynamic-form/dynamic-form/form-field/fields/calendar/calendar-field.component.d.ts +6 -23
- package/dynamic-form/public-api.d.ts +1 -0
- package/editor/README.md +229 -0
- package/editor/index.d.ts +5 -0
- package/editor/lib/editor/editor.component.d.ts +127 -0
- package/editor/lib/editor/link-dialog/link-dialog.component.d.ts +18 -0
- package/editor/lib/editor/models/index.d.ts +12 -0
- package/editor/lib/editor/toolbar-button/editor-toolbar-button.component.d.ts +10 -0
- package/editor/public-api.d.ts +2 -0
- package/esm2022/calendar-mask/lib/calendar-mask/calendar-mask.directive.mjs +5 -1
- package/esm2022/datepicker/lib/datepicker/date.utils.mjs +182 -0
- package/esm2022/datepicker/lib/datepicker/datepicker.component.mjs +1062 -0
- package/esm2022/datepicker/lib/datepicker/models/index.mjs +2 -0
- package/esm2022/datepicker/public-api.mjs +2 -0
- package/esm2022/datepicker/seniorsistemas-angular-components-datepicker.mjs +5 -0
- package/esm2022/dynamic-form/dynamic-form/components/lookup/lookup.component.mjs +11 -5
- package/esm2022/dynamic-form/dynamic-form/components/lookup/models/lookup-alert-config.mjs +2 -0
- package/esm2022/dynamic-form/dynamic-form/form-field/configurations/fields/calendar-field.mjs +1 -1
- package/esm2022/dynamic-form/dynamic-form/form-field/configurations/fields/lookup-field.mjs +1 -1
- package/esm2022/dynamic-form/dynamic-form/form-field/fields/autocomplete/autocomplete-field.component.mjs +2 -2
- package/esm2022/dynamic-form/dynamic-form/form-field/fields/calendar/calendar-field.component.mjs +23 -116
- package/esm2022/dynamic-form/dynamic-form/form-field/fields/lookup/lookup-field.component.mjs +3 -3
- package/esm2022/dynamic-form/public-api.mjs +1 -1
- package/esm2022/editor/lib/editor/editor.component.mjs +375 -0
- package/esm2022/editor/lib/editor/link-dialog/link-dialog.component.mjs +48 -0
- package/esm2022/editor/lib/editor/models/index.mjs +3 -0
- package/esm2022/editor/lib/editor/toolbar-button/editor-toolbar-button.component.mjs +17 -0
- package/esm2022/editor/public-api.mjs +3 -0
- package/esm2022/editor/seniorsistemas-angular-components-editor.mjs +5 -0
- package/esm2022/inline-edit/lib/inline-edit/components/fields/inline-edit-calendar/inline-edit-calendar.component.mjs +22 -12
- package/esm2022/inline-edit/lib/inline-edit/inline-edit.module.mjs +5 -5
- package/esm2022/lib/locale/fallback.mjs +82 -3
- package/esm2022/optional-fields/editor/editor-field/editor-field.component.mjs +5 -6
- package/esm2022/optional-fields/editor/editor-field.mjs +1 -1
- package/esm2022/panel/lib/panel/panel.component.mjs +7 -3
- package/esm2022/select/lib/select/select.component.mjs +4 -8
- package/esm2022/shared/lib/accessibility/datepicker-no-period-tab.directive.mjs +5 -1
- package/fesm2022/seniorsistemas-angular-components-calendar-mask.mjs +4 -0
- package/fesm2022/seniorsistemas-angular-components-calendar-mask.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-datepicker.mjs +1250 -0
- package/fesm2022/seniorsistemas-angular-components-datepicker.mjs.map +1 -0
- package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs +49 -135
- package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-editor.mjs +437 -0
- package/fesm2022/seniorsistemas-angular-components-editor.mjs.map +1 -0
- package/fesm2022/seniorsistemas-angular-components-inline-edit.mjs +24 -15
- package/fesm2022/seniorsistemas-angular-components-inline-edit.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-optional-fields-editor.mjs +4 -5
- package/fesm2022/seniorsistemas-angular-components-optional-fields-editor.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-panel.mjs +6 -2
- package/fesm2022/seniorsistemas-angular-components-panel.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-select.mjs +3 -7
- package/fesm2022/seniorsistemas-angular-components-select.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-shared.mjs +4 -0
- package/fesm2022/seniorsistemas-angular-components-shared.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components.mjs +81 -2
- package/fesm2022/seniorsistemas-angular-components.mjs.map +1 -1
- package/inline-edit/lib/inline-edit/components/fields/inline-edit-calendar/inline-edit-calendar.component.d.ts +6 -4
- package/inline-edit/lib/inline-edit/inline-edit.module.d.ts +2 -2
- package/loading-state/README.md +57 -17
- package/optional-fields/editor/editor-field.d.ts +9 -6
- package/package.json +74 -8
- package/panel/README.md +12 -1
- package/panel/lib/panel/panel.component.d.ts +3 -1
- package/schematics/collection.json +4 -0
- package/schematics/migrations/migrate-p-datepicker/index.d.ts +2 -0
- package/schematics/migrations/migrate-p-datepicker/index.js +141 -0
- package/schematics/migrations/migrate-p-datepicker/index.js.map +1 -0
- package/schematics/migrations/migrate-p-datepicker/index.test.d.ts +1 -0
- package/schematics/migrations/migrate-p-datepicker/index.test.js +392 -0
- package/schematics/migrations/migrate-p-datepicker/index.test.js.map +1 -0
- package/schematics/migrations.json +10 -0
- package/schematics/utils/ast-utils.d.ts +28 -0
- package/schematics/utils/ast-utils.js +116 -0
- package/schematics/utils/ast-utils.js.map +1 -0
- package/schematics/utils/ast-utils.test.d.ts +1 -0
- package/schematics/utils/ast-utils.test.js +138 -0
- package/schematics/utils/ast-utils.test.js.map +1 -0
- package/schematics/utils/workspace-utils.d.ts +6 -0
- package/schematics/utils/workspace-utils.js +37 -0
- package/schematics/utils/workspace-utils.js.map +1 -0
- package/schematics/utils/workspace-utils.test.d.ts +1 -0
- package/schematics/utils/workspace-utils.test.js +152 -0
- package/schematics/utils/workspace-utils.test.js.map +1 -0
- package/shared/lib/accessibility/datepicker-no-period-tab.directive.d.ts +4 -0
- package/stats-card/README.md +80 -45
|
@@ -138,13 +138,9 @@ export class SelectComponent {
|
|
|
138
138
|
if (this.multiple()) {
|
|
139
139
|
const selected = this.values();
|
|
140
140
|
if (selected.length > 1) {
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
e usar .instant(`platform.angular_components.total_records_selected`, { count: selected.length })
|
|
145
|
-
*/
|
|
146
|
-
const translated = this._translateService.instant(`platform.angular_components.total_records_selected`);
|
|
147
|
-
return translated.replace('{0}', String(selected.length));
|
|
141
|
+
return this._translateService.instant(`platform.angular_components.total_records_selected`, {
|
|
142
|
+
count: selected.length,
|
|
143
|
+
});
|
|
148
144
|
}
|
|
149
145
|
else if (selected.length === 1) {
|
|
150
146
|
return this._getLabelFromOption(selected[0].data);
|
|
@@ -895,4 +891,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
895
891
|
]),
|
|
896
892
|
], template: "<div\n #containerDiv\n cdkOverlayOrigin\n #trigger=\"cdkOverlayOrigin\"\n class=\"select-container group flex h-[35px] w-full overflow-hidden rounded-[3px] border outline-1 outline-primary focus:outline\"\n [class.pointer-events-none]=\"disabled()\"\n [class.border-grayscale-20]=\"disabled()\"\n [class.bg-grayscale-5]=\"disabled()\"\n [class.pointer-events-auto]=\"!disabled()\"\n [class.border-grayscale-30]=\"!disabled()\"\n [class.bg-grayscale-0]=\"!disabled()\"\n [attr.aria-disabled]=\"disabled()\"\n [attr.aria-expanded]=\"showOptions()\"\n [attr.aria-haspopup]=\"'listbox'\"\n [attr.aria-controls]=\"componentId + '-listbox'\"\n [attr.aria-owns]=\"showOptions() ? componentId + '-listbox' : null\"\n [attr.aria-activedescendant]=\"showOptions() ? focusedOptionId() : null\"\n role=\"combobox\"\n [id]=\"componentId + '-combobox'\"\n (click)=\"onContainerDivClick()\"\n (keydown)=\"onKeyDown($event)\"\n tabindex=\"0\"\n [attr.aria-label]=\"ariaLabel() || null\"\n [attr.aria-labelledby]=\"resolvedAriaLabelledBy() || null\"\n>\n <span\n class=\"flex flex-grow select-none px-3 py-[7px]\"\n [class.text-grayscale-90]=\"!disabled() && !isClean()\"\n [class.text-grayscale-60]=\"!disabled() && isClean()\"\n [class.text-grayscale-30]=\"disabled()\"\n >\n {{ print() || placeholder() }}\n </span>\n\n @if (!disabled() && showClear() && !isClean()) {\n <button\n class=\"mx-3\"\n (click)=\"clear($event)\"\n [attr.aria-label]=\"'platform.angular_components.aria_clear_selection' | translate\"\n >\n <i\n class=\"fas fa-times flex items-center\"\n aria-hidden=\"true\"\n ></i>\n </button>\n }\n\n <div\n class=\"dropdown-container flex items-center border-l px-3 group-hover:bg-grayscale-10 group-focus:border-primary\"\n [class.border-grayscale-20]=\"disabled()\"\n [class.border-grayscale-30]=\"!disabled()\"\n >\n <i\n class=\"fas\"\n aria-hidden=\"true\"\n [class.text-grayscale-30]=\"disabled()\"\n [class.text-grayscale-90]=\"!disabled()\"\n [class.fa-caret-down]=\"!showOptions()\"\n [class.fa-caret-up]=\"showOptions()\"\n ></i>\n </div>\n</div>\n\n<ng-template\n #dropdownTemplate\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"showOptions()\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n (backdropClick)=\"showOptions.set(false)\"\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n (detach)=\"showOptions.set(false)\"\n>\n <div\n [id]=\"componentId + '-listbox'\"\n class=\"dropdown-body-class z-[1000] rounded-[3px] bg-grayscale-0 py-1 shadow-md\"\n (click)=\"$event.stopPropagation()\"\n [style.width.px]=\"containerDiv.offsetWidth\"\n [attr.aria-multiselectable]=\"multiple() ? true : null\"\n [@visibilityChanged]\n role=\"listbox\"\n >\n @if (filter()) {\n <div class=\"flex w-full items-center gap-3 px-3 py-1.5\">\n @if (multiple()) {\n <s-checkbox\n #selectAllCheckbox\n [checked]=\"allSelected()\"\n [indeterminate]=\"selectAllIsIndeterminate()\"\n (checkedChange)=\"toggleSelectAll()\"\n ></s-checkbox>\n }\n\n <div class=\"relative flex h-[35px] grow\">\n <form\n class=\"flex w-full grow\"\n [formGroup]=\"filterForm\"\n >\n <input\n #filterInput\n class=\"w-full grow rounded-[3px] border border-grayscale-30 pl-2.5 pr-7 outline-1 outline-primary\"\n type=\"text\"\n formControlName=\"filter\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"onFilterKeyDown($event)\"\n [attr.aria-label]=\"'platform.angular_components.filter_options' | translate\"\n [attr.aria-controls]=\"componentId + '-listbox'\"\n [attr.aria-activedescendant]=\"focusedOptionId()\"\n autocomplete=\"off\"\n />\n </form>\n <i\n class=\"fas fa-search absolute right-2.5 top-2.5 text-grayscale-90\"\n aria-hidden=\"true\"\n ></i>\n </div>\n <button\n (click)=\"clearFilter()\"\n [attr.aria-label]=\"'platform.angular_components.clear_filter' | translate\"\n >\n <i\n class=\"fas fa-times flex items-center\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n }\n\n <!-- Virtual scroll -->\n @if (virtualScroll() && filteredOptions().length > 10) {\n <cdk-virtual-scroll-viewport\n [itemSize]=\"virtualScrollItemSize()\"\n class=\"h-52 overflow-auto\"\n >\n <ng-container *cdkVirtualFor=\"let option of filteredOptions(); trackBy: trackById\">\n <s-select-option\n [id]=\"option.id\"\n [label]=\"getOptionLabel(option.data)\"\n [multiple]=\"multiple()\"\n [checkmark]=\"checkmark()\"\n [isSelected]=\"isOptionSelected(option)\"\n (selected)=\"selectItem(option)\"\n [isGrouper]=\"option.grouper ?? false\"\n [isFocused]=\"option.data === focusedItem()\"\n ></s-select-option>\n </ng-container>\n </cdk-virtual-scroll-viewport>\n }\n\n <!-- Normal list -->\n @if (!virtualScroll() || filteredOptions().length <= 10) {\n <ul class=\"max-h-52 overflow-auto\">\n @for (option of filteredOptions(); track option.id) {\n <s-select-option\n [id]=\"option.id\"\n [label]=\"getOptionLabel(option.data)\"\n [multiple]=\"multiple()\"\n [checkmark]=\"checkmark()\"\n [isSelected]=\"isOptionSelected(option)\"\n (selected)=\"selectItem(option)\"\n [isGrouper]=\"option.grouper ?? false\"\n [isFocused]=\"option.data === focusedItem()\"\n ></s-select-option>\n }\n </ul>\n }\n\n @if (filteredOptions().length === 0) {\n <span class=\"m-3 text-grayscale-60\">\n {{ emptyMessage() ?? 'platform.angular_components.no_records_found' | translate }}\n </span>\n }\n </div>\n</ng-template>\n\n", styles: [":host.ng-dirty.ng-invalid{.dropdown-container,.select-container{border-color:#c13018;outline:none}}\n"] }]
|
|
897
893
|
}], ctorParameters: () => [] });
|
|
898
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9zZWxlY3Qvc3JjL2xpYi9zZWxlY3Qvc2VsZWN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9zZWxlY3Qvc3JjL2xpYi9zZWxlY3Qvc2VsZWN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFFSCxTQUFTLEVBQ1QsUUFBUSxFQUNSLFVBQVUsRUFDVixVQUFVLEVBQ1YsTUFBTSxFQUNOLEtBQUssRUFDTCxLQUFLLEVBR0wsU0FBUyxFQUNULE1BQU0sRUFDTixTQUFTLEVBQ1QsTUFBTSxHQUNULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBd0IsV0FBVyxFQUFFLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXRILE9BQU8sRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN4RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUNoRixPQUFPLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFcEUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sb0RBQW9ELENBQUM7QUFDM0YsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7Ozs7O0FBT2pGOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFnREgsTUFBTSxPQUFPLGVBQWU7SUFDaEIsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFFMUIsb0ZBQW9GO0lBQzdFLFdBQVcsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7SUFFL0Isc0ZBQXNGO0lBQy9FLFFBQVEsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFL0IsZ0ZBQWdGO0lBQ3pFLE9BQU8sR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFPLENBQUM7SUFFdkMsMEVBQTBFO0lBQ25FLFdBQVcsR0FBRyxLQUFLLEVBQVcsQ0FBQztJQUV0QywwRkFBMEY7SUFDbkYsV0FBVyxHQUFHLEtBQUssRUFBVyxDQUFDO0lBRXRDLDhFQUE4RTtJQUN2RSxTQUFTLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRWhDLGdHQUFnRztJQUN6RixNQUFNLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRTdCLDRGQUE0RjtJQUNyRixTQUFTLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRWhDLGdIQUFnSDtJQUN6RyxRQUFRLEdBQUcsS0FBSyxFQUF5QixDQUFDO0lBRWpELCtJQUErSTtJQUN4SSxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRTVCLHlIQUF5SDtJQUNsSCxhQUFhLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRXBDLHlIQUF5SDtJQUNsSCxxQkFBcUIsR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7SUFFekMsdUdBQXVHO0lBQ2hHLFlBQVksR0FBRyxLQUFLLENBQWdCLElBQUksQ0FBQyxDQUFDO0lBRWpELG9HQUFvRztJQUM3RixRQUFRLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRS9CLG1HQUFtRztJQUM1RixXQUFXLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRWxDLHNFQUFzRTtJQUMvRCxTQUFTLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBRTdCLG1HQUFtRztJQUM1RixjQUFjLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBRWxDOzs7O09BSUc7SUFDSSxzQkFBc0IsR0FBRyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7SUFFcEMsS0FBSyxHQUFHLE1BQU0sQ0FBbUMsSUFBSSxDQUFDLENBQUM7SUFDdkQsTUFBTSxHQUFHLE1BQU0sQ0FBOEIsRUFBRSxDQUFDLENBQUM7SUFDakQsV0FBVyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN6QixZQUFZLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDekIsYUFBYSxHQUFtQixJQUFJLENBQUM7SUFDdEMsTUFBTSxHQUFHLEtBQUssQ0FBQztJQUVmLFdBQVcsR0FBRyxTQUFTLGVBQWUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDO0lBRXpEOzs7OztPQUtHO0lBQ0ksV0FBVyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7UUFDL0IsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDM0UsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRTdELE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDN0YsT0FBTyxHQUFHLENBQUM7SUFDZixDQUFDLENBQUMsQ0FBQztJQUVIOzs7T0FHRztJQUNJLFdBQVcsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFO1FBQy9CLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNsQyxJQUFJLEtBQUssR0FBRyxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDM0IsT0FBTyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBSSxJQUFJLElBQUksQ0FBQztJQUN2RCxDQUFDLENBQUMsQ0FBQztJQUVIOzs7T0FHRztJQUNJLGVBQWUsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFO1FBQ25DLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNsQyxJQUFJLEtBQUssR0FBRyxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDM0IsT0FBTyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxJQUFJLElBQUksQ0FBQztJQUNyRCxDQUFDLENBQUMsQ0FBQztJQUVIOzs7Ozs7T0FNRztJQUNJLGVBQWUsR0FBRyxRQUFRLENBQThCLEdBQUcsRUFBRTtRQUNoRSxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDNUIsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqRCxPQUFPLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDO0lBQzdFLENBQUMsQ0FBQyxDQUFDO0lBRUg7Ozs7Ozs7T0FPRztJQUNJLEtBQUssR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFO1FBQ3pCLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUM7WUFDbEIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQy9CLElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDdEI7Ozs7a0JBSUU7Z0JBQ0YsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxvREFBb0QsQ0FBQyxDQUFDO2dCQUN4RyxPQUFPLFVBQVUsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUM5RCxDQUFDO2lCQUFNLElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDL0IsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3RELENBQUM7UUFDTCxDQUFDO2FBQU0sQ0FBQztZQUNKLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUM5QixPQUFPLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ25FLENBQUM7UUFFRCxPQUFPLEVBQUUsQ0FBQztJQUNkLENBQUMsQ0FBQyxDQUFDO0lBRUg7Ozs7O09BS0c7SUFDSSxPQUFPLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRTtRQUMzQixPQUFPLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNuRSxDQUFDLENBQUMsQ0FBQztJQUVIOzs7OztPQUtHO0lBQ0ksd0JBQXdCLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRTtRQUM1QyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDdEQsT0FBTyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN6RCxDQUFDLENBQUMsQ0FBQztRQUNILE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzNFLE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUN2RixNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUVuRSxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ3pCLENBQUMsQ0FBQyxDQUFDO0lBRUg7Ozs7OztPQU1HO0lBQ0ksZUFBZSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7UUFDbkMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQzFDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUV2RCxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDNUIsT0FBTyxVQUFVLENBQUM7UUFDdEIsQ0FBQztRQUVELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNqQyxPQUFPLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUNoQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDakIsT0FBTyxLQUFLLENBQUM7WUFDakIsQ0FBQztZQUVELElBQUksS0FBSyxHQUFHLEVBQUUsQ0FBQztZQUVmLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUV2QyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ1osS0FBSyxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNqRixDQUFDO2lCQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO2dCQUNqQyxLQUFLLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDMUUsQ0FBQztpQkFBTSxDQUFDO2dCQUNKLEtBQUssR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUNoRCxDQUFDO1lBRUQsT0FBTyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2hELENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQyxDQUFDLENBQUM7SUFFYSxVQUFVLEdBQUcsSUFBSSxTQUFTLENBQWtDO1FBQ3hFLE1BQU0sRUFBRSxJQUFJLFdBQVcsQ0FBUyxFQUFFLEVBQUUsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLENBQUM7S0FDN0QsQ0FBQyxDQUFDO0lBRWMsYUFBYSxHQUFHLFNBQVMsQ0FBNkIsY0FBYyxDQUFDLENBQUM7SUFDdEUsWUFBWSxHQUFHLFNBQVMsQ0FBK0IsYUFBYSxDQUFDLENBQUM7SUFDdEUsa0JBQWtCLEdBQUcsU0FBUyxDQUEwQixtQkFBbUIsQ0FBQyxDQUFDO0lBQ3RGLFNBQVMsR0FBd0MsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDO0lBQzFELFVBQVUsR0FBZSxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUM7SUFFbEMsZUFBZSxHQUE0QixJQUFJLENBQUM7SUFFdkMsaUJBQWlCLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDN0MsUUFBUSxHQUFHLE1BQU0sQ0FBMEIsVUFBVSxDQUFDLENBQUM7SUFDdkQsU0FBUyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUUvQztRQUNJLElBQUksQ0FBQyxVQUFVO2FBQ1YsR0FBRyxDQUFDLFFBQVEsQ0FBRTthQUNkLFlBQVksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxFQUFFLG9CQUFvQixFQUFFLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQzthQUNsRixTQUFTLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNqQixJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNoQyxDQUFDLENBQUMsQ0FBQztRQUVQLGlFQUFpRTtRQUNqRSxNQUFNLENBQUMsR0FBRyxFQUFFO1lBQ1IsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQzVCLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLGFBQWEsS0FBSyxJQUFJLEVBQUUsQ0FBQztnQkFDckQsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDOUIsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgseUVBQXlFO1FBQ3pFLE1BQU0sQ0FBQyxHQUFHLEVBQUU7WUFDUixNQUFNLGtCQUFrQixHQUFHLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUNqRCxJQUFJLGtCQUFrQixFQUFFLENBQUM7Z0JBQ3JCLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUMsQ0FBQztZQUN4RCxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU0sUUFBUTtRQUNYLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRU0sZUFBZTtRQUNsQixJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztJQUNuQyxDQUFDO0lBRU0sV0FBVztRQUNkLElBQUksQ0FBQyxlQUFlLEVBQUUsbUJBQW1CLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUMzRSxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNJLFVBQVUsQ0FBQyxLQUFxQjtRQUNuQywwQ0FBMEM7UUFDMUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7UUFDM0IsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUVEOzs7T0FHRztJQUNLLGtCQUFrQjtRQUN0QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDO1FBQ2pDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUNwQyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFdkMsSUFBSSxLQUFLLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUM7WUFDM0IsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ3ZCLE1BQU0sTUFBTSxHQUFHLEtBQUs7cUJBQ2YsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7b0JBQ1AsSUFBSSxXQUFXLEVBQUUsQ0FBQzt3QkFDZCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDO29CQUNuRSxDQUFDO3lCQUFNLENBQUM7d0JBQ0osT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDO29CQUN0RixDQUFDO2dCQUNMLENBQUMsQ0FBQztxQkFDRCxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQW9DLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQzlELElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzVCLENBQUM7aUJBQU0sQ0FBQztnQkFDSixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN4QixDQUFDO1FBQ0wsQ0FBQzthQUFNLENBQUM7WUFDSixJQUFJLE1BQU0sR0FBcUMsSUFBSSxDQUFDO1lBQ3BELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUN2QixNQUFNLEdBQUcsSUFBSSxDQUFDO1lBQ2xCLENBQUM7aUJBQU0sSUFBSSxXQUFXLElBQUksS0FBSyxJQUFJLElBQUksRUFBRSxDQUFDO2dCQUN0QyxNQUFNLFlBQVksR0FDZCxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxXQUFXLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztnQkFDckcsTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssWUFBWSxDQUFDLElBQUksSUFBSSxDQUFDO1lBQ2hGLENBQUM7aUJBQU0sSUFBSSxLQUFLLElBQUksSUFBSSxFQUFFLENBQUM7Z0JBQ3ZCLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDO1lBQzVGLENBQUM7WUFDRCxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLENBQUM7UUFDbkMsQ0FBQztRQUNELElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO0lBQzlCLENBQUM7SUFFRDs7O09BR0c7SUFDSSxnQkFBZ0IsQ0FBQyxRQUF5QztRQUM3RCxJQUFJLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQztJQUM5QixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksaUJBQWlCLENBQUMsU0FBcUI7UUFDMUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7SUFDaEMsQ0FBQztJQUVEOzs7T0FHRztJQUNJLGdCQUFnQixDQUFDLFFBQWlCO1FBQ3JDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLE1BQU07UUFDVCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDO1lBQ2xCLE9BQU87UUFDWCxDQUFDO1FBRUQsTUFBTSxVQUFVLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDdkMsSUFBSSxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUM7UUFDekIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFakMsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUNiLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7Z0JBQ2hCLDRFQUE0RTtnQkFDNUUscURBQXFEO2dCQUNyRCxrREFBa0Q7Z0JBQ2xELFVBQVUsQ0FBQyxHQUFHLEVBQUU7b0JBQ1osSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQzt3QkFDbEIsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixFQUFFLEVBQUUsYUFBYSxDQUFDO3dCQUM5RCxNQUFNLFNBQVMsR0FBRyxZQUFZLEVBQUUsYUFBYSxDQUFjLFlBQVksQ0FBQyxDQUFDO3dCQUN6RSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUM7b0JBQ3ZCLENBQUM7eUJBQU0sQ0FBQzt3QkFDSixJQUFJLENBQUMsWUFBWSxFQUFFLEVBQUUsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO29CQUMvQyxDQUFDO2dCQUNMLENBQUMsQ0FBQyxDQUFDO1lBQ1AsQ0FBQztpQkFBTSxDQUFDO2dCQUNKLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1lBQ2hDLENBQUM7UUFDTCxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSSxVQUFVLENBQUMsSUFBK0I7UUFDN0MsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQztZQUNsQixPQUFPO1FBQ1gsQ0FBQztRQUVELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUV2QyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDO1lBQ2xCLE1BQU0sS0FBSyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztZQUNqQyxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsWUFBWSxFQUFFLEVBQUU7Z0JBQzNDLE9BQU8sWUFBWSxLQUFLLElBQUksQ0FBQztZQUNqQyxDQUFDLENBQUMsQ0FBQztZQUVILElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ2YsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDM0IsQ0FBQztpQkFBTSxDQUFDO2dCQUNKLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDckIsQ0FBQztZQUVELElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3ZCLE1BQU0sTUFBTSxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7WUFDakYsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMzQixDQUFDO2FBQU0sQ0FBQztZQUNKLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3JCLE1BQU0sTUFBTSxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztZQUNoRSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN0QixJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUUsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2hELENBQUM7UUFFRCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0ksS0FBSyxDQUFDLEtBQWlCO1FBQzFCLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUM7WUFDbEIsT0FBTztRQUNYLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDO1lBQ2xCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3BCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDbEMsQ0FBQzthQUFNLENBQUM7WUFDSixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNyQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ2pDLENBQUM7UUFFRCxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFFdEIsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2xCLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLFdBQVc7UUFDZCxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQztJQUMzQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLGNBQWMsQ0FBQyxDQUFRO1FBQzFCLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7WUFDckIsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQzFCLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLG1CQUFtQjtRQUN0QixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDZCxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUUsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ2hELENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ksZUFBZSxDQUFDLEtBQW9CO1FBQ3ZDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUV2QyxRQUFRLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNoQixLQUFLLFdBQVc7Z0JBQ1osS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUN2QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQy9CLE1BQU07WUFDVixLQUFLLFNBQVM7Z0JBQ1YsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUN2QixJQUFJLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQ3JCLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDO3dCQUMxQiwrQ0FBK0M7d0JBQy9DLElBQUksU0FBUyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO3dCQUNuQyxPQUFPLFNBQVMsSUFBSSxDQUFDLElBQUksT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDOzRCQUNsRCxTQUFTLEVBQUUsQ0FBQzt3QkFDaEIsQ0FBQzt3QkFDRCxJQUFJLFNBQVMsSUFBSSxDQUFDLEVBQUUsQ0FBQzs0QkFDakIsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7NEJBQ2pDLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO3dCQUNsQyxDQUFDO29CQUNMLENBQUM7eUJBQU0sQ0FBQzt3QkFDSixJQUFJLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLENBQUM7b0JBQ3ZDLENBQUM7Z0JBQ0wsQ0FBQztnQkFDRCxNQUFNO1lBQ1YsS0FBSyxRQUFRO2dCQUNULEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDdkIsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUN4QixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3RCLElBQUksQ0FBQyxhQUFhLEVBQUUsRUFBRSxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQzVDLE1BQU07WUFDVixLQUFLLE9BQU87Z0JBQ1IsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7b0JBQ25FLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztvQkFDdkIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDbEQsQ0FBQztnQkFDRCxNQUFNO1FBQ2QsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ0ksU0FBUyxDQUFDLEtBQW9CO1FBQ2pDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUV2QyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsR0FBRyxLQUFLLE9BQU8sSUFBSSxLQUFLLENBQUMsR0FBRyxLQUFLLEdBQUcsRUFBRSxDQUFDO1lBQzFGLE9BQU87UUFDWCxDQUFDO1FBRUQsTUFBTSxhQUFhLEdBQUcsR0FBRyxFQUFFO1lBQ3ZCLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNuRSxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3ZCLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDbEQsQ0FBQztRQUNMLENBQUMsQ0FBQztRQUVGLFFBQVEsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ2hCLEtBQUssV0FBVztnQkFDWixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztvQkFDdEIsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNsQixDQUFDO3FCQUFNLENBQUM7b0JBQ0osSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUNuQyxDQUFDO2dCQUNELE1BQU07WUFDVixLQUFLLFNBQVM7Z0JBQ1YsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUN2QixJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO29CQUNyQixJQUFJLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ3ZDLENBQUM7Z0JBQ0QsTUFBTTtZQUNWLEtBQUssS0FBSztnQkFDTixnRkFBZ0Y7Z0JBQ2hGLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDO29CQUN0QyxPQUFPO2dCQUNYLENBQUM7Z0JBQ0QsYUFBYSxFQUFFLENBQUM7Z0JBQ2hCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDdEIsTUFBTTtZQUNWLEtBQUssT0FBTztnQkFDUixJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO29CQUNyQixhQUFhLEVBQUUsQ0FBQztnQkFDcEIsQ0FBQztxQkFBTSxDQUFDO29CQUNKLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDbEIsQ0FBQztnQkFDRCxNQUFNO1lBQ1YsS0FBSyxRQUFRO2dCQUNULElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7b0JBQ3JCLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztvQkFDdkIsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUM1QixDQUFDO2dCQUNELElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDdEIsTUFBTTtZQUNWLEtBQUssR0FBRztnQkFDSixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3ZCLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7b0JBQ3JCLGFBQWEsRUFBRSxDQUFDO2dCQUNwQixDQUFDO3FCQUFNLENBQUM7b0JBQ0osSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNsQixDQUFDO2dCQUNELE1BQU07UUFDZCxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxjQUFjLENBQUMsTUFBUztRQUMzQixPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksU0FBUyxDQUFDLENBQVMsRUFBRSxJQUErQjtRQUN2RCxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUM7SUFDbkIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxnQkFBZ0IsQ0FBQyxNQUFpQztRQUNyRCxPQUFPLENBQ0gsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1lBQ3JCLE9BQU8sQ0FBQyxLQUFLLE1BQU0sQ0FBQztRQUN4QixDQUFDLENBQUMsS0FBSyxTQUFTLENBQ25CLENBQUM7SUFDTixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxlQUFlO1FBQ2xCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQztZQUNuQixPQUFPO1FBQ1gsQ0FBQztRQUVELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRTNFLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7WUFDckIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDeEIsQ0FBQzthQUFNLENBQUM7WUFDSixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM3QixDQUFDO1FBRUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNLLG1CQUFtQixDQUFDLE1BQVM7UUFDakMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3ZDLE9BQU8sV0FBVyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN0RSxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNLLGVBQWU7UUFDbkIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBRS9CLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDbEIsT0FBTztRQUNYLENBQUM7UUFFRCxNQUFNLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE9BQU8sTUFBTSxLQUFLLFFBQVEsSUFBSSxNQUFNLEtBQUssSUFBSSxDQUFDLENBQUM7UUFFakcsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztnQkFDdEIsTUFBTSxJQUFJLEtBQUssQ0FBQywrREFBK0QsQ0FBQyxDQUFDO1lBQ3JGLENBQUM7UUFDTCxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7O09BYUc7SUFDSyx1QkFBdUI7UUFDM0IsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQztZQUN4QixPQUFPO1FBQ1gsQ0FBQztRQUVELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztRQUM5QyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDVixPQUFPO1FBQ1gsQ0FBQztRQUVELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDekMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ1QsT0FBTztRQUNYLENBQUM7UUFFRCxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ1osSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxXQUFXLFFBQVEsQ0FBQyxDQUFDO1FBQzFFLENBQUM7UUFFRCxJQUFJLENBQUMsc0JBQXNCLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUUxQyx3RUFBd0U7UUFDeEUsb0VBQW9FO1FBQ3BFLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO1FBQzdCLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFRDs7Ozs7T0FLRztJQUNLLGFBQWEsQ0FBQyxNQUFjO1FBQ2hDLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBbUIsWUFBWSxDQUFDLENBQUM7UUFDekUsS0FBSyxNQUFNLEtBQUssSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDckMsSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxLQUFLLE1BQU0sRUFBRSxDQUFDO2dCQUN2QyxPQUFPLEtBQUssQ0FBQztZQUNqQixDQUFDO1FBQ0wsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRDs7O09BR0c7SUFDYyxhQUFhLEdBQUcsR0FBUyxFQUFFO1FBQ3hDLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUM7WUFDbEIsT0FBTztRQUNYLENBQUM7UUFDRCxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUUsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ2hELENBQUMsQ0FBQztJQUVGOzs7OztPQUtHO0lBQ0ssY0FBYztRQUNsQixJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1QixJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNLLGVBQWUsQ0FBQyxPQUFZO1FBQ2hDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUU3QixPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDakMsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBRSxNQUFjLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDdkQsT0FBTztvQkFDSCxJQUFJLEVBQUUsTUFBTTtvQkFDWixFQUFFLEVBQUUsTUFBTSxTQUFTLElBQUksS0FBSyxFQUFFLEVBQUU7b0JBQ2hDLE9BQU8sRUFBRSxJQUFJO2lCQUNoQixDQUFDO1lBQ04sQ0FBQztZQUVELE9BQU87Z0JBQ0gsSUFBSSxFQUFFLE1BQU07Z0JBQ1osRUFBRSxFQUFFLE1BQU0sU0FBUyxJQUFJLEtBQUssRUFBRSxFQUFFO2FBQ25DLENBQUM7UUFDTixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSyxjQUFjLENBQUMsT0FBb0M7UUFDdkQsTUFBTSxNQUFNLEdBQWdDLEVBQUUsQ0FBQztRQUUvQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDdkIsSUFBSSxNQUFNLENBQUMsT0FBTyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUUsTUFBTSxDQUFDLElBQVksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUM5RCxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUNwQixNQUFNLFVBQVUsR0FBSSxNQUFNLENBQUMsSUFBWSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFPLEVBQUUsS0FBYSxFQUFFLEVBQUUsQ0FBQyxDQUFDO29CQUMzRSxJQUFJLEVBQUUsSUFBSTtvQkFDVixFQUFFLEVBQUUsR0FBRyxNQUFNLENBQUMsRUFBRSxTQUFTLEtBQUssRUFBRTtpQkFDbkMsQ0FBQyxDQUFDLENBQUM7Z0JBQ0osTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDO1lBQy9CLENBQUM7aUJBQU0sQ0FBQztnQkFDSixNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3hCLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssZ0JBQWdCLENBQUMsT0FBb0M7UUFDekQsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxHQUFHLENBQUMsQ0FBQztRQUV4QyxPQUFPLFNBQVMsR0FBRyxPQUFPLENBQUMsTUFBTSxJQUFJLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUM5RCxTQUFTLEVBQUUsQ0FBQztRQUNoQixDQUFDO1FBRUQsSUFBSSxTQUFTLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzdCLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2pDLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBQ2xDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLG9CQUFvQixDQUFDLE9BQW9DO1FBQzdELElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFFeEMsT0FBTyxTQUFTLElBQUksQ0FBQyxJQUFJLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNsRCxTQUFTLEVBQUUsQ0FBQztRQUNoQixDQUFDO1FBRUQsSUFBSSxTQUFTLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDakMsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFDbEMsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSyxzQkFBc0I7UUFDMUIsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUUzRCxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDTixPQUFPO1FBQ1gsQ0FBQztRQUVELE1BQU0sRUFBRSxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdkMsRUFBRSxFQUFFLGNBQWMsQ0FBQyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNLLG9CQUFvQjtRQUN4QixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDdkMsSUFBSSxhQUFhLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFFdkIsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQztZQUNsQixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdkMsSUFBSSxhQUFhLEVBQUUsQ0FBQztnQkFDaEIsYUFBYSxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3hFLENBQUM7UUFDTCxDQUFDO2FBQU0sQ0FBQztZQUNKLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUM5QixJQUFJLFFBQVEsRUFBRSxDQUFDO2dCQUNYLGFBQWEsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNuRSxDQUFDO1FBQ0wsQ0FBQztRQUVELElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBRXJDLElBQUksYUFBYSxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3JCLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQyxDQUFDO1FBQ3BELENBQUM7SUFDTCxDQUFDO3dHQTM0QlEsZUFBZTs0RkFBZixlQUFlLGk5RUFuQmI7WUFDUDtnQkFDSSxPQUFPLEVBQUUsaUJBQWlCO2dCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLGVBQWUsQ0FBQztnQkFDOUMsS0FBSyxFQUFFLElBQUk7YUFDZDtTQUNKLGlZQ3ZGTCw4cU9BK0tBLDhKRHJIUSxZQUFZLDhCQUNaLG1CQUFtQiw0OEJBQ25CLGVBQWUsNGpCQUNmLHFCQUFxQixpTUFDckIsaUJBQWlCLDhMQUNqQixlQUFlLDJGQUNmLGFBQWEsNnFDQXdCTDtZQUNSLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRTtnQkFDekIsS0FBSyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUsQ0FBQyxDQUFDO2dCQUM5RCxVQUFVLENBQUMsUUFBUSxFQUFFO29CQUNqQixPQUFPLENBQUMsa0NBQWtDLEVBQUUsS0FBSyxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztpQkFDNUYsQ0FBQztnQkFDRixVQUFVLENBQUMsUUFBUSxFQUFFO29CQUNqQixPQUFPLENBQUMsb0NBQW9DLEVBQUUsS0FBSyxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLENBQUMsQ0FBQztpQkFDakcsQ0FBQzthQUNMLENBQUM7U0FDTDs7NEZBRVEsZUFBZTtrQkEvQzNCLFNBQVM7K0JBQ0ksVUFBVSxjQUVSLElBQUksV0FDUDt3QkFDTCxZQUFZO3dCQUNaLG1CQUFtQjt3QkFDbkIsZUFBZTt3QkFDZixxQkFBcUI7d0JBQ3JCLGlCQUFpQjt3QkFDakIsZUFBZTt3QkFDZixhQUFhO3FCQUNoQixRQUNLO3dCQUNGLGlCQUFpQixFQUFFLHdCQUF3QjtxQkFDOUMsYUFhVTt3QkFDUDs0QkFDSSxPQUFPLEVBQUUsaUJBQWlCOzRCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxnQkFBZ0IsQ0FBQzs0QkFDOUMsS0FBSyxFQUFFLElBQUk7eUJBQ2Q7cUJBQ0osY0FDVzt3QkFDUixPQUFPLENBQUMsbUJBQW1CLEVBQUU7NEJBQ3pCLEtBQUssQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLENBQUMsQ0FBQzs0QkFDOUQsVUFBVSxDQUFDLFFBQVEsRUFBRTtnQ0FDakIsT0FBTyxDQUFDLGtDQUFrQyxFQUFFLEtBQUssQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUM7NkJBQzVGLENBQUM7NEJBQ0YsVUFBVSxDQUFDLFFBQVEsRUFBRTtnQ0FDakIsT0FBTyxDQUFDLG9DQUFvQyxFQUFFLEtBQUssQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxDQUFDLENBQUM7NkJBQ2pHLENBQUM7eUJBQ0wsQ0FBQztxQkFDTCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE92ZXJsYXlNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XG5pbXBvcnQgeyBTY3JvbGxpbmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jZGsvc2Nyb2xsaW5nJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICAgIEFmdGVyVmlld0luaXQsXG4gICAgQ29tcG9uZW50LFxuICAgIGNvbXB1dGVkLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgZm9yd2FyZFJlZixcbiAgICBpbmplY3QsXG4gICAgaW5wdXQsXG4gICAgbW9kZWwsXG4gICAgT25EZXN0cm95LFxuICAgIE9uSW5pdCxcbiAgICBSZW5kZXJlcjIsXG4gICAgc2lnbmFsLFxuICAgIHZpZXdDaGlsZCxcbiAgICBlZmZlY3QsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIEZvcm1Db250cm9sLCBGb3JtR3JvdXAsIE5HX1ZBTFVFX0FDQ0VTU09SLCBSZWFjdGl2ZUZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUsIFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IENoZWNrYm94Q29tcG9uZW50IH0gZnJvbSAnQHNlbmlvcnNpc3RlbWFzL2FuZ3VsYXItY29tcG9uZW50cy9jaGVja2JveCc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBTZWxlY3RPcHRpb25Db21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvc2VsZWN0LW9wdGlvbi9zZWxlY3Qtb3B0aW9uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBhbmltYXRlLCBzdGF0ZSwgc3R5bGUsIHRyYW5zaXRpb24sIHRyaWdnZXIgfSBmcm9tICdAYW5ndWxhci9hbmltYXRpb25zJztcblxuaW50ZXJmYWNlIEludGVybmFsRHJvcGRvd25PcHRpb248VD4ge1xuICAgIGRhdGE6IFQ7XG4gICAgaWQ6IHN0cmluZztcbiAgICBncm91cGVyPzogYm9vbGVhbjtcbn1cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbXBvbmVudGUgZGUgc2VsZcOnw6NvIGRyb3Bkb3duIGdlbsOpcmljbyBjb20gc3Vwb3J0ZSBhIHNlbGXDp8OjbyBzaW1wbGVzIGUgbcO6bHRpcGxhLFxuICogZmlsdHJvLCBhZ3J1cGFtZW50bywgdmlydHVhbCBzY3JvbGwgZSBhY2Vzc2liaWxpZGFkZSAoQVJJQSBjb21ib2JveCkuIEltcGxlbWVudGFcbiAqIHtAbGluayBDb250cm9sVmFsdWVBY2Nlc3Nvcn0gcGFyYSBpbnRlZ3Jhw6fDo28gY29tIFJlYWN0aXZlIEZvcm1zIGUgVGVtcGxhdGUtZHJpdmVuIEZvcm1zLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBodG1sXG4gKiA8cy1zZWxlY3RcbiAqICAgZm9ybUNvbnRyb2xOYW1lPVwiY2F0ZWdvcmlhXCJcbiAqICAgcGxhY2Vob2xkZXI9XCJTZWxlY2lvbmUgdW1hIGNhdGVnb3JpYVwiXG4gKiAgIFtvcHRpb25zXT1cImNhdGVnb3JpYXNcIlxuICogICBvcHRpb25MYWJlbD1cIm5vbWVcIlxuICogICBvcHRpb25WYWx1ZT1cImlkXCJcbiAqICAgW2ZpbHRlcl09XCJ0cnVlXCJcbiAqICAgW3Nob3dDbGVhcl09XCJ0cnVlXCIgLz5cbiAqIGBgYFxuICpcbiAqIEBjYXRlZ29yeSBJbnB1dHNcbiAqL1xuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdzLXNlbGVjdCcsXG4gICAgdGVtcGxhdGVVcmw6ICcuL3NlbGVjdC5jb21wb25lbnQuaHRtbCcsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbXG4gICAgICAgIENvbW1vbk1vZHVsZSxcbiAgICAgICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgICAgICAgU2Nyb2xsaW5nTW9kdWxlLFxuICAgICAgICBTZWxlY3RPcHRpb25Db21wb25lbnQsXG4gICAgICAgIENoZWNrYm94Q29tcG9uZW50LFxuICAgICAgICBUcmFuc2xhdGVNb2R1bGUsXG4gICAgICAgIE92ZXJsYXlNb2R1bGUsXG4gICAgXSxcbiAgICBob3N0OiB7XG4gICAgICAgICcod2luZG93OnJlc2l6ZSknOiAnb25XaW5kb3dSZXNpemUoJGV2ZW50KScsXG4gICAgfSxcbiAgICBzdHlsZXM6IFtcbiAgICAgICAgYFxuICAgICAgICAgICAgOmhvc3QubmctZGlydHkubmctaW52YWxpZCB7XG4gICAgICAgICAgICAgICAgLmRyb3Bkb3duLWNvbnRhaW5lcixcbiAgICAgICAgICAgICAgICAuc2VsZWN0LWNvbnRhaW5lciB7XG4gICAgICAgICAgICAgICAgICAgIGJvcmRlci1jb2xvcjogI2MxMzAxODtcbiAgICAgICAgICAgICAgICAgICAgb3V0bGluZTogbm9uZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIGAsXG4gICAgXSxcblxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFNlbGVjdENvbXBvbmVudCksXG4gICAgICAgICAgICBtdWx0aTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICBdLFxuICAgIGFuaW1hdGlvbnM6IFtcbiAgICAgICAgdHJpZ2dlcigndmlzaWJpbGl0eUNoYW5nZWQnLCBbXG4gICAgICAgICAgICBzdGF0ZSgndm9pZCcsIHN0eWxlKHsgb3BhY2l0eTogMCwgdHJhbnNmb3JtOiAnc2NhbGUoMC45NSknIH0pKSxcbiAgICAgICAgICAgIHRyYW5zaXRpb24oJzplbnRlcicsIFtcbiAgICAgICAgICAgICAgICBhbmltYXRlKCc1MDBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKScsIHN0eWxlKHsgb3BhY2l0eTogMSwgdHJhbnNmb3JtOiAnc2NhbGUoMSknIH0pKSxcbiAgICAgICAgICAgIF0pLFxuICAgICAgICAgICAgdHJhbnNpdGlvbignOmxlYXZlJywgW1xuICAgICAgICAgICAgICAgIGFuaW1hdGUoJzUwMG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSknLCBzdHlsZSh7IG9wYWNpdHk6IDAsIHRyYW5zZm9ybTogJ3NjYWxlKDAuOTUpJyB9KSksXG4gICAgICAgICAgICBdKSxcbiAgICAgICAgXSksXG4gICAgXSxcbn0pXG5leHBvcnQgY2xhc3MgU2VsZWN0Q29tcG9uZW50PFQ+IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgICBwcml2YXRlIHN0YXRpYyBuZXh0SWQgPSAwO1xuXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBUZXh0byBleGliaWRvIHF1YW5kbyBuZW5odW1hIG9ww6fDo28gZXN0w6Egc2VsZWNpb25hZGEuIEBkZWZhdWx0ICcnICovXG4gICAgcHVibGljIHBsYWNlaG9sZGVyID0gaW5wdXQoJycpO1xuXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBIYWJpbGl0YSBhIHNlbGXDp8OjbyBkZSBtw7psdGlwbGFzIG9ww6fDtWVzIHNpbXVsdMOibmVhcy4gQGRlZmF1bHQgZmFsc2UgKi9cbiAgICBwdWJsaWMgbXVsdGlwbGUgPSBpbnB1dChmYWxzZSk7XG5cbiAgICAvKiogQGRlc2NyaXB0aW9uIExpc3RhIGRlIG9ww6fDtWVzIGRpc3BvbsOtdmVpcyBwYXJhIHNlbGXDp8Ojby4gQ2FtcG8gb2JyaWdhdMOzcmlvLiAqL1xuICAgIHB1YmxpYyBvcHRpb25zID0gaW5wdXQucmVxdWlyZWQ8VFtdPigpO1xuXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBDaGF2ZSBkbyBvYmpldG8gZGUgb3DDp8OjbyB1c2FkYSBjb21vIGxhYmVsIGRlIGV4aWJpw6fDo28uICovXG4gICAgcHVibGljIG9wdGlvbkxhYmVsID0gaW5wdXQ8a2V5b2YgVD4oKTtcblxuICAgIC8qKiBAZGVzY3JpcHRpb24gQ2hhdmUgZG8gb2JqZXRvIGRlIG9ww6fDo28gdXNhZGEgY29tbyB2YWxvciBhIHNlciBlbWl0aWRvIGFvIGZvcm11bMOhcmlvLiAqL1xuICAgIHB1YmxpYyBvcHRpb25WYWx1ZSA9IGlucHV0PGtleW9mIFQ+KCk7XG5cbiAgICAvKiogQGRlc2NyaXB0aW9uIEV4aWJlIHVtIGJvdMOjbyBwYXJhIGxpbXBhciBhIHNlbGXDp8OjbyBhdHVhbC4gQGRlZmF1bHQgZmFsc2UgKi9cbiAgICBwdWJsaWMgc2hvd0NsZWFyID0gaW5wdXQoZmFsc2UpO1xuXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBIYWJpbGl0YSB1bSBjYW1wbyBkZSBmaWx0cm8gdGV4dHVhbCBwYXJhIHBlc3F1aXNhIG5hcyBvcMOnw7Vlcy4gQGRlZmF1bHQgZmFsc2UgKi9cbiAgICBwdWJsaWMgZmlsdGVyID0gaW5wdXQoZmFsc2UpO1xuXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBFeGliZSB1bSDDrWNvbmUgZGUgY2hlY2ttYXJrIGFvIGxhZG8gZGEgb3DDp8OjbyBzZWxlY2lvbmFkYS4gQGRlZmF1bHQgZmFsc2UgKi9cbiAgICBwdWJsaWMgY2hlY2ttYXJrID0gaW5wdXQoZmFsc2UpO1xuXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBDaGF2ZShzKSBkbyBvYmpldG8gdXNhZGEocykgcGFyYSBmaWx0cmFnZW0gdGV4dHVhbC4gUXVhbmRvIG7Do28gaW5mb3JtYWRvLCB1c2EgYG9wdGlvbkxhYmVsYC4gKi9cbiAgICBwdWJsaWMgZmlsdGVyQnkgPSBpbnB1dDxrZXlvZiBUIHwgKGtleW9mIFQpW10+KCk7XG5cbiAgICAvKiogQGRlc2NyaXB0aW9uIEhhYmlsaXRhIGFncnVwYW1lbnRvIGRlIG9ww6fDtWVzLiBBcyBvcMOnw7VlcyBkZXZlbSBjb250ZXIgaXRlbnMgZmlsaG9zIGNvbmZvcm1lIGEgZXN0cnV0dXJhIGRlIGdydXBvIHN1cG9ydGFkYS4gQGRlZmF1bHQgZmFsc2UgKi9cbiAgICBwdWJsaWMgZ3JvdXAgPSBpbnB1dChmYWxzZSk7XG5cbiAgICAvKiogQGRlc2NyaXB0aW9uIEhhYmlsaXRhIHZpcnR1YWxpemHDp8OjbyBkYSBsaXN0YSBwYXJhIG1lbGhvciBwZXJmb3JtYW5jZSBjb20gZ3JhbmRlcyB2b2x1bWVzIGRlIG9ww6fDtWVzLiBAZGVmYXVsdCBmYWxzZSAqL1xuICAgIHB1YmxpYyB2aXJ0dWFsU2Nyb2xsID0gaW5wdXQoZmFsc2UpO1xuXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBBbHR1cmEgZml4YSBkZSBjYWRhIGl0ZW0gZGEgbGlzdGEgZW0gcGl4ZWxzLCBuZWNlc3PDoXJpYSBwYXJhIG8gY8OhbGN1bG8gZG8gdmlydHVhbCBzY3JvbGwuIEBkZWZhdWx0IDM3ICovXG4gICAgcHVibGljIHZpcnR1YWxTY3JvbGxJdGVtU2l6ZSA9IGlucHV0KDM3KTtcblxuICAgIC8qKiBAZGVzY3JpcHRpb24gTWVuc2FnZW0gZXhpYmlkYSBxdWFuZG8gbmVuaHVtYSBvcMOnw6NvIGNvcnJlc3BvbmRlIGFvIGZpbHRybyBhcGxpY2Fkby4gQGRlZmF1bHQgbnVsbCAqL1xuICAgIHB1YmxpYyBlbXB0eU1lc3NhZ2UgPSBpbnB1dDxzdHJpbmcgfCBudWxsPihudWxsKTtcblxuICAgIC8qKiBAZGVzY3JpcHRpb24gQ29udHJvbGEgbyBlc3RhZG8gZGVzYWJpbGl0YWRvIGRvIGNvbXBvbmVudGUgdmlhIHR3by13YXkgYmluZGluZy4gQGRlZmF1bHQgZmFsc2UgKi9cbiAgICBwdWJsaWMgZGlzYWJsZWQgPSBtb2RlbChmYWxzZSk7XG5cbiAgICAvKiogQGRlc2NyaXB0aW9uIENvbnRyb2xhIGEgdmlzaWJpbGlkYWRlIGRvIHBhaW5lbCBkZSBvcMOnw7VlcyB2aWEgdHdvLXdheSBiaW5kaW5nLiBAZGVmYXVsdCBmYWxzZSAqL1xuICAgIHB1YmxpYyBzaG93T3B0aW9ucyA9IG1vZGVsKGZhbHNlKTtcblxuICAgIC8qKiBAZGVzY3JpcHRpb24gTGFiZWwgZGUgYWNlc3NpYmlsaWRhZGUgZG8gY29tcG9uZW50ZS4gQGRlZmF1bHQgJycgKi9cbiAgICBwdWJsaWMgYXJpYUxhYmVsID0gaW5wdXQoJycpO1xuXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBJRCBkbyBlbGVtZW50byBleHRlcm5vIHF1ZSBkZXNjcmV2ZSBvIGNvbXBvbmVudGUgKGFyaWEtbGFiZWxsZWRieSkuIEBkZWZhdWx0ICcnICovXG4gICAgcHVibGljIGFyaWFMYWJlbGxlZEJ5ID0gaW5wdXQoJycpO1xuXG4gICAgLyoqXG4gICAgICogSUQgZG8gbGFiZWwgcmVzb2x2aWRvIHBhcmEgYGFyaWEtbGFiZWxsZWRieWAgZG8gY29tYm9ib3ggaW50ZXJuby5cbiAgICAgKiBQcmlvcml6YSBvIHZhbG9yIGV4cGzDrWNpdG8gZGUgYGFyaWFMYWJlbGxlZEJ5YDsgY2FzbyBjb250csOhcmlvLCB1c2EgbyBpZCBkZSB1bVxuICAgICAqIGA8bGFiZWwgZm9yPVwiLi4uXCI+YCBleHRlcm5vIGFzc29jaWFkbyBhbyBob3N0IChkZXRlY3RhZG8gZW0gcnVudGltZSkuXG4gICAgICovXG4gICAgcHVibGljIHJlc29sdmVkQXJpYUxhYmVsbGVkQnkgPSBzaWduYWwoJycpO1xuXG4gICAgcHVibGljIHZhbHVlID0gc2lnbmFsPEludGVybmFsRHJvcGRvd25PcHRpb248VD4gfCBudWxsPihudWxsKTtcbiAgICBwdWJsaWMgdmFsdWVzID0gc2lnbmFsPEludGVybmFsRHJvcGRvd25PcHRpb248VD5bXT4oW10pO1xuICAgIHB1YmxpYyBmaWx0ZXJWYWx1ZSA9IHNpZ25hbCgnJyk7XG4gICAgcHVibGljIGZvY3VzZWRJbmRleCA9IHNpZ25hbCgtMSk7XG4gICAgcHJpdmF0ZSBfcGVuZGluZ1ZhbHVlOiBUIHwgVFtdIHwgbnVsbCA9IG51bGw7XG4gICAgcHVibGljIGlzT3BlbiA9IGZhbHNlO1xuXG4gICAgcHVibGljIGNvbXBvbmVudElkID0gYHNlbGVjdCR7U2VsZWN0Q29tcG9uZW50Lm5leHRJZCsrfWA7XG5cbiAgICAvKipcbiAgICAgKiBDb21wdXRlZCBxdWUgaW5kaWNhIHNlIHRvZGFzIGFzIG9ww6fDtWVzIGZpbHRyYWRhcyBlc3TDo28gc2VsZWNpb25hZGFzLlxuICAgICAqIFJldG9ybmEgYHRydWVgIHNlIHRvZGFzIGFzIG9ww6fDtWVzIGRpc3BvbsOtdmVpcyAoZXhjbHVpbmRvIGFncnVwYWRvcmVzKSBlc3RpdmVyZW0gcHJlc2VudGVzXG4gICAgICogbmEgbGlzdGEgZGUgdmFsb3JlcyBzZWxlY2lvbmFkb3MsIGUgYGZhbHNlYCBjYXNvIGNvbnRyw6FyaW8uXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBzZSB0b2RhcyBhcyBvcMOnw7VlcyBmaWx0cmFkYXMgZXN0w6NvIHNlbGVjaW9uYWRhcywgYGZhbHNlYCBjYXNvIGNvbnRyw6FyaW8uXG4gICAgICovXG4gICAgcHVibGljIGFsbFNlbGVjdGVkID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5maWx0ZXJlZE9wdGlvbnMoKS5maWx0ZXIoKG9wdGlvbikgPT4gIW9wdGlvbi5ncm91cGVyKTtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRJZHMgPSB0aGlzLnZhbHVlcygpLm1hcCgob3B0aW9uKSA9PiBvcHRpb24uaWQpO1xuXG4gICAgICAgIGNvbnN0IHJldCA9IG9wdGlvbnMubGVuZ3RoID4gMCAmJiBvcHRpb25zLmV2ZXJ5KChvcHRpb24pID0+IHNlbGVjdGVkSWRzLmluY2x1ZGVzKG9wdGlvbi5pZCkpO1xuICAgICAgICByZXR1cm4gcmV0O1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogUmV0b3JuYSBvIGl0ZW0gYXR1YWxtZW50ZSBmb2NhZG8gbmEgbGlzdGEgZGUgb3DDp8O1ZXMgZmlsdHJhZGFzLlxuICAgICAqIEByZXR1cm5zIE8gZGFkbyBkbyBpdGVtIGZvY2FkbyBvdSBgbnVsbGAgY2FzbyBuZW5odW0gaXRlbSBlc3RlamEgZm9jYWRvLlxuICAgICAqL1xuICAgIHB1YmxpYyBmb2N1c2VkSXRlbSA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmZvY3VzZWRJbmRleCgpO1xuICAgICAgICBpZiAoaW5kZXggPCAwKSByZXR1cm4gbnVsbDtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyZWRPcHRpb25zKClbaW5kZXhdPy5kYXRhID8/IG51bGw7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBSZXRvcm5hIG8gaXRlbSBhdHVhbG1lbnRlIGZvY2FkbyBuYSBsaXN0YSBkZSBvcMOnw7VlcyBmaWx0cmFkYXMuXG4gICAgICogQHJldHVybnMgTyBkYWRvIGRvIGl0ZW0gZm9jYWRvIG91IGBudWxsYCBjYXNvIG5lbmh1bSBpdGVtIGVzdGVqYSBmb2NhZG8uXG4gICAgICovXG4gICAgcHVibGljIGZvY3VzZWRPcHRpb25JZCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmZvY3VzZWRJbmRleCgpO1xuICAgICAgICBpZiAoaW5kZXggPCAwKSByZXR1cm4gbnVsbDtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyZWRPcHRpb25zKClbaW5kZXhdPy5pZCA/PyBudWxsO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ29tcHV0YSBlIHJldG9ybmEgYSBsaXN0YSBpbnRlcm5hIGRlIG9ww6fDtWVzIGRvIGRyb3Bkb3duLlxuICAgICAqIC0gU2UgYXMgb3DDp8O1ZXMgZXN0aXZlcmVtIGFncnVwYWRhcyAoYGdyb3VwKClgIHJldG9ybmEgdmVyZGFkZWlybyksXG4gICAgICogICB1dGlsaXphIGBfZ3JvdXBlclRvRmxhdGAgcGFyYSB0cmFuc2Zvcm1hciBhcyBvcMOnw7VlcyBhZ3J1cGFkYXMgZW0gdW1hIGxpc3RhIHBsYW5hLlxuICAgICAqIC0gQ2FzbyBjb250csOhcmlvLCByZXRvcm5hIGFzIG9ww6fDtWVzIGNvbSBJRHMgYWRpY2lvbmFkb3MuXG4gICAgICogQHJldHVybnMgVW0gYXJyYXkgZGUgYEludGVybmFsRHJvcGRvd25PcHRpb248VD5gIHJlcHJlc2VudGFuZG8gYXMgb3DDp8O1ZXMgZGlzcG9uw612ZWlzIHBhcmEgbyBjb21wb25lbnRlIHNlbGVjdC5cbiAgICAgKi9cbiAgICBwdWJsaWMgaW50ZXJuYWxPcHRpb25zID0gY29tcHV0ZWQ8SW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPltdPigoKSA9PiB7XG4gICAgICAgIGNvbnN0IG9wdHMgPSB0aGlzLm9wdGlvbnMoKTtcbiAgICAgICAgY29uc3Qgb3B0aW9uc1dpdGhJZCA9IHRoaXMuX2FkZElkVG9PcHRpb25zKG9wdHMpO1xuICAgICAgICByZXR1cm4gdGhpcy5ncm91cCgpID8gdGhpcy5fZ3JvdXBlclRvRmxhdChvcHRpb25zV2l0aElkKSA6IG9wdGlvbnNXaXRoSWQ7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBSZXRvcm5hIHVtYSBzdHJpbmcgcmVwcmVzZW50YW5kbyBhIHNlbGXDp8OjbyBhdHVhbCBkbyBjb21wb25lbnRlLlxuICAgICAqIC0gU2UgbyBtb2RvIG3Dumx0aXBsbyBlc3RpdmVyIGF0aXZhZG8gZSBtYWlzIGRlIHVtIGl0ZW0gZXN0aXZlciBzZWxlY2lvbmFkbyxcbiAgICAgKiAgIHJldG9ybmEgdW1hIG1lbnNhZ2VtIHRyYWR1emlkYSBpbmRpY2FuZG8gbyBuw7ptZXJvIHRvdGFsIGRlIHJlZ2lzdHJvcyBzZWxlY2lvbmFkb3MuXG4gICAgICogLSBTZSBhcGVuYXMgdW0gaXRlbSBlc3RpdmVyIHNlbGVjaW9uYWRvLCByZXRvcm5hIG8gcsOzdHVsbyBkZXNzZSBpdGVtLlxuICAgICAqIC0gU2UgbyBtb2RvIG3Dumx0aXBsbyBuw6NvIGVzdGl2ZXIgYXRpdmFkbywgcmV0b3JuYSBvIHLDs3R1bG8gZG8gaXRlbSBzZWxlY2lvbmFkbyBvdSB1bWEgc3RyaW5nIHZhemlhIGNhc28gbmVuaHVtIGl0ZW0gZXN0ZWphIHNlbGVjaW9uYWRvLlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFRleHRvIHJlcHJlc2VudGFuZG8gYSBzZWxlw6fDo28gYXR1YWwuXG4gICAgICovXG4gICAgcHVibGljIHByaW50ID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSgpKSB7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMudmFsdWVzKCk7XG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWQubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgIC8qIFxuICAgICAgICAgICAgICAgICAgICBUT0RPOiBPIENlcnRvIMOpIHNldGFyIG5hIHRyYWR1w6fDo28gYSBjaGF2ZSBjb21vOiB7eyBjb3VudCB9fS4gYXR1YWxtZW50ZSBlc3RhIGNvbW8gezB9IGUgbyBuZ3gtdHJhbnNsYXRlIG5hbyBjb25zZWd1ZSBpbnRlcnByZXRhciBlc3NhIGNoYXZlIG5hdGl2YW1lbnRlLiBcbiAgICAgICAgICAgICAgICAgICAgcXVhbmRvIGFkaWNpb25hciBub3ZhcyBjaGF2ZXMgZGUgdHJhZHXDp8OjbywgY29ycmlnaXIgZXNzYSBsaW5oYSwgc2V0YW5kbyB7eyBjb3VudCB9fSBcbiAgICAgICAgICAgICAgICAgICAgZSB1c2FyIC5pbnN0YW50KGBwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMudG90YWxfcmVjb3Jkc19zZWxlY3RlZGAsIHsgY291bnQ6IHNlbGVjdGVkLmxlbmd0aCB9KVxuICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgY29uc3QgdHJhbnNsYXRlZCA9IHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChgcGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLnRvdGFsX3JlY29yZHNfc2VsZWN0ZWRgKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJhbnNsYXRlZC5yZXBsYWNlKCd7MH0nLCBTdHJpbmcoc2VsZWN0ZWQubGVuZ3RoKSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNlbGVjdGVkLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRMYWJlbEZyb21PcHRpb24oc2VsZWN0ZWRbMF0uZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMudmFsdWUoKTtcbiAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZCA/IHRoaXMuX2dldExhYmVsRnJvbU9wdGlvbihzZWxlY3RlZC5kYXRhKSA6ICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogSW5kaWNhIHNlIG8gc2VsZXRvciBlc3TDoSBcImxpbXBvXCIsIG91IHNlamEsIHNlbSBuZW5odW0gdmFsb3Igc2VsZWNpb25hZG8uXG4gICAgICogLSBObyBtb2RvIG3Dumx0aXBsbyAoYG11bHRpcGxlYCksIHJldG9ybmEgYHRydWVgIHNlIG7Do28gaG91dmVyIG5lbmh1bSB2YWxvciBzZWxlY2lvbmFkbyAoYHZhbHVlc2AgZXN0w6EgdmF6aW8pLlxuICAgICAqIC0gTm8gbW9kbyBzaW1wbGVzLCByZXRvcm5hIGB0cnVlYCBzZSBuw6NvIGhvdXZlciB2YWxvciBzZWxlY2lvbmFkbyAoYHZhbHVlYCDDqSBmYWxzeSkuXG4gICAgICogQHJldHVybnMgYHRydWVgIHNlIG7Do28gaG91dmVyIHNlbGXDp8OjbywgYGZhbHNlYCBjYXNvIGNvbnRyw6FyaW8uXG4gICAgICovXG4gICAgcHVibGljIGlzQ2xlYW4gPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLm11bHRpcGxlKCkgPyAhdGhpcy52YWx1ZXMoKS5sZW5ndGggOiAhdGhpcy52YWx1ZSgpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ29tcHV0ZWQgcXVlIGluZGljYSBzZSBvIGVzdGFkbyBkZSBzZWxlw6fDo28gXCJTZWxlY2lvbmFyIFRvZG9zXCIgZXN0w6EgaW5kZXRlcm1pbmFkby5cbiAgICAgKiBSZXRvcm5hIGB0cnVlYCBxdWFuZG8gbmVtIHRvZG9zIG9zIGl0ZW5zIGZpbHRyYWRvcyBlc3TDo28gc2VsZWNpb25hZG9zIGUgbmVtIHRvZG9zIGVzdMOjbyBkZXNtYXJjYWRvcyxcbiAgICAgKiBvdSBzZWphLCBxdWFuZG8gaMOhIHVtYSBzZWxlw6fDo28gcGFyY2lhbCBkb3MgaXRlbnMgZGlzcG9uw612ZWlzLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgc2UgYSBzZWxlw6fDo28gZm9yIHBhcmNpYWwsIGBmYWxzZWAgY2FzbyBjb250csOhcmlvLlxuICAgICAqL1xuICAgIHB1YmxpYyBzZWxlY3RBbGxJc0luZGV0ZXJtaW5hdGUgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy5pbnRlcm5hbE9wdGlvbnMoKS5maWx0ZXIoKG9wdGlvbikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVzKCkuc29tZSgobykgPT4gby5pZCA9PT0gb3B0aW9uLmlkKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmZpbHRlcmVkT3B0aW9ucygpLmZpbHRlcigob3B0aW9uKSA9PiAhb3B0aW9uLmdyb3VwZXIpO1xuICAgICAgICBjb25zdCBhbGwgPSBvcHRpb25zLmxlbmd0aCA+IDAgJiYgb3B0aW9ucy5ldmVyeSgob3B0aW9uKSA9PiBzZWxlY3RlZC5pbmNsdWRlcyhvcHRpb24pKTtcbiAgICAgICAgY29uc3Qgbm9uZSA9IG9wdGlvbnMuZXZlcnkoKG9wdGlvbikgPT4gIXNlbGVjdGVkLmluY2x1ZGVzKG9wdGlvbikpO1xuXG4gICAgICAgIHJldHVybiAhYWxsICYmICFub25lO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogUmV0b3JuYSB1bWEgbGlzdGEgZGUgb3DDp8O1ZXMgZmlsdHJhZGFzIGNvbSBiYXNlIG5vIHZhbG9yIGRlIGJ1c2NhIChgZmlsdGVyVmFsdWVgKSBlIG5vcyBjcml0w6lyaW9zIGRlZmluaWRvcy5cbiAgICAgKiAtIFNlIG8gZmlsdHJvIGVzdGl2ZXIgZGVzYWJpbGl0YWRvIG91IG8gdmFsb3IgZGUgYnVzY2EgZXN0aXZlciB2YXppbywgcmV0b3JuYSB0b2RhcyBhcyBvcMOnw7Vlcy5cbiAgICAgKiAtIENhc28gY29udHLDoXJpbywgZmlsdHJhIGFzIG9ww6fDtWVzIHV0aWxpemFuZG8gbyhzKSBjYW1wbyhzKSBlc3BlY2lmaWNhZG8ocykgZW0gYGZpbHRlckJ5YC5cbiAgICAgKiAtIElnbm9yYSBvcMOnw7VlcyBxdWUgcG9zc3VlbSBhIHByb3ByaWVkYWRlIGBncm91cGVyYCBkZWZpbmlkYS5cbiAgICAgKiBAcmV0dXJucyBBcyBvcMOnw7VlcyBmaWx0cmFkYXMgY29uZm9ybWUgbyB2YWxvciBkZSBidXNjYSBlIGNyaXTDqXJpb3MgZGUgZmlsdHJvLlxuICAgICAqL1xuICAgIHB1YmxpYyBmaWx0ZXJlZE9wdGlvbnMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGFsbE9wdGlvbnMgPSB0aGlzLmludGVybmFsT3B0aW9ucygpO1xuICAgICAgICBjb25zdCBzZWFyY2ggPSB0aGlzLmZpbHRlclZhbHVlKCkudG9Mb3dlckNhc2UoKS50cmltKCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmZpbHRlcigpIHx8ICFzZWFyY2gpIHtcbiAgICAgICAgICAgIHJldHVybiBhbGxPcHRpb25zO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmlsdGVyQnkgPSB0aGlzLmZpbHRlckJ5KCk7XG4gICAgICAgIHJldHVybiBhbGxPcHRpb25zLmZpbHRlcigob3B0aW9uKSA9PiB7XG4gICAgICAgICAgICBpZiAob3B0aW9uLmdyb3VwZXIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBsYWJlbCA9ICcnO1xuXG4gICAgICAgICAgICBjb25zdCBvcHRpb25MYWJlbCA9IHRoaXMub3B0aW9uTGFiZWwoKTtcblxuICAgICAgICAgICAgaWYgKCFmaWx0ZXJCeSkge1xuICAgICAgICAgICAgICAgIGxhYmVsID0gb3B0aW9uTGFiZWwgPyBTdHJpbmcob3B0aW9uLmRhdGFbb3B0aW9uTGFiZWxdKSA6IFN0cmluZyhvcHRpb24uZGF0YSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZmlsdGVyQnkpKSB7XG4gICAgICAgICAgICAgICAgbGFiZWwgPSBmaWx0ZXJCeS5tYXAoKGJ5KSA9PiBTdHJpbmcob3B0aW9uLmRhdGFbYnldID8/ICcnKSkuam9pbignICcpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsYWJlbCA9IFN0cmluZyhvcHRpb24uZGF0YVtmaWx0ZXJCeV0gPz8gJycpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gbGFiZWwudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzZWFyY2gpO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIHB1YmxpYyByZWFkb25seSBmaWx0ZXJGb3JtID0gbmV3IEZvcm1Hcm91cDx7IGZpbHRlcjogRm9ybUNvbnRyb2w8c3RyaW5nPiB9Pih7XG4gICAgICAgIGZpbHRlcjogbmV3IEZvcm1Db250cm9sPHN0cmluZz4oJycsIHsgbm9uTnVsbGFibGU6IHRydWUgfSksXG4gICAgfSk7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jb250YWluZXJEaXYgPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD4+KCdjb250YWluZXJEaXYnKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9maWx0ZXJJbnB1dCA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+PignZmlsdGVySW5wdXQnKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9zZWxlY3RBbGxDaGVja2JveCA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPEhUTUxFbGVtZW50Pj4oJ3NlbGVjdEFsbENoZWNrYm94Jyk7XG4gICAgcHJpdmF0ZSBfb25DaGFuZ2U6ICh2YWx1ZTogYW55IHwgYW55W10gfCBudWxsKSA9PiB2b2lkID0gKCkgPT4ge307XG4gICAgcHJpdmF0ZSBfb25Ub3VjaGVkOiAoKSA9PiB2b2lkID0gKCkgPT4ge307XG5cbiAgICBwcml2YXRlIF9jbGlja2FibGVMYWJlbDogSFRNTExhYmVsRWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBfdHJhbnNsYXRlU2VydmljZSA9IGluamVjdChUcmFuc2xhdGVTZXJ2aWNlKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9ob3N0UmVmID0gaW5qZWN0PEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+PihFbGVtZW50UmVmKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9yZW5kZXJlciA9IGluamVjdChSZW5kZXJlcjIpO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuZmlsdGVyRm9ybVxuICAgICAgICAgICAgLmdldCgnZmlsdGVyJykhXG4gICAgICAgICAgICAudmFsdWVDaGFuZ2VzLnBpcGUoZGVib3VuY2VUaW1lKDMwMCksIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksIHRha2VVbnRpbERlc3Ryb3llZCgpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlclZhbHVlLnNldCh2YWx1ZSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAvLyBFZmVpdG8gcGFyYSB0ZW50YXIgYXBsaWNhciB2YWxvciBwZW5kZW50ZSBxdWFuZG8gb3B0aW9ucyBtdWRhclxuICAgICAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgb3B0cyA9IHRoaXMub3B0aW9ucygpO1xuICAgICAgICAgICAgaWYgKG9wdHMgJiYgb3B0cy5sZW5ndGggJiYgdGhpcy5fcGVuZGluZ1ZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fYXBwbHlQZW5kaW5nVmFsdWUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gTWFudMOpbSBvIGFyaWEtbGFiZWxsZWRieSByZXNvbHZpZG8gZW0gc2luY3JvbmlhIGNvbSBvIGlucHV0IGV4cGzDrWNpdG8uXG4gICAgICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBleHBsaWNpdExhYmVsbGVkQnkgPSB0aGlzLmFyaWFMYWJlbGxlZEJ5KCk7XG4gICAgICAgICAgICBpZiAoZXhwbGljaXRMYWJlbGxlZEJ5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXNvbHZlZEFyaWFMYWJlbGxlZEJ5LnNldChleHBsaWNpdExhYmVsbGVkQnkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3ZhbGlkYXRlSW5wdXRzKCk7XG4gICAgfVxuXG4gICAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fYXNzb2NpYXRlRXh0ZXJuYWxMYWJlbCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fY2xpY2thYmxlTGFiZWw/LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fb25MYWJlbENsaWNrKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWZpbmUgbyB2YWxvciBzZWxlY2lvbmFkbyBkbyBjb21wb25lbnRlIHNlbGVjdC5cbiAgICAgKiBAcGFyYW0gdmFsdWUgTyB2YWxvciBhIHNlciBkZWZpbmlkby4gUG9kZSBzZXIgdW0gb2JqZXRvIGRvIHRpcG8gYFRgLCB1bSBhcnJheSBkZSBgVGAgKHF1YW5kbyBtw7psdGlwbGEgc2VsZcOnw6NvIGVzdMOhIGhhYmlsaXRhZGEpLCBvdSBgbnVsbGAuXG4gICAgICogQHRocm93cyBTZSBvIG1vZG8gbcO6bHRpcGxvIGVzdGl2ZXIgYXRpdmFkbyBlIG8gdmFsb3IgbsOjbyBmb3IgdW0gYXJyYXksIGxhbsOnYSB1bSBlcnJvLlxuICAgICAqIEB0aHJvd3MgU2UgbyBtb2RvIG3Dumx0aXBsbyBlc3RpdmVyIGRlc2F0aXZhZG8gZSBvIHZhbG9yIGZvciB1bSBhcnJheSwgbGFuw6dhIHVtIGVycm8uXG4gICAgICogRXN0ZSBtw6l0b2RvIG1hcGVpYSBvKHMpIHZhbG9yKGVzKSBmb3JuZWNpZG8ocykgcGFyYSBhcyBvcMOnw7VlcyBpbnRlcm5hcyBkbyBjb21wb25lbnRlLFxuICAgICAqIGdhcmFudGluZG8gcXVlIGFwZW5hcyBvcMOnw7VlcyB2w6FsaWRhcyBzZWphbSBzZWxlY2lvbmFkYXMgY29uZm9ybWUgbyBtb2RvIGRlIHNlbGXDp8OjbyAow7puaWNvIG91IG3Dumx0aXBsbykuXG4gICAgICovXG4gICAgcHVibGljIHdyaXRlVmFsdWUodmFsdWU6IFQgfCBUW10gfCBudWxsKTogdm9pZCB7XG4gICAgICAgIC8vIEFybWF6ZW5hIHZhbG9yIHBlbmRlbnRlIGUgdGVudGEgYXBsaWNhclxuICAgICAgICB0aGlzLl9wZW5kaW5nVmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5fYXBwbHlQZW5kaW5nVmFsdWUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUZW50YSBhcGxpY2FyIG8gdmFsb3IgcGVuZGVudGUgKF9wZW5kaW5nVmFsdWUpIGFvIGVzdGFkbyBkbyBjb21wb25lbnRlLFxuICAgICAqIG1hcGVhbmRvIHBhcmEgSW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPiBjb25mb3JtZSBvcHRpb25zIGRpc3BvbsOtdmVpcy5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9hcHBseVBlbmRpbmdWYWx1ZSgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLl9wZW5kaW5nVmFsdWU7XG4gICAgICAgIGNvbnN0IG9wdHMgPSB0aGlzLmludGVybmFsT3B0aW9ucygpO1xuICAgICAgICBjb25zdCBvcHRpb25WYWx1ZSA9IHRoaXMub3B0aW9uVmFsdWUoKTtcblxuICAgICAgICBpZiAodmFsdWUgJiYgdGhpcy5tdWx0aXBsZSgpKSB7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtYXBwZWQgPSB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICAubWFwKCh2KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9uVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3B0cy5maW5kKChvcHQpID0+IG9wdC5kYXRhW29wdGlvblZhbHVlXSA9PT0gdikgfHwgbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wdHMuZmluZCgob3B0KSA9PiBKU09OLnN0cmluZ2lmeShvcHQuZGF0YSkgPT09IEpTT04uc3RyaW5naWZ5KHYpKSB8fCBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKChvcHQpOiBvcHQgaXMgSW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPiA9PiAhIW9wdCk7XG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZXMuc2V0KG1hcHBlZCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMudmFsdWVzLnNldChbXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgbWFwcGVkOiBJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+IHwgbnVsbCA9IG51bGw7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBtYXBwZWQgPSBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChvcHRpb25WYWx1ZSAmJiB2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29tcGFyZVZhbHVlID1cbiAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiBvcHRpb25WYWx1ZSBpbiB2YWx1ZSA/IHZhbHVlW29wdGlvblZhbHVlXSA6IHZhbHVlO1xuICAgICAgICAgICAgICAgIG1hcHBlZCA9IG9wdHMuZmluZCgob3B0KSA9PiBvcHQuZGF0YVtvcHRpb25WYWx1ZV0gPT09IGNvbXBhcmVWYWx1ZSkgfHwgbnVsbDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIG1hcHBlZCA9IG9wdHMuZmluZCgob3B0KSA9PiBKU09OLnN0cmluZ2lmeShvcHQuZGF0YSkgPT09IEpTT04uc3RyaW5naWZ5KHZhbHVlKSkgfHwgbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMudmFsdWUuc2V0KG1hcHBlZCA/PyBudWxsKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9wZW5kaW5nVmFsdWUgPSBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlZ2lzdHJhIHVtYSBmdW7Dp8OjbyBkZSBjYWxsYmFjayBxdWUgc2Vyw6EgY2hhbWFkYSBzZW1wcmUgcXVlIG8gdmFsb3IgZG8gY29tcG9uZW50ZSBtdWRhci5cbiAgICAgKiBAcGFyYW0gb25DaGFuZ2UgRnVuw6fDo28gZGUgY2FsbGJhY2sgcXVlIHJlY2ViZSBvIG5vdm8gdmFsb3Igc2VsZWNpb25hZG8gb3UgbnVsbC5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShvbkNoYW5nZTogKHZhbHVlOiBUIHwgVFtdIHwgbnVsbCkgPT4gdm9pZCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9vbkNoYW5nZSA9IG9uQ2hhbmdlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlZ2lzdHJhIHVtYSBmdW7Dp8OjbyBkZSBjYWxsYmFjayBxdWUgc2Vyw6EgY2hhbWFkYSBxdWFuZG8gbyBjb21wb25lbnRlIGZvciB0b2NhZG8gKHBlcmRlciBvIGZvY28pLlxuICAgICAqIEBwYXJhbSBvblRvdWNoZWQgRnVuw6fDo28gZGUgY2FsbGJhY2sgYSBzZXIgZXhlY3V0YWRhIHF1YW5kbyBvIGNvbXBvbmVudGUgZm9yIG1hcmNhZG8gY29tbyBcInRvY2Fkb1wiLlxuICAgICAqL1xuICAgIHB1YmxpYyByZWdpc3Rlck9uVG91Y2hlZChvblRvdWNoZWQ6ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fb25Ub3VjaGVkID0gb25Ub3VjaGVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlZmluZSBvIGVzdGFkbyBkZSBkZXNhYmlsaXRhZG8gZG8gY29tcG9uZW50ZS5cbiAgICAgKiBAcGFyYW0gZGlzYWJsZWQgSW5kaWNhIHNlIG8gY29tcG9uZW50ZSBkZXZlIHNlciBkZXNhYmlsaXRhZG8gKGB0cnVlYCkgb3UgaGFiaWxpdGFkbyAoYGZhbHNlYCkuXG4gICAgICovXG4gICAgcHVibGljIHNldERpc2FibGVkU3RhdGUoZGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kaXNhYmxlZC5zZXQoZGlzYWJsZWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFsdGVybmEgYSBleGliacOnw6NvIGRhcyBvcMOnw7VlcyBkbyBjb21wb25lbnRlIHNlbGVjdC5cbiAgICAgKiBTZSBvIGNvbXBvbmVudGUgZXN0aXZlciBkZXNhYmlsaXRhZG8sIG7Do28gcmVhbGl6YSBuZW5odW1hIGHDp8Ojby5cbiAgICAgKiBDYXNvIGNvbnRyw6FyaW8sIGludmVydGUgbyBlc3RhZG8gZGUgZXhpYmnDp8OjbyBkYXMgb3DDp8O1ZXMuXG4gICAgICogQW8gYWJyaXIsIG1vdmUgbyBmb2NvIHBhcmEgbyBpdGVtIGF0dWFsbWVudGUgc2VsZWNpb25hZG8uXG4gICAgICovXG4gICAgcHVibGljIHRvZ2dsZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2hvdWxkT3BlbiA9ICF0aGlzLnNob3dPcHRpb25zKCk7XG4gICAgICAgIHRoaXMuaXNPcGVuID0gc2hvdWxkT3BlbjtcbiAgICAgICAgdGhpcy5zaG93T3B0aW9ucy5zZXQoc2hvdWxkT3Blbik7XG5cbiAgICAgICAgaWYgKHNob3VsZE9wZW4pIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmZpbHRlcigpKSB7XG4gICAgICAgICAgICAgICAgLy8gUXVhbmRvIGjDoSBmaWx0cm8gY29tIG3Dumx0aXBsYSBzZWxlw6fDo28sIGZvY28gdmFpIHBhcmEgbyBjaGVja2JveCBwcmltZWlybztcbiAgICAgICAgICAgICAgICAvLyBjYXNvIGNvbnRyw6FyaW8sIHZhaSBkaXJldG8gcGFyYSBvIGlucHV0IGRlIGZpbHRyby5cbiAgICAgICAgICAgICAgICAvLyBPIGZvY28gw6kgbW92aWRvIGFww7NzIGEgcmVuZGVyaXphw6fDo28gZG8gb3ZlcmxheS5cbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hlY2tib3hIb3N0ID0gdGhpcy5fc2VsZWN0QWxsQ2hlY2tib3goKT8ubmF0aXZlRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvY3VzYWJsZSA9IGNoZWNrYm94SG9zdD8ucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oJ1t0YWJpbmRleF0nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvY3VzYWJsZT8uZm9jdXMoKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2ZpbHRlcklucHV0KCk/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9mb2N1c1NlbGVjdGVkT3B0aW9uKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZWxlY2lvbmEgdW0gaXRlbSBubyBjb21wb25lbnRlIGRlIHNlbGXDp8Ojby5cbiAgICAgKiBAcGFyYW0gaXRlbSBPIGl0ZW0gYSBzZXIgc2VsZWNpb25hZG8gb3UgZGVzbWFyY2Fkby5cbiAgICAgKiBTZSBvIGNvbXBvbmVudGUgZXN0aXZlciBkZXNhYmlsaXRhZG8sIGEgZnVuw6fDo28gcmV0b3JuYSBpbWVkaWF0YW1lbnRlLlxuICAgICAqIE5vIG1vZG8gbcO6bHRpcGxvLCBhZGljaW9uYSBvdSByZW1vdmUgbyBpdGVtIGRhIGxpc3RhIGRlIHZhbG9yZXMgc2VsZWNpb25hZG9zLlxuICAgICAqIE5vIG1vZG8gc2ltcGxlcywgZGVmaW5lIG8gaXRlbSBjb21vIHZhbG9yIHNlbGVjaW9uYWRvIGUgZmVjaGEgbyBkcm9wZG93bi5cbiAgICAgKiBTZW1wcmUgbm90aWZpY2EgYXMgbXVkYW7Dp2FzIGUgbWFyY2EgbyBjb21wb25lbnRlIGNvbW8gdG9jYWRvLlxuICAgICAqL1xuICAgIHB1YmxpYyBzZWxlY3RJdGVtKGl0ZW06IEludGVybmFsRHJvcGRvd25PcHRpb248VD4pOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgb3B0aW9uVmFsdWUgPSB0aGlzLm9wdGlvblZhbHVlKCk7XG5cbiAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUoKSkge1xuICAgICAgICAgICAgY29uc3Qgc3RvcmUgPSBbLi4udGhpcy52YWx1ZXMoKV07XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHN0b3JlLmZpbmRJbmRleCgoc2VsZWN0ZWRJdGVtKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkSXRlbSA9PT0gaXRlbTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgc3RvcmUuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc3RvcmUucHVzaChpdGVtKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy52YWx1ZXMuc2V0KHN0b3JlKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9wdGlvblZhbHVlID8gc3RvcmUubWFwKChpdGVtKSA9PiBpdGVtLmRhdGFbb3B0aW9uVmFsdWVdKSA6IHN0b3JlO1xuICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UocmVzdWx0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUuc2V0KGl0ZW0pO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gb3B0aW9uVmFsdWUgPyBpdGVtLmRhdGFbb3B0aW9uVmFsdWVdIDogaXRlbS5kYXRhO1xuICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UocmVzdWx0KTtcbiAgICAgICAgICAgIHRoaXMuX2Nsb3NlRHJvcGRvd24oKTtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lckRpdigpPy5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9vblRvdWNoZWQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMaW1wYSBvIHZhbG9yIHNlbGVjaW9uYWRvIG5vIGNvbXBvbmVudGUgc2VsZWN0LlxuICAgICAqIFNlIG8gY29tcG9uZW50ZSBlc3RpdmVyIGRlc2FiaWxpdGFkbywgbsOjbyBleGVjdXRhIG5lbmh1bWEgYcOnw6NvLlxuICAgICAqIFBhcmEgc2VsZcOnw6NvIG3Dumx0aXBsYSwgcmVtb3ZlIHRvZG9zIG9zIHZhbG9yZXMgc2VsZWNpb25hZG9zIGUgbm90aWZpY2EgYSBhbHRlcmHDp8Ojby5cbiAgICAgKiBQYXJhIHNlbGXDp8OjbyDDum5pY2EsIGRlZmluZSBvIHZhbG9yIGNvbW8gbnVsbyBlIG5vdGlmaWNhIGEgYWx0ZXJhw6fDo28uXG4gICAgICogRmVjaGEgbyBkcm9wZG93biBlIG1hcmNhIG8gY29tcG9uZW50ZSBjb21vIFwidG9jYWRvXCIuXG4gICAgICogSW1wZWRlIGEgcHJvcGFnYcOnw6NvIGRvIGV2ZW50byBkbyBtb3VzZS5cbiAgICAgKiBAcGFyYW0gZXZlbnQgRXZlbnRvIGRvIG1vdXNlIHF1ZSBhY2lvbm91IGEgbGltcGV6YSBkYSBzZWxlw6fDo28uXG4gICAgICovXG4gICAgcHVibGljIGNsZWFyKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm11bHRpcGxlKCkpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWVzLnNldChbXSk7XG4gICAgICAgICAgICB0aGlzLl9vbkNoYW5nZSh0aGlzLnZhbHVlcygpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUuc2V0KG51bGwpO1xuICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UodGhpcy52YWx1ZSgpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2Nsb3NlRHJvcGRvd24oKTtcblxuICAgICAgICB0aGlzLl9vblRvdWNoZWQoKTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGltcGEgbyBmaWx0cm8gZG8gZm9ybXVsw6FyaW8sIHJlc2V0YW5kbyBvIGNhbXBvICdmaWx0ZXInIGRvIGZvcm11bMOhcmlvIGRlIGZpbHRyby5cbiAgICAgKiBFc3RlIG3DqXRvZG8gcmVkZWZpbmUgbyB2YWxvciBkbyBjYW1wbyAnZmlsdGVyJyBwYXJhIHNldSBlc3RhZG8gaW5pY2lhbCxcbiAgICAgKiByZW1vdmVuZG8gcXVhbHF1ZXIgdGV4dG8gb3UgdmFsb3IgcHJldmlhbWVudGUgaW5zZXJpZG8gcGVsbyB1c3XDoXJpby5cbiAgICAgKi9cbiAgICBwdWJsaWMgY2xlYXJGaWx0ZXIoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZmlsdGVyRm9ybS5nZXQoJ2ZpbHRlcicpPy5yZXNldCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1hbmlwdWxhIG8gZXZlbnRvIGRlIHJlZGltZW5zaW9uYW1lbnRvIGRhIGphbmVsYS5cbiAgICAgKiBGZWNoYSBvIGRyb3Bkb3duIGRlIG9ww6fDtWVzIGNhc28gZWxlIGVzdGVqYSB2aXPDrXZlbCBhbyByZWRpbWVuc2lvbmFyIGEgamFuZWxhLlxuICAgICAqIEBwYXJhbSBfIEV2ZW50byBkZSByZWRpbWVuc2lvbmFtZW50byBkYSBqYW5lbGEgKG7Do28gdXRpbGl6YWRvKS5cbiAgICAgKi9cbiAgICBwdWJsaWMgb25XaW5kb3dSZXNpemUoXzogRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuc2hvd09wdGlvbnMoKSkge1xuICAgICAgICAgICAgdGhpcy5fY2xvc2VEcm9wZG93bigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWFuaXB1bGEgbyBldmVudG8gZGUgY2xpcXVlIG5vIGVsZW1lbnRvIGNvbnRhaW5lciBkYSBzZWxlw6fDo28uXG4gICAgICogRXN0ZSBtw6l0b2RvIGFsdGVybmEgbyBlc3RhZG8gZGUgZXhpYmnDp8OjbyBkbyBjb21wb25lbnRlIHNlbGVjdCBlLFxuICAgICAqIGVtIHNlZ3VpZGEsIGRlZmluZSBvIGZvY28gbm8gZWxlbWVudG8gY29udGFpbmVyIGNvcnJlc3BvbmRlbnRlLlxuICAgICAqL1xuICAgIHB1YmxpYyBvbkNvbnRhaW5lckRpdkNsaWNrKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnRvZ2dsZSgpO1xuICAgICAgICB0aGlzLl9jb250YWluZXJEaXYoKT8ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1hbmlwdWxhIGV2ZW50b3MgZGUgdGVjbGFkbyBubyBpbnB1dCBkZSBmaWx0cm8gZG8gb3ZlcmxheS5cbiAgICAgKiAtICdBcnJvd0Rvd24nOiBNb3ZlIG8gZm9jbyBwYXJhIGEgcHJpbWVpcmEgb3DDp8OjbyBkYSBsaXN0YS5cbiAgICAgKiAtICdBcnJvd1VwJzogTW92ZSBvIGZvY28gcGFyYSBhIMO6bHRpbWEgb3DDp8OjbyBkYSBsaXN0YS5cbiAgICAgKiAtICdFc2NhcGUnOiBGZWNoYSBvIGRyb3Bkb3duIGUgcmV0b3JuYSBvIGZvY28gYW8gY29tYm9ib3guXG4gICAgICogLSAnRW50ZXInOiBTZWxlY2lvbmEgYSBvcMOnw6NvIGZvY2FkYSwgc2UgaG91dmVyLlxuICAgICAqIEBwYXJhbSBldmVudCBPIGV2ZW50byBkZSB0ZWNsYWRvIGRpc3BhcmFkbyBubyBpbnB1dCBkZSBmaWx0cm8uXG4gICAgICovXG4gICAgcHVibGljIG9uRmlsdGVyS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5maWx0ZXJlZE9wdGlvbnMoKTtcblxuICAgICAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xuICAgICAgICAgICAgY2FzZSAnQXJyb3dEb3duJzpcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2ZvY3VzTmV4dE9wdGlvbihvcHRpb25zKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0Fycm93VXAnOlxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5mb2N1c2VkSW5kZXgoKSA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5lbmh1bSBpdGVtIGZvY2FkbzogZm9jYSBvIMO6bHRpbW8gZGlzcG9uw612ZWxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsYXN0SW5kZXggPSBvcHRpb25zLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAobGFzdEluZGV4ID49IDAgJiYgb3B0aW9uc1tsYXN0SW5kZXhdLmdyb3VwZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0SW5kZXgtLTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYXN0SW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9jdXNlZEluZGV4LnNldChsYXN0SW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Njcm9sbFRvRm9jdXNlZE9wdGlvbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZm9jdXNQcmV2aW91c09wdGlvbihvcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0VzY2FwZSc6XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9jbG9zZURyb3Bkb3duKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyRGl2KCk/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0VudGVyJzpcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5mb2N1c2VkSW5kZXgoKSA+PSAwICYmIHRoaXMuZm9jdXNlZEluZGV4KCkgPCBvcHRpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdEl0ZW0ob3B0aW9uc1t0aGlzLmZvY3VzZWRJbmRleCgpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWFuaXB1bGEgZXZlbnRvcyBkZSB0ZWNsYWRvIHBhcmEgbmF2ZWdhw6fDo28gZSBzZWxlw6fDo28gZGUgb3DDp8O1ZXMgbm8gY29tcG9uZW50ZSBzZWxlY3QuXG4gICAgICogLSAnQXJyb3dEb3duJzogTW92ZSBvIGZvY28gcGFyYSBhIHByw7N4aW1hIG9ww6fDo28gZGlzcG9uw612ZWwuXG4gICAgICogLSAnQXJyb3dVcCc6IE1vdmUgbyBmb2NvIHBhcmEgYSBvcMOnw6NvIGFudGVyaW9yLlxuICAgICAqIC0gJ1RhYic6IFNlbGVjaW9uYSBhIG9ww6fDo28gYXR1YWxtZW50ZSBmb2NhZGEgZSBmZWNoYSBvIGRyb3Bkb3duLlxuICAgICAqIC0gJ0VudGVyJzogU2VsZWNpb25hIGEgb3DDp8OjbyBmb2NhZGEgc2UgbyBkcm9wZG93biBlc3RpdmVyIGFiZXJ0bywgb3UgYWx0ZXJuYSBhIGFiZXJ0dXJhIGRvIGRyb3Bkb3duLlxuICAgICAqIC0gJ0VzY2FwZSc6IEZlY2hhIG8gZHJvcGRvd24uXG4gICAgICogLSAnICc6IChiYXJyYSBkZSBlc3Bhw6dvKSBTZWxlY2lvbmEgYSBvcMOnw6NvIGZvY2FkYSBzZSBvIGRyb3Bkb3duIGVzdGl2ZXIgYWJlcnRvLCBvdSBhbHRlcm5hIGEgYWJlcnR1cmEgZG8gZHJvcGRvd24uXG4gICAgICogUHJldmluZSBvIGNvbXBvcnRhbWVudG8gcGFkcsOjbyBkbyBuYXZlZ2Fkb3IgcXVhbmRvIG5lY2Vzc8OhcmlvIHBhcmEgZ2FyYW50aXIgYSBuYXZlZ2HDp8OjbyBhZGVxdWFkYSBwZWxvIHRlY2xhZG8uXG4gICAgICogQHBhcmFtIGV2ZW50IE8gZXZlbnRvIGRlIHRlY2xhZG8gZGlzcGFyYWRvIHBlbG8gdXN1w6FyaW8uXG4gICAgICovXG4gICAgcHVibGljIG9uS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5maWx0ZXJlZE9wdGlvbnMoKTtcblxuICAgICAgICBpZiAoIW9wdGlvbnMubGVuZ3RoICYmIGV2ZW50LmtleSAhPT0gJ0VzY2FwZScgJiYgZXZlbnQua2V5ICE9PSAnRW50ZXInICYmIGV2ZW50LmtleSAhPT0gJyAnKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBfc2VsZWN0T3B0aW9uID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuZm9jdXNlZEluZGV4KCkgPj0gMCAmJiB0aGlzLmZvY3VzZWRJbmRleCgpIDwgb3B0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0SXRlbShvcHRpb25zW3RoaXMuZm9jdXNlZEluZGV4KCldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xuICAgICAgICAgICAgY2FzZSAnQXJyb3dEb3duJzpcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5zaG93T3B0aW9ucygpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9nZ2xlKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZm9jdXNOZXh0T3B0aW9uKG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0Fycm93VXAnOlxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2hvd09wdGlvbnMoKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9mb2N1c1ByZXZpb3VzT3B0aW9uKG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ1RhYic6XG4gICAgICAgICAgICAgICAgLy8gUXVhbmRvIGjDoSBmaWx0cm8gYWJlcnRvLCBUYWIgZGV2ZSBuYXZlZ2FyIHBhcmEgZGVudHJvIGRvIG92ZXJsYXkgKG7Do28gZmVjaGFyKVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNob3dPcHRpb25zKCkgJiYgdGhpcy5maWx0ZXIoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF9zZWxlY3RPcHRpb24oKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9jbG9zZURyb3Bkb3duKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdFbnRlcic6XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2hvd09wdGlvbnMoKSkge1xuICAgICAgICAgICAgICAgICAgICBfc2VsZWN0T3B0aW9uKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b2dnbGUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdFc2NhcGUnOlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNob3dPcHRpb25zKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX2Nsb3NlRHJvcGRvd24oKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJyAnOlxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2hvd09wdGlvbnMoKSkge1xuICAgICAgICAgICAgICAgICAgICBfc2VsZWN0T3B0aW9uKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b2dnbGUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXRvcm5hIG8gcsOzdHVsbyAobGFiZWwpIGFzc29jaWFkbyBhIHVtYSBvcMOnw6NvIGZvcm5lY2lkYS5cbiAgICAgKiBAcGFyYW0gb3B0aW9uIC0gQSBvcMOnw6NvIGRvIHRpcG8gVCBwYXJhIGEgcXVhbCBvIHLDs3R1bG8gZGV2ZSBzZXIgb2J0aWRvLlxuICAgICAqIEByZXR1cm5zIE8gcsOzdHVsbyBkYSBvcMOnw6NvIGNvbW8gdW1hIHN0cmluZy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0T3B0aW9uTGFiZWwob3B0aW9uOiBUKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldExhYmVsRnJvbU9wdGlvbihvcHRpb24pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZ1bsOnw6NvIGRlIHRyYWNrQnkgdXRpbGl6YWRhIGVtIGRpcmV0aXZhcyAqbmdGb3IgcGFyYSBvdGltaXphciBhIHJlbmRlcml6YcOnw6NvIGRlIGxpc3Rhcy5cbiAgICAgKiBSZXRvcm5hIG8gaWRlbnRpZmljYWRvciDDum5pY28gKGBpZGApIGRlIGNhZGEgaXRlbSBkbyB0aXBvIGBJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+YC5cbiAgICAgKiBAcGFyYW0gXyAtIMONbmRpY2UgZG8gaXRlbSBuYSBsaXN0YSAobsOjbyB1dGlsaXphZG8pLlxuICAgICAqIEBwYXJhbSBpdGVtIC0gTyBpdGVtIGF0dWFsIGRhIGxpc3RhIGRvIHRpcG8gYEludGVybmFsRHJvcGRvd25PcHRpb248VD5gLlxuICAgICAqIEByZXR1cm5zIE8gaWRlbnRpZmljYWRvciDDum5pY28gZG8gaXRlbSBjb21vIHVtYSBzdHJpbmcuXG4gICAgICovXG4gICAgcHVibGljIHRyYWNrQnlJZChfOiBudW1iZXIsIGl0ZW06IEludGVybmFsRHJvcGRvd25PcHRpb248VD4pOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gaXRlbS5pZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBWZXJpZmljYSBzZSBhIG9ww6fDo28gZm9ybmVjaWRhIGVzdMOhIHNlbGVjaW9uYWRhLlxuICAgICAqIEBwYXJhbSBvcHRpb24gLSBBIG9ww6fDo28gaW50ZXJuYSBkbyBkcm9wZG93biBhIHNlciB2ZXJpZmljYWRhLlxuICAgICAqIEByZXR1cm5zIGB0cnVlYCBzZSBhIG9ww6fDo28gZXN0aXZlciBzZWxlY2lvbmFkYSwgY2FzbyBjb250csOhcmlvIGBmYWxzZWAuXG4gICAgICovXG4gICAgcHVibGljIGlzT3B0aW9uU2VsZWN0ZWQob3B0aW9uOiBJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICB0aGlzLnZhbHVlcygpLmZpbmQoKG8pID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbyA9PT0gb3B0aW9uO1xuICAgICAgICAgICAgfSkgIT09IHVuZGVmaW5lZFxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFsdGVybmEgYSBzZWxlw6fDo28gZGUgdG9kb3Mgb3MgaXRlbnMgZGlzcG9uw612ZWlzLlxuICAgICAqIFNlIG8gbW9kbyBtw7psdGlwbG8gZXN0aXZlciBhdGl2YWRvLCBzZWxlY2lvbmEgdG9kb3Mgb3MgaXRlbnMgZmlsdHJhZG9zIHF1ZSBuw6NvIHPDo28gYWdydXBhZG9yZXNcbiAgICAgKiBjYXNvIG5lbSB0b2RvcyBlc3RlamFtIHNlbGVjaW9uYWRvcywgb3UgbGltcGEgYSBzZWxlw6fDo28gY2FzbyB0b2RvcyBqw6EgZXN0ZWphbSBzZWxlY2lvbmFkb3MuXG4gICAgICogQXDDs3MgYSBhbHRlcmHDp8Ojbywgbm90aWZpY2EgYSBtdWRhbsOnYSBkZSB2YWxvci5cbiAgICAgKi9cbiAgICBwdWJsaWMgdG9nZ2xlU2VsZWN0QWxsKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMubXVsdGlwbGUoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuZmlsdGVyZWRPcHRpb25zKCkuZmlsdGVyKChvcHRpb24pID0+ICFvcHRpb24uZ3JvdXBlcik7XG5cbiAgICAgICAgaWYgKHRoaXMuYWxsU2VsZWN0ZWQoKSkge1xuICAgICAgICAgICAgdGhpcy52YWx1ZXMuc2V0KFtdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWVzLnNldChvcHRpb25zKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX29uQ2hhbmdlKHRoaXMudmFsdWVzKCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldG9ybmEgbyByw7N0dWxvIChsYWJlbCkgZGUgdW1hIG9ww6fDo28gZm9ybmVjaWRhLlxuICAgICAqIEVzdGUgbcOpdG9kbyB1dGlsaXphIGEgcHJvcHJpZWRhZGUgZGVmaW5pZGEgcG9yIGBvcHRpb25MYWJlbGAgcGFyYSBleHRyYWlyIG8gdmFsb3IgZG8gcsOzdHVsbyBkYSBvcMOnw6NvLlxuICAgICAqIENhc28gYG9wdGlvbkxhYmVsYCBuw6NvIGVzdGVqYSBkZWZpbmlkbywgcmV0b3JuYSBhIHJlcHJlc2VudGHDp8OjbyBlbSBzdHJpbmcgZGEgcHLDs3ByaWEgb3DDp8Ojby5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSBvcHRpb24gQSBvcMOnw6NvIGRhIHF1YWwgbyByw7N0dWxvIHNlcsOhIGV4dHJhw61kby5cbiAgICAgKiBAcmV0dXJucyBPIHLDs3R1bG8gZGEgb3DDp8OjbyBjb21vIHVtYSBzdHJpbmcuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfZ2V0TGFiZWxGcm9tT3B0aW9uKG9wdGlvbjogVCk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IG9wdGlvbkxhYmVsID0gdGhpcy5vcHRpb25MYWJlbCgpO1xuICAgICAgICByZXR1cm4gb3B0aW9uTGFiZWwgPyBTdHJpbmcob3B0aW9uW29wdGlvbkxhYmVsXSkgOiBTdHJpbmcob3B0aW9uKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBWYWxpZGEgYXMgZW50cmFkYXMgZG8gY29tcG9uZW50ZSBkZSBzZWxlw6fDo28uXG4gICAgICogRXN0ZSBtw6l0b2RvIHZlcmlmaWNhIHNlIGFzIG9ww6fDtWVzIGZvcm5lY2lkYXMgc8OjbyB2w6FsaWRhcy4gQ2FzbyBhcyBvcMOnw7VlcyBzZWphbSBvYmpldG9zLFxuICAgICAqIGdhcmFudGUgcXVlIGEgcHJvcHJpZWRhZGUgYG9wdGlvbkxhYmVsYCBlc3RlamEgZGVmaW5pZGEsIGxhbsOnYW5kbyB1bSBlcnJvIGNhc28gY29udHLDoXJpby5cbiAgICAgKiBTZSBuw6NvIGhvdXZlciBvcMOnw7VlcywgYSB2YWxpZGHDp8OjbyDDqSBpZ25vcmFkYS5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSBTZSBhcyBvcMOnw7VlcyBmb3JlbSBvYmpldG9zIGUgYG9wdGlvbkxhYmVsYCBuw6NvIGVzdGl2ZXIgZGVmaW5pZG8uXG4gICAgICovXG4gICAgcHJpdmF0ZSBfdmFsaWRhdGVJbnB1dHMoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMoKTtcblxuICAgICAgICBpZiAoIW9wdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBoYXNPYmplY3RPcHRpb25zID0gb3B0aW9ucy5zb21lKChvcHRpb24pID0+IHR5cGVvZiBvcHRpb24gPT09ICdvYmplY3QnICYmIG9wdGlvbiAhPT0gbnVsbCk7XG5cbiAgICAgICAgaWYgKGhhc09iamVjdE9wdGlvbnMpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25MYWJlbCgpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgXCJvcHRpb25MYWJlbFwiIGlucHV0IGlzIHJlcXVpcmVkIHdoZW4gb3B0aW9ucyBhcmUgb2JqZWN0cy4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFzc29jaWEgdW0gYDxsYWJlbCBmb3I9XCIuLi5cIj5gIGV4dGVybm8gKHF1ZSBhcG9udGEgcGFyYSBvIGBpZGAgZG8gaG9zdCkgYW9cbiAgICAgKiBjb21ib2JveCBpbnRlcm5vLCByZXNvbHZlbmRvIG8gcHJvYmxlbWEgZGUgXCJvcnBoYW5lZCBsYWJlbFwiLlxuICAgICAqXG4gICAgICogQ29tbyBvIGhvc3QgYHMtc2VsZWN0YCBuw6NvIMOpIHVtIGVsZW1lbnRvIHJvdHVsw6F2ZWwgKGxhYmVsYWJsZSksIG8gYGZvcmAgbsOjb1xuICAgICAqIGNyaWEgdsOtbmN1bG8gcHJvZ3JhbcOhdGljby4gRXN0ZSBtw6l0b2RvOlxuICAgICAqIC0gbG9jYWxpemEgbyBsYWJlbCBxdWUgcmVmZXJlbmNpYSBvIGBpZGAgZG8gaG9zdDtcbiAgICAgKiAtIGdhcmFudGUgcXVlIGVzc2UgbGFiZWwgdGVuaGEgdW0gYGlkYDtcbiAgICAgKiAtIGFwb250YSBvIGBhcmlhLWxhYmVsbGVkYnlgIGRvIGNvbWJvYm94IHBhcmEgZXNzZSBsYWJlbDtcbiAgICAgKiAtIGFkaWNpb25hIHVtIGNsaXF1ZSBubyBsYWJlbCBwYXJhIGZvY2FyIG8gY29tYm9ib3ggKGVxdWl2YWxlbnRlIGFvIGBmb3JgKS5cbiAgICAgKlxuICAgICAqIE7Do28gc29icmVzY3JldmUgdW0gYGFyaWFMYWJlbGxlZEJ5YCBleHBsw61jaXRvIGluZm9ybWFkbyBwZWxvIGNvbnN1bWlkb3IuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIF9hc3NvY2lhdGVFeHRlcm5hbExhYmVsKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5hcmlhTGFiZWxsZWRCeSgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBob3N0SWQgPSB0aGlzLl9ob3N0UmVmLm5hdGl2ZUVsZW1lbnQuaWQ7XG4gICAgICAgIGlmICghaG9zdElkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsYWJlbCA9IHRoaXMuX2ZpbmRMYWJlbEZvcihob3N0SWQpO1xuICAgICAgICBpZiAoIWxhYmVsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWxhYmVsLmlkKSB7XG4gICAgICAgICAgICB0aGlzLl9yZW5kZXJlci5zZXRBdHRyaWJ1dGUobGFiZWwsICdpZCcsIGAke3RoaXMuY29tcG9uZW50SWR9LWxhYmVsYCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlc29sdmVkQXJpYUxhYmVsbGVkQnkuc2V0KGxhYmVsLmlkKTtcblxuICAgICAgICAvLyBPIGF0cmlidXRvIGBmb3JgIG7Do28gZnVuY2lvbmEgZW0gaG9zdCBuw6NvLXJvdHVsw6F2ZWwsIGVudMOjbyByZXBsaWNhbW9zXG4gICAgICAgIC8vIG8gY29tcG9ydGFtZW50byBkZSBcImNsaWNhciBubyBsYWJlbCBmb2NhIG8gY29udHJvbGVcIiBtYW51YWxtZW50ZS5cbiAgICAgICAgdGhpcy5fY2xpY2thYmxlTGFiZWwgPSBsYWJlbDtcbiAgICAgICAgbGFiZWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9vbkxhYmVsQ2xpY2spO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvY2FsaXphIG8gYDxsYWJlbD5gIGN1am8gYXRyaWJ1dG8gYGZvcmAgY29ycmVzcG9uZGUgYW8gaWQgaW5mb3JtYWRvLlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIGhvc3RJZCBJZCBkbyBob3N0IHJlZmVyZW5jaWFkbyBwZWxvIGxhYmVsLlxuICAgICAqIEByZXR1cm5zIE8gZWxlbWVudG8gbGFiZWwgY29ycmVzcG9uZGVudGUgb3UgYG51bGxgLlxuICAgICAqL1xuICAgIHByaXZhdGUgX2ZpbmRMYWJlbEZvcihob3N0SWQ6IHN0cmluZyk6IEhUTUxMYWJlbEVsZW1lbnQgfCBudWxsIHtcbiAgICAgICAgY29uc3QgbGFiZWxzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbDxIVE1MTGFiZWxFbGVtZW50PignbGFiZWxbZm9yXScpO1xuICAgICAgICBmb3IgKGNvbnN0IGxhYmVsIG9mIEFycmF5LmZyb20obGFiZWxzKSkge1xuICAgICAgICAgICAgaWYgKGxhYmVsLmdldEF0dHJpYnV0ZSgnZm9yJykgPT09IGhvc3RJZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBsYWJlbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNb3ZlIG8gZm9jbyBwYXJhIG8gY29tYm9ib3ggaW50ZXJubyBhbyBjbGljYXIgbm8gbGFiZWwgZXh0ZXJubyBhc3NvY2lhZG8uXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9vbkxhYmVsQ2xpY2sgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jb250YWluZXJEaXYoKT8ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBGZWNoYSBvIGRyb3Bkb3duIGRlIG9ww6fDtWVzIGRvIGNvbXBvbmVudGUgc2VsZWN0LlxuICAgICAqIEVzdGUgbcOpdG9kbyBvY3VsdGEgYXMgb3DDp8O1ZXMgZGlzcG9uw612ZWlzIGUgcmVkZWZpbmUgbyDDrW5kaWNlIGRvIGl0ZW0gZm9jYWRvIHBhcmEgLTEsXG4gICAgICogaW5kaWNhbmRvIHF1ZSBuZW5odW0gaXRlbSBlc3TDoSBhdHVhbG1lbnRlIGZvY2Fkby5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgX2Nsb3NlRHJvcGRvd24oKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2hvd09wdGlvbnMuc2V0KGZhbHNlKTtcbiAgICAgICAgdGhpcy5mb2N1c2VkSW5kZXguc2V0KC0xKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGljaW9uYSB1bSBpZGVudGlmaWNhZG9yIMO6bmljbyBhIGNhZGEgb3DDp8OjbyBmb3JuZWNpZGEuXG4gICAgICogUGFyYSBjYWRhIGl0ZW0gbm8gYXJyYXkgZGUgb3DDp8O1ZXMsIGdlcmEgdW0gb2JqZXRvIGBJbnRlcm5hbERyb3Bkb3duT3B0aW9uYCBjb250ZW5kbyBvIGRhZG8gb3JpZ2luYWxcbiAgICAgKiBlIHVtIGNhbXBvIGBpZGAgw7puaWNvIGJhc2VhZG8gbm8gdGltZXN0YW1wIGF0dWFsIGUgbm8gw61uZGljZSBkbyBpdGVtLiBDYXNvIGEgb3DDp8OjbyBzZWphIHVtIGdydXBvXG4gICAgICogKGRldGVjdGFkbyBwZWxhIHByZXNlbsOnYSBkZSB1bSBhcnJheSBgaXRlbXNgKSwgYWRpY2lvbmEgdGFtYsOpbSBhIHByb3ByaWVkYWRlIGBncm91cGVyOiB0cnVlYC5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSBvcHRpb25zIEFycmF5IGRlIG9ww6fDtWVzIGRvIHRpcG8gYFRgIGEgc2VyZW0gcHJvY2Vzc2FkYXMuXG4gICAgICogQHJldHVybnMgVW0gYXJyYXkgZGUgb2JqZXRvcyBgSW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPmAgY29tIGlkZW50aWZpY2Fkb3JlcyDDum5pY29zLlxuICAgICAqL1xuICAgIHByaXZhdGUgX2FkZElkVG9PcHRpb25zKG9wdGlvbnM6IFRbXSk6IEludGVybmFsRHJvcGRvd25PcHRpb248VD5bXSB7XG4gICAgICAgIGNvbnN0IHRpbWVzdGFtcCA9IERhdGUubm93KCk7XG5cbiAgICAgICAgcmV0dXJuIG9wdGlvbnMubWFwKChvcHRpb24sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5ncm91cCgpICYmIEFycmF5LmlzQXJyYXkoKG9wdGlvbiBhcyBhbnkpLml0ZW1zKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IG9wdGlvbixcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGBpZF8ke3RpbWVzdGFtcH1fJHtpbmRleCsrfWAsXG4gICAgICAgICAgICAgICAgICAgIGdyb3VwZXI6IHRydWUsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBkYXRhOiBvcHRpb24sXG4gICAgICAgICAgICAgICAgaWQ6IGBpZF8ke3RpbWVzdGFtcH1fJHtpbmRleCsrfWAsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0ZSB1bWEgbGlzdGEgZGUgb3DDp8O1ZXMgcG9zc2l2ZWxtZW50ZSBhZ3J1cGFkYXMgZW0gdW1hIGxpc3RhIHBsYW5hIGRlIG9ww6fDtWVzLlxuICAgICAqIFBhcmEgY2FkYSBvcMOnw6NvIHF1ZSBwb3NzdWkgdW0gYWdydXBhZG9yIChgZ3JvdXBlcmApIGUgdW0gYXJyYXkgZGUgaXRlbnMgZW0gYGRhdGEuaXRlbXNgLFxuICAgICAqIGFkaWNpb25hIGEgb3DDp8OjbyBkbyBhZ3J1cGFkb3IgZSwgZW0gc2VndWlkYSwgYWRpY2lvbmEgY2FkYSBpdGVtIGRvIGdydXBvIGNvbW8gdW1hIG5vdmEgb3DDp8Ojb1xuICAgICAqIGluZGl2aWR1YWwsIGF0cmlidWluZG8gdW0gYGlkYCDDum5pY28gcGFyYSBjYWRhIGl0ZW0gZG8gZ3J1cG8uXG4gICAgICogQ2FzbyBhIG9ww6fDo28gbsOjbyBzZWphIHVtIGFncnVwYWRvciwgZWxhIMOpIGFkaWNpb25hZGEgZGlyZXRhbWVudGUgYW8gcmVzdWx0YWRvLlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIG9wdGlvbnMgTGlzdGEgZGUgb3DDp8O1ZXMgaW50ZXJuYXMgZG8gZHJvcGRvd24sIHBvZGVuZG8gY29udGVyIGFncnVwYWRvcmVzLlxuICAgICAqIEByZXR1cm5zIExpc3RhIHBsYW5hIGRlIG9ww6fDtWVzLCBpbmNsdWluZG8gYWdydXBhZG9yZXMgZSBzZXVzIGl0ZW5zIGV4cGFuZGlkb3MuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfZ3JvdXBlclRvRmxhdChvcHRpb25zOiBJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+W10pOiBJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+W10ge1xuICAgICAgICBjb25zdCByZXN1bHQ6IEludGVybmFsRHJvcGRvd25PcHRpb248VD5bXSA9IFtdO1xuXG4gICAgICAgIG9wdGlvbnMuZm9yRWFjaCgob3B0aW9uKSA9PiB7XG4gICAgICAgICAgICBpZiAob3B0aW9uLmdyb3VwZXIgJiYgQXJyYXkuaXNBcnJheSgob3B0aW9uLmRhdGEgYXMgYW55KS5pdGVtcykpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChvcHRpb24pO1xuICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VwSXRlbXMgPSAob3B0aW9uLmRhdGEgYXMgYW55KS5pdGVtcy5tYXAoKGl0ZW06IFQsIGluZGV4OiBudW1iZXIpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IGl0ZW0sXG4gICAgICAgICAgICAgICAgICAgIGlkOiBgJHtvcHRpb24uaWR9X2l0ZW1fJHtpbmRleH1gLFxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCguLi5ncm91cEl0ZW1zKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gob3B0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNb3ZlIG8gZm9jbyBwYXJhIGEgcHLDs3hpbWEgb3DDp8OjbyBkaXNwb27DrXZlbCBuYSBsaXN0YSwgaWdub3JhbmRvIG9ww6fDtWVzIHF1ZSBzZWphbSBhZ3J1cGFkb3Jlcy5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSBvcHRpb25zIExpc3RhIGRlIG9ww6fDtWVzIGludGVybmFzIGRvIGRyb3Bkb3duLlxuICAgICAqL1xuICAgIHByaXZhdGUgX2ZvY3VzTmV4dE9wdGlvbihvcHRpb25zOiBJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+W10pIHtcbiAgICAgICAgbGV0IG5leHRJbmRleCA9IHRoaXMuZm9jdXNlZEluZGV4KCkgKyAxO1xuXG4gICAgICAgIHdoaWxlIChuZXh0SW5kZXggPCBvcHRpb25zLmxlbmd0aCAmJiBvcHRpb25zW25leHRJbmRleF0uZ3JvdXBlcikge1xuICAgICAgICAgICAgbmV4dEluZGV4Kys7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobmV4dEluZGV4IDwgb3B0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNlZEluZGV4LnNldChuZXh0SW5kZXgpO1xuICAgICAgICAgICAgdGhpcy5fc2Nyb2xsVG9Gb2N1c2VkT3B0aW9uKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNb3ZlIG8gZm9jbyBwYXJhIGEgb3DDp8OjbyBhbnRlcmlvciBuYSBsaXN0YSwgaWdub3JhbmRvIG9ww6fDtWVzIGRvIHRpcG8gXCJncm91cGVyXCIuXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBMaXN0YSBkZSBvcMOnw7VlcyBpbnRlcm5hcyBkbyBkcm9wZG93bi5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9mb2N1c1ByZXZpb3VzT3B0aW9uKG9wdGlvbnM6IEludGVybmFsRHJvcGRvd25PcHRpb248VD5bXSkge1xuICAgICAgICBsZXQgcHJldkluZGV4ID0gdGhpcy5mb2N1c2VkSW5kZXgoKSAtIDE7XG5cbiAgICAgICAgd2hpbGUgKHByZXZJbmRleCA+PSAwICYmIG9wdGlvbnNbcHJldkluZGV4XS5ncm91cGVyKSB7XG4gICAgICAgICAgICBwcmV2SW5kZXgtLTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcmV2SW5kZXggPj0gMCkge1xuICAgICAgICAgICAgdGhpcy5mb2N1c2VkSW5kZXguc2V0KHByZXZJbmRleCk7XG4gICAgICAgICAgICB0aGlzLl9zY3JvbGxUb0ZvY3VzZWRPcHRpb24oKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJvbGEgYSBsaXN0YSBkZSBvcMOnw7VlcyBwYXJhIGdhcmFudGlyIHF1ZSBhIG9ww6fDo28gYXR1YWxtZW50ZSBmb2NhZGEgZXN0ZWphIHZpc8OtdmVsLlxuICAgICAqIEVzdGUgbcOpdG9kbyBvYnTDqW0gbyBJRCBkYSBvcMOnw6NvIGF0dWFsbWVudGUgZm9jYWRhIGEgcGFydGlyIGRhIGxpc3RhIGRlIG9ww6fDtWVzIGZpbHRyYWRhcy5cbiAgICAgKiBTZSB1bSBJRCB2w6FsaWRvIGZvciBlbmNvbnRyYWRvLCBidXNjYSBvIGVsZW1lbnRvIGNvcnJlc3BvbmRlbnRlIG5vIERPTSBlIHV0aWxpemFcbiAgICAgKiBgc2Nyb2xsSW50b1ZpZXdgIHBhcmEgcm9sYXIgYXTDqSBhIG9ww6fDo28sIGFsaW5oYW5kby1hIGFvIGJsb2NvIG1haXMgcHLDs3hpbW8uXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIF9zY3JvbGxUb0ZvY3VzZWRPcHRpb24oKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGlkID0gdGhpcy5maWx0ZXJlZE9wdGlvbnMoKVt0aGlzLmZvY3VzZWRJbmRleCgpXT8uaWQ7XG5cbiAgICAgICAgaWYgKCFpZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG4gICAgICAgIGVsPy5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiAnbmVhcmVzdCcgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVmaW5lIG8gZm9jbyBubyBpdGVtIGF0dWFsbWVudGUgc2VsZWNpb25hZG8gYW8gYWJyaXIgbyBkcm9wZG93bi5cbiAgICAgKiBObyBtb2RvIHNpbXBsZXMsIGZvY2EgbyBpdGVtIHNlbGVjaW9uYWRvLiBObyBtb2RvIG3Dumx0aXBsbywgZm9jYSBvIHByaW1laXJvIGl0ZW0gc2VsZWNpb25hZG8uXG4gICAgICogQXDDs3MgcmVuZGVyaXphw6fDo28gZG8gb3ZlcmxheSwgcm9sYSBhIGxpc3RhIGF0w6kgbyBpdGVtIGZvY2Fkby5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgX2ZvY3VzU2VsZWN0ZWRPcHRpb24oKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmZpbHRlcmVkT3B0aW9ucygpO1xuICAgICAgICBsZXQgc2VsZWN0ZWRJbmRleCA9IC0xO1xuXG4gICAgICAgIGlmICh0aGlzLm11bHRpcGxlKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpcnN0U2VsZWN0ZWQgPSB0aGlzLnZhbHVlcygpWzBdO1xuICAgICAgICAgICAgaWYgKGZpcnN0U2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICBzZWxlY3RlZEluZGV4ID0gb3B0aW9ucy5maW5kSW5kZXgoKG8pID0+IG8uaWQgPT09IGZpcnN0U2VsZWN0ZWQuaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLnZhbHVlKCk7XG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICBzZWxlY3RlZEluZGV4ID0gb3B0aW9ucy5maW5kSW5kZXgoKG8pID0+IG8uaWQgPT09IHNlbGVjdGVkLmlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZm9jdXNlZEluZGV4LnNldChzZWxlY3RlZEluZGV4KTtcblxuICAgICAgICBpZiAoc2VsZWN0ZWRJbmRleCA+PSAwKSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuX3Njcm9sbFRvRm9jdXNlZE9wdGlvbigpKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuIiwiPGRpdlxuICAgICNjb250YWluZXJEaXZcbiAgICBjZGtPdmVybGF5T3JpZ2luXG4gICAgI3RyaWdnZXI9XCJjZGtPdmVybGF5T3JpZ2luXCJcbiAgICBjbGFzcz1cInNlbGVjdC1jb250YWluZXIgZ3JvdXAgZmxleCBoLVszNXB4XSB3LWZ1bGwgb3ZlcmZsb3ctaGlkZGVuIHJvdW5kZWQtWzNweF0gYm9yZGVyIG91dGxpbmUtMSBvdXRsaW5lLXByaW1hcnkgZm9jdXM6b3V0bGluZVwiXG4gICAgW2NsYXNzLnBvaW50ZXItZXZlbnRzLW5vbmVdPVwiZGlzYWJsZWQoKVwiXG4gICAgW2NsYXNzLmJvcmRlci1ncmF5c2NhbGUtMjBdPVwiZGlzYWJsZWQoKVwiXG4gICAgW2NsYXNzLmJnLWdyYXlzY2FsZS01XT1cImRpc2FibGVkKClcIlxuICAgIFtjbGFzcy5wb2ludGVyLWV2ZW50cy1hdXRvXT1cIiFkaXNhYmxlZCgpXCJcbiAgICBbY2xhc3MuYm9yZGVyLWdyYXlzY2FsZS0zMF09XCIhZGlzYWJsZWQoKVwiXG4gICAgW2NsYXNzLmJnLWdyYXlzY2FsZS0wXT1cIiFkaXNhYmxlZCgpXCJcbiAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cImRpc2FibGVkKClcIlxuICAgIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwic2hvd09wdGlvbnMoKVwiXG4gICAgW2F0dHIuYXJpYS1oYXNwb3B1cF09XCInbGlzdGJveCdcIlxuICAgIFthdHRyLmFyaWEtY29udHJvbHNdPVwiY29tcG9uZW50SWQgKyAnLWxpc3Rib3gnXCJcbiAgICBbYXR0ci5hcmlhLW93bnNdPVwic2hvd09wdGlvbnMoKSA/IGNvbXBvbmVudElkICsgJy1saXN0Ym94JyA6IG51bGxcIlxuICAgIFthdHRyLmFyaWEtYWN0aXZlZGVzY2VuZGFudF09XCJzaG93T3B0aW9ucygpID8gZm9jdXNlZE9wdGlvbklkKCkgOiBudWxsXCJcbiAgICByb2xlPVwiY29tYm9ib3hcIlxuICAgIFtpZF09XCJjb21wb25lbnRJZCArICctY29tYm9ib3gnXCJcbiAgICAoY2xpY2spPVwib25Db250YWluZXJEaXZDbGljaygpXCJcbiAgICAoa2V5ZG93bik9XCJvbktleURvd24oJGV2ZW50KVwiXG4gICAgdGFiaW5kZXg9XCIwXCJcbiAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImFyaWFMYWJlbCgpIHx8IG51bGxcIlxuICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCJyZXNvbHZlZEFyaWFMYWJlbGxlZEJ5KCkgfHwgbnVsbFwiXG4+XG4gICAgPHNwYW5cbiAgICAgICAgY2xhc3M9XCJmbGV4IGZsZXgtZ3JvdyBzZWxlY3Qtbm9uZSBweC0zIHB5LVs3cHhdXCJcbiAgICAgICAgW2NsYXNzLnRleHQtZ3JheXNjYWxlLTkwXT1cIiFkaXNhYmxlZCgpICYmICFpc0NsZWFuKClcIlxuICAgICAgICBbY2xhc3MudGV4dC1ncmF5c2NhbGUtNjBdPVwiIWRpc2FibGVkKCkgJiYgaXNDbGVhbigpXCJcbiAgICAgICAgW2NsYXNzLnRleHQtZ3JheXNjYWxlLTMwXT1cImRpc2FibGVkKClcIlxuICAgID5cbiAgICAgICAge3sgcHJpbnQoKSB8fCBwbGFjZWhvbGRlcigpIH19XG4gICAgPC9zcGFuPlxuXG4gICAgQGlmICghZGlzYWJsZWQoKSAmJiBzaG93Q2xlYXIoKSAmJiAhaXNDbGVhbigpKSB7XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIGNsYXNzPVwibXgtM1wiXG4gICAgICAgICAgICAoY2xpY2spPVwiY2xlYXIoJGV2ZW50KVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuYXJpYV9jbGVhcl9zZWxlY3Rpb24nIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZhcyBmYS10aW1lcyBmbGV4IGl0ZW1zLWNlbnRlclwiXG4gICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgID48L2k+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgIH1cblxuICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJkcm9wZG93bi1jb250YWluZXIgZmxleCBpdGVtcy1jZW50ZXIgYm9yZGVyLWwgcHgtMyBncm91cC1ob3ZlcjpiZy1ncmF5c2NhbGUtMTAgZ3JvdXAtZm9jdXM6Ym9yZGVyLXByaW1hcnlcIlxuICAgICAgICBbY2xhc3MuYm9yZGVyLWdyYXlzY2FsZS0yMF09XCJkaXNhYmxlZCgpXCJcbiAgICAgICAgW2NsYXNzLmJvcmRlci1ncmF5c2NhbGUtMzBdPVwiIWRpc2FibGVkKClcIlxuICAgID5cbiAgICAgICAgPGlcbiAgICAgICAgICAgIGNsYXNzPVwiZmFzXCJcbiAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICBbY2xhc3MudGV4dC1ncmF5c2NhbGUtMzBdPVwiZGlzYWJsZWQoKVwiXG4gICAgICAgICAgICBbY2xhc3MudGV4dC1ncmF5c2NhbGUtOTBdPVwiIWRpc2FibGVkKClcIlxuICAgICAgICAgICAgW2NsYXNzLmZhLWNhcmV0LWRvd25dPVwiIXNob3dPcHRpb25zKClcIlxuICAgICAgICAgICAgW2NsYXNzLmZhLWNhcmV0LXVwXT1cInNob3dPcHRpb25zKClcIlxuICAgICAgICA+PC9pPlxuICAgIDwvZGl2PlxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZVxuICAgICNkcm9wZG93blRlbXBsYXRlXG4gICAgY2RrQ29ubmVjdGVkT3ZlcmxheVxuICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5T3JpZ2luXT1cInRyaWdnZXJcIlxuICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5T3Blbl09XCJzaG93T3B0aW9ucygpXCJcbiAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheUhhc0JhY2tkcm9wXT1cInRydWVcIlxuICAgIChiYWNrZHJvcENsaWNrKT1cInNob3dPcHRpb25zLnNldChmYWxzZSlcIlxuICAgIGNka0Nvbm5lY3RlZE92ZXJsYXlCYWNrZHJvcENsYXNzPVwiY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3BcIlxuICAgIChkZXRhY2gpPVwic2hvd09wdGlvbnMuc2V0KGZhbHNlKVwiXG4+XG4gICAgPGRpdlxuICAgICAgICBbaWRdPVwiY29tcG9uZW50SWQgKyAnLWxpc3Rib3gnXCJcbiAgICAgICAgY2xhc3M9XCJkcm9wZG93bi1ib2R5LWNsYXNzIHotWzEwMDBdIHJvdW5kZWQtWzNweF0gYmctZ3JheXNjYWxlLTAgcHktMSBzaGFkb3ctbWRcIlxuICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cImNvbnRhaW5lckRpdi5vZmZzZXRXaWR0aFwiXG4gICAgICAgIFthdHRyLmFyaWEtbXVsdGlzZWxlY3RhYmxlXT1cIm11bHRpcGxlKCkgPyB0cnVlIDogbnVsbFwiXG4gICAgICAgIFtAdmlzaWJpbGl0eUNoYW5nZWRdXG4gICAgICAgIHJvbGU9XCJsaXN0Ym94XCJcbiAgICA+XG4gICAgICAgIEBpZiAoZmlsdGVyKCkpIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IHctZnVsbCBpdGVtcy1jZW50ZXIgZ2FwLTMgcHgtMyBweS0xLjVcIj5cbiAgICAgICAgICAgICAgICBAaWYgKG11bHRpcGxlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgPHMtY2hlY2tib3hcbiAgICAgICAgICAgICAgICAgICAgICAgICNzZWxlY3RBbGxDaGVja2JveFxuICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiYWxsU2VsZWN0ZWQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaW5kZXRlcm1pbmF0ZV09XCJzZWxlY3RBbGxJc0luZGV0ZXJtaW5hdGUoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2hlY2tlZENoYW5nZSk9XCJ0b2dnbGVTZWxlY3RBbGwoKVwiXG4gICAgICAgICAgICAgICAgICAgID48L3MtY2hlY2tib3g+XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlbGF0aXZlIGZsZXggaC1bMzVweF0gZ3Jvd1wiPlxuICAgICAgICAgICAgICAgICAgICA8Zm9ybVxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IHctZnVsbCBncm93XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtR3JvdXBdPVwiZmlsdGVyRm9ybVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICNmaWx0ZXJJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidy1mdWxsIGdyb3cgcm91bmRlZC1bM3B4XSBib3JkZXIgYm9yZGVyLWdyYXlzY2FsZS0zMCBwbC0yLjUgcHItNyBvdXRsaW5lLTEgb3V0bGluZS1wcmltYXJ5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZmlsdGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJvbkZpbHRlcktleURvd24oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmZpbHRlcl9vcHRpb25zJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1jb250cm9sc109XCJjb21wb25lbnRJZCArICctbGlzdGJveCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtYWN0aXZlZGVzY2VuZGFudF09XCJmb2N1c2VkT3B0aW9uSWQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvZm9ybT5cbiAgICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmFzIGZhLXNlYXJjaCBhYnNvbHV0ZSByaWdodC0yLjUgdG9wLTIuNSB0ZXh0LWdyYXlzY2FsZS05MFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNsZWFyRmlsdGVyKClcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuY2xlYXJfZmlsdGVyJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYXMgZmEtdGltZXMgZmxleCBpdGVtcy1jZW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG5cbiAgICAgICAgPCEtLSBWaXJ0dWFsIHNjcm9sbCAtLT5cbiAgICAgICAgQGlmICh2aXJ0dWFsU2Nyb2xsKCkgJiYgZmlsdGVyZWRPcHRpb25zKCkubGVuZ3RoID4gMTApIHtcbiAgICAgICAgICAgIDxjZGstdmlydHVhbC1zY3JvbGwtdmlld3BvcnRcbiAgICAgICAgICAgICAgICBbaXRlbVNpemVdPVwidmlydHVhbFNjcm9sbEl0ZW1TaXplKClcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiaC01MiBvdmVyZmxvdy1hdXRvXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpjZGtWaXJ0dWFsRm9yPVwibGV0IG9wdGlvbiBvZiBmaWx0ZXJlZE9wdGlvbnMoKTsgdHJhY2tCeTogdHJhY2tCeUlkXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzLXNlbGVjdC1vcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIFtpZF09XCJvcHRpb24uaWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cImdldE9wdGlvbkxhYmVsKG9wdGlvbi5kYXRhKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbXVsdGlwbGVdPVwibXVsdGlwbGUoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2ttYXJrXT1cImNoZWNrbWFyaygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpc1NlbGVjdGVkXT1cImlzT3B0aW9uU2VsZWN0ZWQob3B0aW9uKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0ZWQpPVwic2VsZWN0SXRlbShvcHRpb24pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpc0dyb3VwZXJdPVwib3B0aW9uLmdyb3VwZXIgPz8gZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2lzRm9jdXNlZF09XCJvcHRpb24uZGF0YSA9PT0gZm9jdXNlZEl0ZW0oKVwiXG4gICAgICAgICAgICAgICAgICAgID48L3Mtc2VsZWN0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvY2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0PlxuICAgICAgICB9XG5cbiAgICAgICAgPCEtLSBOb3JtYWwgbGlzdCAtLT5cbiAgICAgICAgQGlmICghdmlydHVhbFNjcm9sbCgpIHx8IGZpbHRlcmVkT3B0aW9ucygpLmxlbmd0aCA8PSAxMCkge1xuICAgICAgICAgICAgPHVsIGNsYXNzPVwibWF4LWgtNTIgb3ZlcmZsb3ctYXV0b1wiPlxuICAgICAgICAgICAgICAgIEBmb3IgKG9wdGlvbiBvZiBmaWx0ZXJlZE9wdGlvbnMoKTsgdHJhY2sgb3B0aW9uLmlkKSB7XG4gICAgICAgICAgICAgICAgICAgIDxzLXNlbGVjdC1vcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIFtpZF09XCJvcHRpb24uaWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cImdldE9wdGlvbkxhYmVsKG9wdGlvbi5kYXRhKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbXVsdGlwbGVdPVwibXVsdGlwbGUoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2ttYXJrXT1cImNoZWNrbWFyaygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpc1NlbGVjdGVkXT1cImlzT3B0aW9uU2VsZWN0ZWQob3B0aW9uKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0ZWQpPVwic2VsZWN0SXRlbShvcHRpb24pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpc0dyb3VwZXJdPVwib3B0aW9uLmdyb3VwZXIgPz8gZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2lzRm9jdXNlZF09XCJvcHRpb24uZGF0YSA9PT0gZm9jdXNlZEl0ZW0oKVwiXG4gICAgICAgICAgICAgICAgICAgID48L3Mtc2VsZWN0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L3VsPlxuICAgICAgICB9XG5cbiAgICAgICAgQGlmIChmaWx0ZXJlZE9wdGlvbnMoKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibS0zIHRleHQtZ3JheXNjYWxlLTYwXCI+XG4gICAgICAgICAgICAgICAge3sgZW1wdHlNZXNzYWdlKCkgPz8gJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5ub19yZWNvcmRzX2ZvdW5kJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICB9XG4gICAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG4iXX0=
|
|
894
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9zZWxlY3Qvc3JjL2xpYi9zZWxlY3Qvc2VsZWN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9zZWxlY3Qvc3JjL2xpYi9zZWxlY3Qvc2VsZWN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFFSCxTQUFTLEVBQ1QsUUFBUSxFQUNSLFVBQVUsRUFDVixVQUFVLEVBQ1YsTUFBTSxFQUNOLEtBQUssRUFDTCxLQUFLLEVBR0wsU0FBUyxFQUNULE1BQU0sRUFDTixTQUFTLEVBQ1QsTUFBTSxHQUNULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBd0IsV0FBVyxFQUFFLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXRILE9BQU8sRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN4RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUNoRixPQUFPLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFcEUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sb0RBQW9ELENBQUM7QUFDM0YsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FB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S0FBSyxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQzs2QkFDNUYsQ0FBQzs0QkFDRixVQUFVLENBQUMsUUFBUSxFQUFFO2dDQUNqQixPQUFPLENBQUMsb0NBQW9DLEVBQUUsS0FBSyxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLENBQUMsQ0FBQzs2QkFDakcsQ0FBQzt5QkFDTCxDQUFDO3FCQUNMIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT3ZlcmxheU1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcbmltcG9ydCB7IFNjcm9sbGluZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9zY3JvbGxpbmcnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gICAgQWZ0ZXJWaWV3SW5pdCxcbiAgICBDb21wb25lbnQsXG4gICAgY29tcHV0ZWQsXG4gICAgRWxlbWVudFJlZixcbiAgICBmb3J3YXJkUmVmLFxuICAgIGluamVjdCxcbiAgICBpbnB1dCxcbiAgICBtb2RlbCxcbiAgICBPbkRlc3Ryb3ksXG4gICAgT25Jbml0LFxuICAgIFJlbmRlcmVyMixcbiAgICBzaWduYWwsXG4gICAgdmlld0NoaWxkLFxuICAgIGVmZmVjdCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgTkdfVkFMVUVfQUNDRVNTT1IsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSwgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgQ2hlY2tib3hDb21wb25lbnQgfSBmcm9tICdAc2VuaW9yc2lzdGVtYXMvYW5ndWxhci1jb21wb25lbnRzL2NoZWNrYm94JztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IFNlbGVjdE9wdGlvbkNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9zZWxlY3Qtb3B0aW9uL3NlbGVjdC1vcHRpb24uY29tcG9uZW50JztcbmltcG9ydCB7IGFuaW1hdGUsIHN0YXRlLCBzdHlsZSwgdHJhbnNpdGlvbiwgdHJpZ2dlciB9IGZyb20gJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnO1xuXG5pbnRlcmZhY2UgSW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPiB7XG4gICAgZGF0YTogVDtcbiAgICBpZDogc3RyaW5nO1xuICAgIGdyb3VwZXI/OiBib29sZWFuO1xufVxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29tcG9uZW50ZSBkZSBzZWxlw6fDo28gZHJvcGRvd24gZ2Vuw6lyaWNvIGNvbSBzdXBvcnRlIGEgc2VsZcOnw6NvIHNpbXBsZXMgZSBtw7psdGlwbGEsXG4gKiBmaWx0cm8sIGFncnVwYW1lbnRvLCB2aXJ0dWFsIHNjcm9sbCBlIGFjZXNzaWJpbGlkYWRlIChBUklBIGNvbWJvYm94KS4gSW1wbGVtZW50YVxuICoge0BsaW5rIENvbnRyb2xWYWx1ZUFjY2Vzc29yfSBwYXJhIGludGVncmHDp8OjbyBjb20gUmVhY3RpdmUgRm9ybXMgZSBUZW1wbGF0ZS1kcml2ZW4gRm9ybXMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGh0bWxcbiAqIDxzLXNlbGVjdFxuICogICBmb3JtQ29udHJvbE5hbWU9XCJjYXRlZ29yaWFcIlxuICogICBwbGFjZWhvbGRlcj1cIlNlbGVjaW9uZSB1bWEgY2F0ZWdvcmlhXCJcbiAqICAgW29wdGlvbnNdPVwiY2F0ZWdvcmlhc1wiXG4gKiAgIG9wdGlvbkxhYmVsPVwibm9tZVwiXG4gKiAgIG9wdGlvblZhbHVlPVwiaWRcIlxuICogICBbZmlsdGVyXT1cInRydWVcIlxuICogICBbc2hvd0NsZWFyXT1cInRydWVcIiAvPlxuICogYGBgXG4gKlxuICogQGNhdGVnb3J5IElucHV0c1xuICovXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3Mtc2VsZWN0JyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vc2VsZWN0LmNvbXBvbmVudC5odG1sJyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtcbiAgICAgICAgQ29tbW9uTW9kdWxlLFxuICAgICAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgICAgICBTY3JvbGxpbmdNb2R1bGUsXG4gICAgICAgIFNlbGVjdE9wdGlvbkNvbXBvbmVudCxcbiAgICAgICAgQ2hlY2tib3hDb21wb25lbnQsXG4gICAgICAgIFRyYW5zbGF0ZU1vZHVsZSxcbiAgICAgICAgT3ZlcmxheU1vZHVsZSxcbiAgICBdLFxuICAgIGhvc3Q6IHtcbiAgICAgICAgJyh3aW5kb3c6cmVzaXplKSc6ICdvbldpbmRvd1Jlc2l6ZSgkZXZlbnQpJyxcbiAgICB9LFxuICAgIHN0eWxlczogW1xuICAgICAgICBgXG4gICAgICAgICAgICA6aG9zdC5uZy1kaXJ0eS5uZy1pbnZhbGlkIHtcbiAgICAgICAgICAgICAgICAuZHJvcGRvd24tY29udGFpbmVyLFxuICAgICAgICAgICAgICAgIC5zZWxlY3QtY29udGFpbmVyIHtcbiAgICAgICAgICAgICAgICAgICAgYm9yZGVyLWNvbG9yOiAjYzEzMDE4O1xuICAgICAgICAgICAgICAgICAgICBvdXRsaW5lOiBub25lO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgYCxcbiAgICBdLFxuXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gU2VsZWN0Q29tcG9uZW50KSxcbiAgICAgICAgICAgIG11bHRpOiB0cnVlLFxuICAgICAgICB9LFxuICAgIF0sXG4gICAgYW5pbWF0aW9uczogW1xuICAgICAgICB0cmlnZ2VyKCd2aXNpYmlsaXR5Q2hhbmdlZCcsIFtcbiAgICAgICAgICAgIHN0YXRlKCd2b2lkJywgc3R5bGUoeyBvcGFjaXR5OiAwLCB0cmFuc2Zvcm06ICdzY2FsZSgwLjk1KScgfSkpLFxuICAgICAgICAgICAgdHJhbnNpdGlvbignOmVudGVyJywgW1xuICAgICAgICAgICAgICAgIGFuaW1hdGUoJzUwMG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpJywgc3R5bGUoeyBvcGFjaXR5OiAxLCB0cmFuc2Zvcm06ICdzY2FsZSgxKScgfSkpLFxuICAgICAgICAgICAgXSksXG4gICAgICAgICAgICB0cmFuc2l0aW9uKCc6bGVhdmUnLCBbXG4gICAgICAgICAgICAgICAgYW5pbWF0ZSgnNTAwbXMgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKScsIHN0eWxlKHsgb3BhY2l0eTogMCwgdHJhbnNmb3JtOiAnc2NhbGUoMC45NSknIH0pKSxcbiAgICAgICAgICAgIF0pLFxuICAgICAgICBdKSxcbiAgICBdLFxufSlcbmV4cG9ydCBjbGFzcyBTZWxlY3RDb21wb25lbnQ8VD4gaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICAgIHByaXZhdGUgc3RhdGljIG5leHRJZCA9IDA7XG5cbiAgICAvKiogQGRlc2NyaXB0aW9uIFRleHRvIGV4aWJpZG8gcXVhbmRvIG5lbmh1bWEgb3DDp8OjbyBlc3TDoSBzZWxlY2lvbmFkYS4gQGRlZmF1bHQgJycgKi9cbiAgICBwdWJsaWMgcGxhY2Vob2xkZXIgPSBpbnB1dCgnJyk7XG5cbiAgICAvKiogQGRlc2NyaXB0aW9uIEhhYmlsaXRhIGEgc2VsZcOnw6NvIGRlIG3Dumx0aXBsYXMgb3DDp8O1ZXMgc2ltdWx0w6JuZWFzLiBAZGVmYXVsdCBmYWxzZSAqL1xuICAgIHB1YmxpYyBtdWx0aXBsZSA9IGlucHV0KGZhbHNlKTtcblxuICAgIC8qKiBAZGVzY3JpcHRpb24gTGlzdGEgZGUgb3DDp8O1ZXMgZGlzcG9uw612ZWlzIHBhcmEgc2VsZcOnw6NvLiBDYW1wbyBvYnJpZ2F0w7NyaW8uICovXG4gICAgcHVibGljIG9wdGlvbnMgPSBpbnB1dC5yZXF1aXJlZDxUW10+KCk7XG5cbiAgICAvKiogQGRlc2NyaXB0aW9uIENoYXZlIGRvIG9iamV0byBkZSBvcMOnw6NvIHVzYWRhIGNvbW8gbGFiZWwgZGUgZXhpYmnDp8Ojby4gKi9cbiAgICBwdWJsaWMgb3B0aW9uTGFiZWwgPSBpbnB1dDxrZXlvZiBUPigpO1xuXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBDaGF2ZSBkbyBvYmpldG8gZGUgb3DDp8OjbyB1c2FkYSBjb21vIHZhbG9yIGEgc2VyIGVtaXRpZG8gYW8gZm9ybXVsw6FyaW8uICovXG4gICAgcHVibGljIG9wdGlvblZhbHVlID0gaW5wdXQ8a2V5b2YgVD4oKTtcblxuICAgIC8qKiBAZGVzY3JpcHRpb24gRXhpYmUgdW0gYm90w6NvIHBhcmEgbGltcGFyIGEgc2VsZcOnw6NvIGF0dWFsLiBAZGVmYXVsdCBmYWxzZSAqL1xuICAgIHB1YmxpYyBzaG93Q2xlYXIgPSBpbnB1dChmYWxzZSk7XG5cbiAgICAvKiogQGRlc2NyaXB0aW9uIEhhYmlsaXRhIHVtIGNhbXBvIGRlIGZpbHRybyB0ZXh0dWFsIHBhcmEgcGVzcXVpc2EgbmFzIG9ww6fDtWVzLiBAZGVmYXVsdCBmYWxzZSAqL1xuICAgIHB1YmxpYyBmaWx0ZXIgPSBpbnB1dChmYWxzZSk7XG5cbiAgICAvKiogQGRlc2NyaXB0aW9uIEV4aWJlIHVtIMOtY29uZSBkZSBjaGVja21hcmsgYW8gbGFkbyBkYSBvcMOnw6NvIHNlbGVjaW9uYWRhLiBAZGVmYXVsdCBmYWxzZSAqL1xuICAgIHB1YmxpYyBjaGVja21hcmsgPSBpbnB1dChmYWxzZSk7XG5cbiAgICAvKiogQGRlc2NyaXB0aW9uIENoYXZlKHMpIGRvIG9iamV0byB1c2FkYShzKSBwYXJhIGZpbHRyYWdlbSB0ZXh0dWFsLiBRdWFuZG8gbsOjbyBpbmZvcm1hZG8sIHVzYSBgb3B0aW9uTGFiZWxgLiAqL1xuICAgIHB1YmxpYyBmaWx0ZXJCeSA9IGlucHV0PGtleW9mIFQgfCAoa2V5b2YgVClbXT4oKTtcblxuICAgIC8qKiBAZGVzY3JpcHRpb24gSGFiaWxpdGEgYWdydXBhbWVudG8gZGUgb3DDp8O1ZXMuIEFzIG9ww6fDtWVzIGRldmVtIGNvbnRlciBpdGVucyBmaWxob3MgY29uZm9ybWUgYSBlc3RydXR1cmEgZGUgZ3J1cG8gc3Vwb3J0YWRhLiBAZGVmYXVsdCBmYWxzZSAqL1xuICAgIHB1YmxpYyBncm91cCA9IGlucHV0KGZhbHNlKTtcblxuICAgIC8qKiBAZGVzY3JpcHRpb24gSGFiaWxpdGEgdmlydHVhbGl6YcOnw6NvIGRhIGxpc3RhIHBhcmEgbWVsaG9yIHBlcmZvcm1hbmNlIGNvbSBncmFuZGVzIHZvbHVtZXMgZGUgb3DDp8O1ZXMuIEBkZWZhdWx0IGZhbHNlICovXG4gICAgcHVibGljIHZpcnR1YWxTY3JvbGwgPSBpbnB1dChmYWxzZSk7XG5cbiAgICAvKiogQGRlc2NyaXB0aW9uIEFsdHVyYSBmaXhhIGRlIGNhZGEgaXRlbSBkYSBsaXN0YSBlbSBwaXhlbHMsIG5lY2Vzc8OhcmlhIHBhcmEgbyBjw6FsY3VsbyBkbyB2aXJ0dWFsIHNjcm9sbC4gQGRlZmF1bHQgMzcgKi9cbiAgICBwdWJsaWMgdmlydHVhbFNjcm9sbEl0ZW1TaXplID0gaW5wdXQoMzcpO1xuXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBNZW5zYWdlbSBleGliaWRhIHF1YW5kbyBuZW5odW1hIG9ww6fDo28gY29ycmVzcG9uZGUgYW8gZmlsdHJvIGFwbGljYWRvLiBAZGVmYXVsdCBudWxsICovXG4gICAgcHVibGljIGVtcHR5TWVzc2FnZSA9IGlucHV0PHN0cmluZyB8IG51bGw+KG51bGwpO1xuXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBDb250cm9sYSBvIGVzdGFkbyBkZXNhYmlsaXRhZG8gZG8gY29tcG9uZW50ZSB2aWEgdHdvLXdheSBiaW5kaW5nLiBAZGVmYXVsdCBmYWxzZSAqL1xuICAgIHB1YmxpYyBkaXNhYmxlZCA9IG1vZGVsKGZhbHNlKTtcblxuICAgIC8qKiBAZGVzY3JpcHRpb24gQ29udHJvbGEgYSB2aXNpYmlsaWRhZGUgZG8gcGFpbmVsIGRlIG9ww6fDtWVzIHZpYSB0d28td2F5IGJpbmRpbmcuIEBkZWZhdWx0IGZhbHNlICovXG4gICAgcHVibGljIHNob3dPcHRpb25zID0gbW9kZWwoZmFsc2UpO1xuXG4gICAgLyoqIEBkZXNjcmlwdGlvbiBMYWJlbCBkZSBhY2Vzc2liaWxpZGFkZSBkbyBjb21wb25lbnRlLiBAZGVmYXVsdCAnJyAqL1xuICAgIHB1YmxpYyBhcmlhTGFiZWwgPSBpbnB1dCgnJyk7XG5cbiAgICAvKiogQGRlc2NyaXB0aW9uIElEIGRvIGVsZW1lbnRvIGV4dGVybm8gcXVlIGRlc2NyZXZlIG8gY29tcG9uZW50ZSAoYXJpYS1sYWJlbGxlZGJ5KS4gQGRlZmF1bHQgJycgKi9cbiAgICBwdWJsaWMgYXJpYUxhYmVsbGVkQnkgPSBpbnB1dCgnJyk7XG5cbiAgICAvKipcbiAgICAgKiBJRCBkbyBsYWJlbCByZXNvbHZpZG8gcGFyYSBgYXJpYS1sYWJlbGxlZGJ5YCBkbyBjb21ib2JveCBpbnRlcm5vLlxuICAgICAqIFByaW9yaXphIG8gdmFsb3IgZXhwbMOtY2l0byBkZSBgYXJpYUxhYmVsbGVkQnlgOyBjYXNvIGNvbnRyw6FyaW8sIHVzYSBvIGlkIGRlIHVtXG4gICAgICogYDxsYWJlbCBmb3I9XCIuLi5cIj5gIGV4dGVybm8gYXNzb2NpYWRvIGFvIGhvc3QgKGRldGVjdGFkbyBlbSBydW50aW1lKS5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVzb2x2ZWRBcmlhTGFiZWxsZWRCeSA9IHNpZ25hbCgnJyk7XG5cbiAgICBwdWJsaWMgdmFsdWUgPSBzaWduYWw8SW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPiB8IG51bGw+KG51bGwpO1xuICAgIHB1YmxpYyB2YWx1ZXMgPSBzaWduYWw8SW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPltdPihbXSk7XG4gICAgcHVibGljIGZpbHRlclZhbHVlID0gc2lnbmFsKCcnKTtcbiAgICBwdWJsaWMgZm9jdXNlZEluZGV4ID0gc2lnbmFsKC0xKTtcbiAgICBwcml2YXRlIF9wZW5kaW5nVmFsdWU6IFQgfCBUW10gfCBudWxsID0gbnVsbDtcbiAgICBwdWJsaWMgaXNPcGVuID0gZmFsc2U7XG5cbiAgICBwdWJsaWMgY29tcG9uZW50SWQgPSBgc2VsZWN0JHtTZWxlY3RDb21wb25lbnQubmV4dElkKyt9YDtcblxuICAgIC8qKlxuICAgICAqIENvbXB1dGVkIHF1ZSBpbmRpY2Egc2UgdG9kYXMgYXMgb3DDp8O1ZXMgZmlsdHJhZGFzIGVzdMOjbyBzZWxlY2lvbmFkYXMuXG4gICAgICogUmV0b3JuYSBgdHJ1ZWAgc2UgdG9kYXMgYXMgb3DDp8O1ZXMgZGlzcG9uw612ZWlzIChleGNsdWluZG8gYWdydXBhZG9yZXMpIGVzdGl2ZXJlbSBwcmVzZW50ZXNcbiAgICAgKiBuYSBsaXN0YSBkZSB2YWxvcmVzIHNlbGVjaW9uYWRvcywgZSBgZmFsc2VgIGNhc28gY29udHLDoXJpby5cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIHNlIHRvZGFzIGFzIG9ww6fDtWVzIGZpbHRyYWRhcyBlc3TDo28gc2VsZWNpb25hZGFzLCBgZmFsc2VgIGNhc28gY29udHLDoXJpby5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWxsU2VsZWN0ZWQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmZpbHRlcmVkT3B0aW9ucygpLmZpbHRlcigob3B0aW9uKSA9PiAhb3B0aW9uLmdyb3VwZXIpO1xuICAgICAgICBjb25zdCBzZWxlY3RlZElkcyA9IHRoaXMudmFsdWVzKCkubWFwKChvcHRpb24pID0+IG9wdGlvbi5pZCk7XG5cbiAgICAgICAgY29uc3QgcmV0ID0gb3B0aW9ucy5sZW5ndGggPiAwICYmIG9wdGlvbnMuZXZlcnkoKG9wdGlvbikgPT4gc2VsZWN0ZWRJZHMuaW5jbHVkZXMob3B0aW9uLmlkKSk7XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBSZXRvcm5hIG8gaXRlbSBhdHVhbG1lbnRlIGZvY2FkbyBuYSBsaXN0YSBkZSBvcMOnw7VlcyBmaWx0cmFkYXMuXG4gICAgICogQHJldHVybnMgTyBkYWRvIGRvIGl0ZW0gZm9jYWRvIG91IGBudWxsYCBjYXNvIG5lbmh1bSBpdGVtIGVzdGVqYSBmb2NhZG8uXG4gICAgICovXG4gICAgcHVibGljIGZvY3VzZWRJdGVtID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuZm9jdXNlZEluZGV4KCk7XG4gICAgICAgIGlmIChpbmRleCA8IDApIHJldHVybiBudWxsO1xuICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXJlZE9wdGlvbnMoKVtpbmRleF0/LmRhdGEgPz8gbnVsbDtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFJldG9ybmEgbyBpdGVtIGF0dWFsbWVudGUgZm9jYWRvIG5hIGxpc3RhIGRlIG9ww6fDtWVzIGZpbHRyYWRhcy5cbiAgICAgKiBAcmV0dXJucyBPIGRhZG8gZG8gaXRlbSBmb2NhZG8gb3UgYG51bGxgIGNhc28gbmVuaHVtIGl0ZW0gZXN0ZWphIGZvY2Fkby5cbiAgICAgKi9cbiAgICBwdWJsaWMgZm9jdXNlZE9wdGlvbklkID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuZm9jdXNlZEluZGV4KCk7XG4gICAgICAgIGlmIChpbmRleCA8IDApIHJldHVybiBudWxsO1xuICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXJlZE9wdGlvbnMoKVtpbmRleF0/LmlkID8/IG51bGw7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBDb21wdXRhIGUgcmV0b3JuYSBhIGxpc3RhIGludGVybmEgZGUgb3DDp8O1ZXMgZG8gZHJvcGRvd24uXG4gICAgICogLSBTZSBhcyBvcMOnw7VlcyBlc3RpdmVyZW0gYWdydXBhZGFzIChgZ3JvdXAoKWAgcmV0b3JuYSB2ZXJkYWRlaXJvKSxcbiAgICAgKiAgIHV0aWxpemEgYF9ncm91cGVyVG9GbGF0YCBwYXJhIHRyYW5zZm9ybWFyIGFzIG9ww6fDtWVzIGFncnVwYWRhcyBlbSB1bWEgbGlzdGEgcGxhbmEuXG4gICAgICogLSBDYXNvIGNvbnRyw6FyaW8sIHJldG9ybmEgYXMgb3DDp8O1ZXMgY29tIElEcyBhZGljaW9uYWRvcy5cbiAgICAgKiBAcmV0dXJucyBVbSBhcnJheSBkZSBgSW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPmAgcmVwcmVzZW50YW5kbyBhcyBvcMOnw7VlcyBkaXNwb27DrXZlaXMgcGFyYSBvIGNvbXBvbmVudGUgc2VsZWN0LlxuICAgICAqL1xuICAgIHB1YmxpYyBpbnRlcm5hbE9wdGlvbnMgPSBjb21wdXRlZDxJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+W10+KCgpID0+IHtcbiAgICAgICAgY29uc3Qgb3B0cyA9IHRoaXMub3B0aW9ucygpO1xuICAgICAgICBjb25zdCBvcHRpb25zV2l0aElkID0gdGhpcy5fYWRkSWRUb09wdGlvbnMob3B0cyk7XG4gICAgICAgIHJldHVybiB0aGlzLmdyb3VwKCkgPyB0aGlzLl9ncm91cGVyVG9GbGF0KG9wdGlvbnNXaXRoSWQpIDogb3B0aW9uc1dpdGhJZDtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIFJldG9ybmEgdW1hIHN0cmluZyByZXByZXNlbnRhbmRvIGEgc2VsZcOnw6NvIGF0dWFsIGRvIGNvbXBvbmVudGUuXG4gICAgICogLSBTZSBvIG1vZG8gbcO6bHRpcGxvIGVzdGl2ZXIgYXRpdmFkbyBlIG1haXMgZGUgdW0gaXRlbSBlc3RpdmVyIHNlbGVjaW9uYWRvLFxuICAgICAqICAgcmV0b3JuYSB1bWEgbWVuc2FnZW0gdHJhZHV6aWRhIGluZGljYW5kbyBvIG7Dum1lcm8gdG90YWwgZGUgcmVnaXN0cm9zIHNlbGVjaW9uYWRvcy5cbiAgICAgKiAtIFNlIGFwZW5hcyB1bSBpdGVtIGVzdGl2ZXIgc2VsZWNpb25hZG8sIHJldG9ybmEgbyByw7N0dWxvIGRlc3NlIGl0ZW0uXG4gICAgICogLSBTZSBvIG1vZG8gbcO6bHRpcGxvIG7Do28gZXN0aXZlciBhdGl2YWRvLCByZXRvcm5hIG8gcsOzdHVsbyBkbyBpdGVtIHNlbGVjaW9uYWRvIG91IHVtYSBzdHJpbmcgdmF6aWEgY2FzbyBuZW5odW0gaXRlbSBlc3RlamEgc2VsZWNpb25hZG8uXG4gICAgICogQHJldHVybnMge3N0cmluZ30gVGV4dG8gcmVwcmVzZW50YW5kbyBhIHNlbGXDp8OjbyBhdHVhbC5cbiAgICAgKi9cbiAgICBwdWJsaWMgcHJpbnQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLm11bHRpcGxlKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy52YWx1ZXMoKTtcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZC5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChgcGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLnRvdGFsX3JlY29yZHNfc2VsZWN0ZWRgLCB7XG4gICAgICAgICAgICAgICAgICAgIGNvdW50OiBzZWxlY3RlZC5sZW5ndGgsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNlbGVjdGVkLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRMYWJlbEZyb21PcHRpb24oc2VsZWN0ZWRbMF0uZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMudmFsdWUoKTtcbiAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZCA/IHRoaXMuX2dldExhYmVsRnJvbU9wdGlvbihzZWxlY3RlZC5kYXRhKSA6ICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogSW5kaWNhIHNlIG8gc2VsZXRvciBlc3TDoSBcImxpbXBvXCIsIG91IHNlamEsIHNlbSBuZW5odW0gdmFsb3Igc2VsZWNpb25hZG8uXG4gICAgICogLSBObyBtb2RvIG3Dumx0aXBsbyAoYG11bHRpcGxlYCksIHJldG9ybmEgYHRydWVgIHNlIG7Do28gaG91dmVyIG5lbmh1bSB2YWxvciBzZWxlY2lvbmFkbyAoYHZhbHVlc2AgZXN0w6EgdmF6aW8pLlxuICAgICAqIC0gTm8gbW9kbyBzaW1wbGVzLCByZXRvcm5hIGB0cnVlYCBzZSBuw6NvIGhvdXZlciB2YWxvciBzZWxlY2lvbmFkbyAoYHZhbHVlYCDDqSBmYWxzeSkuXG4gICAgICogQHJldHVybnMgYHRydWVgIHNlIG7Do28gaG91dmVyIHNlbGXDp8OjbywgYGZhbHNlYCBjYXNvIGNvbnRyw6FyaW8uXG4gICAgICovXG4gICAgcHVibGljIGlzQ2xlYW4gPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLm11bHRpcGxlKCkgPyAhdGhpcy52YWx1ZXMoKS5sZW5ndGggOiAhdGhpcy52YWx1ZSgpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQ29tcHV0ZWQgcXVlIGluZGljYSBzZSBvIGVzdGFkbyBkZSBzZWxlw6fDo28gXCJTZWxlY2lvbmFyIFRvZG9zXCIgZXN0w6EgaW5kZXRlcm1pbmFkby5cbiAgICAgKiBSZXRvcm5hIGB0cnVlYCBxdWFuZG8gbmVtIHRvZG9zIG9zIGl0ZW5zIGZpbHRyYWRvcyBlc3TDo28gc2VsZWNpb25hZG9zIGUgbmVtIHRvZG9zIGVzdMOjbyBkZXNtYXJjYWRvcyxcbiAgICAgKiBvdSBzZWphLCBxdWFuZG8gaMOhIHVtYSBzZWxlw6fDo28gcGFyY2lhbCBkb3MgaXRlbnMgZGlzcG9uw612ZWlzLlxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgc2UgYSBzZWxlw6fDo28gZm9yIHBhcmNpYWwsIGBmYWxzZWAgY2FzbyBjb250csOhcmlvLlxuICAgICAqL1xuICAgIHB1YmxpYyBzZWxlY3RBbGxJc0luZGV0ZXJtaW5hdGUgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy5pbnRlcm5hbE9wdGlvbnMoKS5maWx0ZXIoKG9wdGlvbikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVzKCkuc29tZSgobykgPT4gby5pZCA9PT0gb3B0aW9uLmlkKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmZpbHRlcmVkT3B0aW9ucygpLmZpbHRlcigob3B0aW9uKSA9PiAhb3B0aW9uLmdyb3VwZXIpO1xuICAgICAgICBjb25zdCBhbGwgPSBvcHRpb25zLmxlbmd0aCA+IDAgJiYgb3B0aW9ucy5ldmVyeSgob3B0aW9uKSA9PiBzZWxlY3RlZC5pbmNsdWRlcyhvcHRpb24pKTtcbiAgICAgICAgY29uc3Qgbm9uZSA9IG9wdGlvbnMuZXZlcnkoKG9wdGlvbikgPT4gIXNlbGVjdGVkLmluY2x1ZGVzKG9wdGlvbikpO1xuXG4gICAgICAgIHJldHVybiAhYWxsICYmICFub25lO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogUmV0b3JuYSB1bWEgbGlzdGEgZGUgb3DDp8O1ZXMgZmlsdHJhZGFzIGNvbSBiYXNlIG5vIHZhbG9yIGRlIGJ1c2NhIChgZmlsdGVyVmFsdWVgKSBlIG5vcyBjcml0w6lyaW9zIGRlZmluaWRvcy5cbiAgICAgKiAtIFNlIG8gZmlsdHJvIGVzdGl2ZXIgZGVzYWJpbGl0YWRvIG91IG8gdmFsb3IgZGUgYnVzY2EgZXN0aXZlciB2YXppbywgcmV0b3JuYSB0b2RhcyBhcyBvcMOnw7Vlcy5cbiAgICAgKiAtIENhc28gY29udHLDoXJpbywgZmlsdHJhIGFzIG9ww6fDtWVzIHV0aWxpemFuZG8gbyhzKSBjYW1wbyhzKSBlc3BlY2lmaWNhZG8ocykgZW0gYGZpbHRlckJ5YC5cbiAgICAgKiAtIElnbm9yYSBvcMOnw7VlcyBxdWUgcG9zc3VlbSBhIHByb3ByaWVkYWRlIGBncm91cGVyYCBkZWZpbmlkYS5cbiAgICAgKiBAcmV0dXJucyBBcyBvcMOnw7VlcyBmaWx0cmFkYXMgY29uZm9ybWUgbyB2YWxvciBkZSBidXNjYSBlIGNyaXTDqXJpb3MgZGUgZmlsdHJvLlxuICAgICAqL1xuICAgIHB1YmxpYyBmaWx0ZXJlZE9wdGlvbnMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGFsbE9wdGlvbnMgPSB0aGlzLmludGVybmFsT3B0aW9ucygpO1xuICAgICAgICBjb25zdCBzZWFyY2ggPSB0aGlzLmZpbHRlclZhbHVlKCkudG9Mb3dlckNhc2UoKS50cmltKCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmZpbHRlcigpIHx8ICFzZWFyY2gpIHtcbiAgICAgICAgICAgIHJldHVybiBhbGxPcHRpb25zO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmlsdGVyQnkgPSB0aGlzLmZpbHRlckJ5KCk7XG4gICAgICAgIHJldHVybiBhbGxPcHRpb25zLmZpbHRlcigob3B0aW9uKSA9PiB7XG4gICAgICAgICAgICBpZiAob3B0aW9uLmdyb3VwZXIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBsYWJlbCA9ICcnO1xuXG4gICAgICAgICAgICBjb25zdCBvcHRpb25MYWJlbCA9IHRoaXMub3B0aW9uTGFiZWwoKTtcblxuICAgICAgICAgICAgaWYgKCFmaWx0ZXJCeSkge1xuICAgICAgICAgICAgICAgIGxhYmVsID0gb3B0aW9uTGFiZWwgPyBTdHJpbmcob3B0aW9uLmRhdGFbb3B0aW9uTGFiZWxdKSA6IFN0cmluZyhvcHRpb24uZGF0YSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZmlsdGVyQnkpKSB7XG4gICAgICAgICAgICAgICAgbGFiZWwgPSBmaWx0ZXJCeS5tYXAoKGJ5KSA9PiBTdHJpbmcob3B0aW9uLmRhdGFbYnldID8/ICcnKSkuam9pbignICcpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsYWJlbCA9IFN0cmluZyhvcHRpb24uZGF0YVtmaWx0ZXJCeV0gPz8gJycpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gbGFiZWwudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzZWFyY2gpO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIHB1YmxpYyByZWFkb25seSBmaWx0ZXJGb3JtID0gbmV3IEZvcm1Hcm91cDx7IGZpbHRlcjogRm9ybUNvbnRyb2w8c3RyaW5nPiB9Pih7XG4gICAgICAgIGZpbHRlcjogbmV3IEZvcm1Db250cm9sPHN0cmluZz4oJycsIHsgbm9uTnVsbGFibGU6IHRydWUgfSksXG4gICAgfSk7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9jb250YWluZXJEaXYgPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD4+KCdjb250YWluZXJEaXYnKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9maWx0ZXJJbnB1dCA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+PignZmlsdGVySW5wdXQnKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9zZWxlY3RBbGxDaGVja2JveCA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPEhUTUxFbGVtZW50Pj4oJ3NlbGVjdEFsbENoZWNrYm94Jyk7XG4gICAgcHJpdmF0ZSBfb25DaGFuZ2U6ICh2YWx1ZTogYW55IHwgYW55W10gfCBudWxsKSA9PiB2b2lkID0gKCkgPT4ge307XG4gICAgcHJpdmF0ZSBfb25Ub3VjaGVkOiAoKSA9PiB2b2lkID0gKCkgPT4ge307XG5cbiAgICBwcml2YXRlIF9jbGlja2FibGVMYWJlbDogSFRNTExhYmVsRWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBfdHJhbnNsYXRlU2VydmljZSA9IGluamVjdChUcmFuc2xhdGVTZXJ2aWNlKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9ob3N0UmVmID0gaW5qZWN0PEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+PihFbGVtZW50UmVmKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9yZW5kZXJlciA9IGluamVjdChSZW5kZXJlcjIpO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuZmlsdGVyRm9ybVxuICAgICAgICAgICAgLmdldCgnZmlsdGVyJykhXG4gICAgICAgICAgICAudmFsdWVDaGFuZ2VzLnBpcGUoZGVib3VuY2VUaW1lKDMwMCksIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksIHRha2VVbnRpbERlc3Ryb3llZCgpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlclZhbHVlLnNldCh2YWx1ZSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAvLyBFZmVpdG8gcGFyYSB0ZW50YXIgYXBsaWNhciB2YWxvciBwZW5kZW50ZSBxdWFuZG8gb3B0aW9ucyBtdWRhclxuICAgICAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgb3B0cyA9IHRoaXMub3B0aW9ucygpO1xuICAgICAgICAgICAgaWYgKG9wdHMgJiYgb3B0cy5sZW5ndGggJiYgdGhpcy5fcGVuZGluZ1ZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fYXBwbHlQZW5kaW5nVmFsdWUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gTWFudMOpbSBvIGFyaWEtbGFiZWxsZWRieSByZXNvbHZpZG8gZW0gc2luY3JvbmlhIGNvbSBvIGlucHV0IGV4cGzDrWNpdG8uXG4gICAgICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBleHBsaWNpdExhYmVsbGVkQnkgPSB0aGlzLmFyaWFMYWJlbGxlZEJ5KCk7XG4gICAgICAgICAgICBpZiAoZXhwbGljaXRMYWJlbGxlZEJ5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXNvbHZlZEFyaWFMYWJlbGxlZEJ5LnNldChleHBsaWNpdExhYmVsbGVkQnkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3ZhbGlkYXRlSW5wdXRzKCk7XG4gICAgfVxuXG4gICAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fYXNzb2NpYXRlRXh0ZXJuYWxMYWJlbCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fY2xpY2thYmxlTGFiZWw/LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fb25MYWJlbENsaWNrKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWZpbmUgbyB2YWxvciBzZWxlY2lvbmFkbyBkbyBjb21wb25lbnRlIHNlbGVjdC5cbiAgICAgKiBAcGFyYW0gdmFsdWUgTyB2YWxvciBhIHNlciBkZWZpbmlkby4gUG9kZSBzZXIgdW0gb2JqZXRvIGRvIHRpcG8gYFRgLCB1bSBhcnJheSBkZSBgVGAgKHF1YW5kbyBtw7psdGlwbGEgc2VsZcOnw6NvIGVzdMOhIGhhYmlsaXRhZGEpLCBvdSBgbnVsbGAuXG4gICAgICogQHRocm93cyBTZSBvIG1vZG8gbcO6bHRpcGxvIGVzdGl2ZXIgYXRpdmFkbyBlIG8gdmFsb3IgbsOjbyBmb3IgdW0gYXJyYXksIGxhbsOnYSB1bSBlcnJvLlxuICAgICAqIEB0aHJvd3MgU2UgbyBtb2RvIG3Dumx0aXBsbyBlc3RpdmVyIGRlc2F0aXZhZG8gZSBvIHZhbG9yIGZvciB1bSBhcnJheSwgbGFuw6dhIHVtIGVycm8uXG4gICAgICogRXN0ZSBtw6l0b2RvIG1hcGVpYSBvKHMpIHZhbG9yKGVzKSBmb3JuZWNpZG8ocykgcGFyYSBhcyBvcMOnw7VlcyBpbnRlcm5hcyBkbyBjb21wb25lbnRlLFxuICAgICAqIGdhcmFudGluZG8gcXVlIGFwZW5hcyBvcMOnw7VlcyB2w6FsaWRhcyBzZWphbSBzZWxlY2lvbmFkYXMgY29uZm9ybWUgbyBtb2RvIGRlIHNlbGXDp8OjbyAow7puaWNvIG91IG3Dumx0aXBsbykuXG4gICAgICovXG4gICAgcHVibGljIHdyaXRlVmFsdWUodmFsdWU6IFQgfCBUW10gfCBudWxsKTogdm9pZCB7XG4gICAgICAgIC8vIEFybWF6ZW5hIHZhbG9yIHBlbmRlbnRlIGUgdGVudGEgYXBsaWNhclxuICAgICAgICB0aGlzLl9wZW5kaW5nVmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5fYXBwbHlQZW5kaW5nVmFsdWUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUZW50YSBhcGxpY2FyIG8gdmFsb3IgcGVuZGVudGUgKF9wZW5kaW5nVmFsdWUpIGFvIGVzdGFkbyBkbyBjb21wb25lbnRlLFxuICAgICAqIG1hcGVhbmRvIHBhcmEgSW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPiBjb25mb3JtZSBvcHRpb25zIGRpc3BvbsOtdmVpcy5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9hcHBseVBlbmRpbmdWYWx1ZSgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLl9wZW5kaW5nVmFsdWU7XG4gICAgICAgIGNvbnN0IG9wdHMgPSB0aGlzLmludGVybmFsT3B0aW9ucygpO1xuICAgICAgICBjb25zdCBvcHRpb25WYWx1ZSA9IHRoaXMub3B0aW9uVmFsdWUoKTtcblxuICAgICAgICBpZiAodmFsdWUgJiYgdGhpcy5tdWx0aXBsZSgpKSB7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtYXBwZWQgPSB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICAubWFwKCh2KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9uVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3B0cy5maW5kKChvcHQpID0+IG9wdC5kYXRhW29wdGlvblZhbHVlXSA9PT0gdikgfHwgbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wdHMuZmluZCgob3B0KSA9PiBKU09OLnN0cmluZ2lmeShvcHQuZGF0YSkgPT09IEpTT04uc3RyaW5naWZ5KHYpKSB8fCBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKChvcHQpOiBvcHQgaXMgSW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPiA9PiAhIW9wdCk7XG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZXMuc2V0KG1hcHBlZCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMudmFsdWVzLnNldChbXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgbWFwcGVkOiBJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+IHwgbnVsbCA9IG51bGw7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBtYXBwZWQgPSBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChvcHRpb25WYWx1ZSAmJiB2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29tcGFyZVZhbHVlID1cbiAgICAgICAgICAgICAgICAgICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiBvcHRpb25WYWx1ZSBpbiB2YWx1ZSA/IHZhbHVlW29wdGlvblZhbHVlXSA6IHZhbHVlO1xuICAgICAgICAgICAgICAgIG1hcHBlZCA9IG9wdHMuZmluZCgob3B0KSA9PiBvcHQuZGF0YVtvcHRpb25WYWx1ZV0gPT09IGNvbXBhcmVWYWx1ZSkgfHwgbnVsbDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIG1hcHBlZCA9IG9wdHMuZmluZCgob3B0KSA9PiBKU09OLnN0cmluZ2lmeShvcHQuZGF0YSkgPT09IEpTT04uc3RyaW5naWZ5KHZhbHVlKSkgfHwgbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMudmFsdWUuc2V0KG1hcHBlZCA/PyBudWxsKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9wZW5kaW5nVmFsdWUgPSBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlZ2lzdHJhIHVtYSBmdW7Dp8OjbyBkZSBjYWxsYmFjayBxdWUgc2Vyw6EgY2hhbWFkYSBzZW1wcmUgcXVlIG8gdmFsb3IgZG8gY29tcG9uZW50ZSBtdWRhci5cbiAgICAgKiBAcGFyYW0gb25DaGFuZ2UgRnVuw6fDo28gZGUgY2FsbGJhY2sgcXVlIHJlY2ViZSBvIG5vdm8gdmFsb3Igc2VsZWNpb25hZG8gb3UgbnVsbC5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShvbkNoYW5nZTogKHZhbHVlOiBUIHwgVFtdIHwgbnVsbCkgPT4gdm9pZCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9vbkNoYW5nZSA9IG9uQ2hhbmdlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlZ2lzdHJhIHVtYSBmdW7Dp8OjbyBkZSBjYWxsYmFjayBxdWUgc2Vyw6EgY2hhbWFkYSBxdWFuZG8gbyBjb21wb25lbnRlIGZvciB0b2NhZG8gKHBlcmRlciBvIGZvY28pLlxuICAgICAqIEBwYXJhbSBvblRvdWNoZWQgRnVuw6fDo28gZGUgY2FsbGJhY2sgYSBzZXIgZXhlY3V0YWRhIHF1YW5kbyBvIGNvbXBvbmVudGUgZm9yIG1hcmNhZG8gY29tbyBcInRvY2Fkb1wiLlxuICAgICAqL1xuICAgIHB1YmxpYyByZWdpc3Rlck9uVG91Y2hlZChvblRvdWNoZWQ6ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fb25Ub3VjaGVkID0gb25Ub3VjaGVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlZmluZSBvIGVzdGFkbyBkZSBkZXNhYmlsaXRhZG8gZG8gY29tcG9uZW50ZS5cbiAgICAgKiBAcGFyYW0gZGlzYWJsZWQgSW5kaWNhIHNlIG8gY29tcG9uZW50ZSBkZXZlIHNlciBkZXNhYmlsaXRhZG8gKGB0cnVlYCkgb3UgaGFiaWxpdGFkbyAoYGZhbHNlYCkuXG4gICAgICovXG4gICAgcHVibGljIHNldERpc2FibGVkU3RhdGUoZGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kaXNhYmxlZC5zZXQoZGlzYWJsZWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFsdGVybmEgYSBleGliacOnw6NvIGRhcyBvcMOnw7VlcyBkbyBjb21wb25lbnRlIHNlbGVjdC5cbiAgICAgKiBTZSBvIGNvbXBvbmVudGUgZXN0aXZlciBkZXNhYmlsaXRhZG8sIG7Do28gcmVhbGl6YSBuZW5odW1hIGHDp8Ojby5cbiAgICAgKiBDYXNvIGNvbnRyw6FyaW8sIGludmVydGUgbyBlc3RhZG8gZGUgZXhpYmnDp8OjbyBkYXMgb3DDp8O1ZXMuXG4gICAgICogQW8gYWJyaXIsIG1vdmUgbyBmb2NvIHBhcmEgbyBpdGVtIGF0dWFsbWVudGUgc2VsZWNpb25hZG8uXG4gICAgICovXG4gICAgcHVibGljIHRvZ2dsZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2hvdWxkT3BlbiA9ICF0aGlzLnNob3dPcHRpb25zKCk7XG4gICAgICAgIHRoaXMuaXNPcGVuID0gc2hvdWxkT3BlbjtcbiAgICAgICAgdGhpcy5zaG93T3B0aW9ucy5zZXQoc2hvdWxkT3Blbik7XG5cbiAgICAgICAgaWYgKHNob3VsZE9wZW4pIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmZpbHRlcigpKSB7XG4gICAgICAgICAgICAgICAgLy8gUXVhbmRvIGjDoSBmaWx0cm8gY29tIG3Dumx0aXBsYSBzZWxlw6fDo28sIGZvY28gdmFpIHBhcmEgbyBjaGVja2JveCBwcmltZWlybztcbiAgICAgICAgICAgICAgICAvLyBjYXNvIGNvbnRyw6FyaW8sIHZhaSBkaXJldG8gcGFyYSBvIGlucHV0IGRlIGZpbHRyby5cbiAgICAgICAgICAgICAgICAvLyBPIGZvY28gw6kgbW92aWRvIGFww7NzIGEgcmVuZGVyaXphw6fDo28gZG8gb3ZlcmxheS5cbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hlY2tib3hIb3N0ID0gdGhpcy5fc2VsZWN0QWxsQ2hlY2tib3goKT8ubmF0aXZlRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvY3VzYWJsZSA9IGNoZWNrYm94SG9zdD8ucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oJ1t0YWJpbmRleF0nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvY3VzYWJsZT8uZm9jdXMoKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2ZpbHRlcklucHV0KCk/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9mb2N1c1NlbGVjdGVkT3B0aW9uKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZWxlY2lvbmEgdW0gaXRlbSBubyBjb21wb25lbnRlIGRlIHNlbGXDp8Ojby5cbiAgICAgKiBAcGFyYW0gaXRlbSBPIGl0ZW0gYSBzZXIgc2VsZWNpb25hZG8gb3UgZGVzbWFyY2Fkby5cbiAgICAgKiBTZSBvIGNvbXBvbmVudGUgZXN0aXZlciBkZXNhYmlsaXRhZG8sIGEgZnVuw6fDo28gcmV0b3JuYSBpbWVkaWF0YW1lbnRlLlxuICAgICAqIE5vIG1vZG8gbcO6bHRpcGxvLCBhZGljaW9uYSBvdSByZW1vdmUgbyBpdGVtIGRhIGxpc3RhIGRlIHZhbG9yZXMgc2VsZWNpb25hZG9zLlxuICAgICAqIE5vIG1vZG8gc2ltcGxlcywgZGVmaW5lIG8gaXRlbSBjb21vIHZhbG9yIHNlbGVjaW9uYWRvIGUgZmVjaGEgbyBkcm9wZG93bi5cbiAgICAgKiBTZW1wcmUgbm90aWZpY2EgYXMgbXVkYW7Dp2FzIGUgbWFyY2EgbyBjb21wb25lbnRlIGNvbW8gdG9jYWRvLlxuICAgICAqL1xuICAgIHB1YmxpYyBzZWxlY3RJdGVtKGl0ZW06IEludGVybmFsRHJvcGRvd25PcHRpb248VD4pOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgb3B0aW9uVmFsdWUgPSB0aGlzLm9wdGlvblZhbHVlKCk7XG5cbiAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUoKSkge1xuICAgICAgICAgICAgY29uc3Qgc3RvcmUgPSBbLi4udGhpcy52YWx1ZXMoKV07XG4gICAgICAgICAgICBjb25zdCBpbmRleCA9IHN0b3JlLmZpbmRJbmRleCgoc2VsZWN0ZWRJdGVtKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkSXRlbSA9PT0gaXRlbTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgc3RvcmUuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc3RvcmUucHVzaChpdGVtKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy52YWx1ZXMuc2V0KHN0b3JlKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9wdGlvblZhbHVlID8gc3RvcmUubWFwKChpdGVtKSA9PiBpdGVtLmRhdGFbb3B0aW9uVmFsdWVdKSA6IHN0b3JlO1xuICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UocmVzdWx0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUuc2V0KGl0ZW0pO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gb3B0aW9uVmFsdWUgPyBpdGVtLmRhdGFbb3B0aW9uVmFsdWVdIDogaXRlbS5kYXRhO1xuICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UocmVzdWx0KTtcbiAgICAgICAgICAgIHRoaXMuX2Nsb3NlRHJvcGRvd24oKTtcbiAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lckRpdigpPy5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9vblRvdWNoZWQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMaW1wYSBvIHZhbG9yIHNlbGVjaW9uYWRvIG5vIGNvbXBvbmVudGUgc2VsZWN0LlxuICAgICAqIFNlIG8gY29tcG9uZW50ZSBlc3RpdmVyIGRlc2FiaWxpdGFkbywgbsOjbyBleGVjdXRhIG5lbmh1bWEgYcOnw6NvLlxuICAgICAqIFBhcmEgc2VsZcOnw6NvIG3Dumx0aXBsYSwgcmVtb3ZlIHRvZG9zIG9zIHZhbG9yZXMgc2VsZWNpb25hZG9zIGUgbm90aWZpY2EgYSBhbHRlcmHDp8Ojby5cbiAgICAgKiBQYXJhIHNlbGXDp8OjbyDDum5pY2EsIGRlZmluZSBvIHZhbG9yIGNvbW8gbnVsbyBlIG5vdGlmaWNhIGEgYWx0ZXJhw6fDo28uXG4gICAgICogRmVjaGEgbyBkcm9wZG93biBlIG1hcmNhIG8gY29tcG9uZW50ZSBjb21vIFwidG9jYWRvXCIuXG4gICAgICogSW1wZWRlIGEgcHJvcGFnYcOnw6NvIGRvIGV2ZW50byBkbyBtb3VzZS5cbiAgICAgKiBAcGFyYW0gZXZlbnQgRXZlbnRvIGRvIG1vdXNlIHF1ZSBhY2lvbm91IGEgbGltcGV6YSBkYSBzZWxlw6fDo28uXG4gICAgICovXG4gICAgcHVibGljIGNsZWFyKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm11bHRpcGxlKCkpIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWVzLnNldChbXSk7XG4gICAgICAgICAgICB0aGlzLl9vbkNoYW5nZSh0aGlzLnZhbHVlcygpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWUuc2V0KG51bGwpO1xuICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UodGhpcy52YWx1ZSgpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2Nsb3NlRHJvcGRvd24oKTtcblxuICAgICAgICB0aGlzLl9vblRvdWNoZWQoKTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGltcGEgbyBmaWx0cm8gZG8gZm9ybXVsw6FyaW8sIHJlc2V0YW5kbyBvIGNhbXBvICdmaWx0ZXInIGRvIGZvcm11bMOhcmlvIGRlIGZpbHRyby5cbiAgICAgKiBFc3RlIG3DqXRvZG8gcmVkZWZpbmUgbyB2YWxvciBkbyBjYW1wbyAnZmlsdGVyJyBwYXJhIHNldSBlc3RhZG8gaW5pY2lhbCxcbiAgICAgKiByZW1vdmVuZG8gcXVhbHF1ZXIgdGV4dG8gb3UgdmFsb3IgcHJldmlhbWVudGUgaW5zZXJpZG8gcGVsbyB1c3XDoXJpby5cbiAgICAgKi9cbiAgICBwdWJsaWMgY2xlYXJGaWx0ZXIoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZmlsdGVyRm9ybS5nZXQoJ2ZpbHRlcicpPy5yZXNldCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1hbmlwdWxhIG8gZXZlbnRvIGRlIHJlZGltZW5zaW9uYW1lbnRvIGRhIGphbmVsYS5cbiAgICAgKiBGZWNoYSBvIGRyb3Bkb3duIGRlIG9ww6fDtWVzIGNhc28gZWxlIGVzdGVqYSB2aXPDrXZlbCBhbyByZWRpbWVuc2lvbmFyIGEgamFuZWxhLlxuICAgICAqIEBwYXJhbSBfIEV2ZW50byBkZSByZWRpbWVuc2lvbmFtZW50byBkYSBqYW5lbGEgKG7Do28gdXRpbGl6YWRvKS5cbiAgICAgKi9cbiAgICBwdWJsaWMgb25XaW5kb3dSZXNpemUoXzogRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuc2hvd09wdGlvbnMoKSkge1xuICAgICAgICAgICAgdGhpcy5fY2xvc2VEcm9wZG93bigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWFuaXB1bGEgbyBldmVudG8gZGUgY2xpcXVlIG5vIGVsZW1lbnRvIGNvbnRhaW5lciBkYSBzZWxlw6fDo28uXG4gICAgICogRXN0ZSBtw6l0b2RvIGFsdGVybmEgbyBlc3RhZG8gZGUgZXhpYmnDp8OjbyBkbyBjb21wb25lbnRlIHNlbGVjdCBlLFxuICAgICAqIGVtIHNlZ3VpZGEsIGRlZmluZSBvIGZvY28gbm8gZWxlbWVudG8gY29udGFpbmVyIGNvcnJlc3BvbmRlbnRlLlxuICAgICAqL1xuICAgIHB1YmxpYyBvbkNvbnRhaW5lckRpdkNsaWNrKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnRvZ2dsZSgpO1xuICAgICAgICB0aGlzLl9jb250YWluZXJEaXYoKT8ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1hbmlwdWxhIGV2ZW50b3MgZGUgdGVjbGFkbyBubyBpbnB1dCBkZSBmaWx0cm8gZG8gb3ZlcmxheS5cbiAgICAgKiAtICdBcnJvd0Rvd24nOiBNb3ZlIG8gZm9jbyBwYXJhIGEgcHJpbWVpcmEgb3DDp8OjbyBkYSBsaXN0YS5cbiAgICAgKiAtICdBcnJvd1VwJzogTW92ZSBvIGZvY28gcGFyYSBhIMO6bHRpbWEgb3DDp8OjbyBkYSBsaXN0YS5cbiAgICAgKiAtICdFc2NhcGUnOiBGZWNoYSBvIGRyb3Bkb3duIGUgcmV0b3JuYSBvIGZvY28gYW8gY29tYm9ib3guXG4gICAgICogLSAnRW50ZXInOiBTZWxlY2lvbmEgYSBvcMOnw6NvIGZvY2FkYSwgc2UgaG91dmVyLlxuICAgICAqIEBwYXJhbSBldmVudCBPIGV2ZW50byBkZSB0ZWNsYWRvIGRpc3BhcmFkbyBubyBpbnB1dCBkZSBmaWx0cm8uXG4gICAgICovXG4gICAgcHVibGljIG9uRmlsdGVyS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5maWx0ZXJlZE9wdGlvbnMoKTtcblxuICAgICAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xuICAgICAgICAgICAgY2FzZSAnQXJyb3dEb3duJzpcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2ZvY3VzTmV4dE9wdGlvbihvcHRpb25zKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0Fycm93VXAnOlxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5mb2N1c2VkSW5kZXgoKSA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5lbmh1bSBpdGVtIGZvY2FkbzogZm9jYSBvIMO6bHRpbW8gZGlzcG9uw612ZWxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsYXN0SW5kZXggPSBvcHRpb25zLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAobGFzdEluZGV4ID49IDAgJiYgb3B0aW9uc1tsYXN0SW5kZXhdLmdyb3VwZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0SW5kZXgtLTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYXN0SW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9jdXNlZEluZGV4LnNldChsYXN0SW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Njcm9sbFRvRm9jdXNlZE9wdGlvbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZm9jdXNQcmV2aW91c09wdGlvbihvcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0VzY2FwZSc6XG4gICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9jbG9zZURyb3Bkb3duKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyRGl2KCk/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0VudGVyJzpcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5mb2N1c2VkSW5kZXgoKSA+PSAwICYmIHRoaXMuZm9jdXNlZEluZGV4KCkgPCBvcHRpb25zLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdEl0ZW0ob3B0aW9uc1t0aGlzLmZvY3VzZWRJbmRleCgpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWFuaXB1bGEgZXZlbnRvcyBkZSB0ZWNsYWRvIHBhcmEgbmF2ZWdhw6fDo28gZSBzZWxlw6fDo28gZGUgb3DDp8O1ZXMgbm8gY29tcG9uZW50ZSBzZWxlY3QuXG4gICAgICogLSAnQXJyb3dEb3duJzogTW92ZSBvIGZvY28gcGFyYSBhIHByw7N4aW1hIG9ww6fDo28gZGlzcG9uw612ZWwuXG4gICAgICogLSAnQXJyb3dVcCc6IE1vdmUgbyBmb2NvIHBhcmEgYSBvcMOnw6NvIGFudGVyaW9yLlxuICAgICAqIC0gJ1RhYic6IFNlbGVjaW9uYSBhIG9ww6fDo28gYXR1YWxtZW50ZSBmb2NhZGEgZSBmZWNoYSBvIGRyb3Bkb3duLlxuICAgICAqIC0gJ0VudGVyJzogU2VsZWNpb25hIGEgb3DDp8OjbyBmb2NhZGEgc2UgbyBkcm9wZG93biBlc3RpdmVyIGFiZXJ0bywgb3UgYWx0ZXJuYSBhIGFiZXJ0dXJhIGRvIGRyb3Bkb3duLlxuICAgICAqIC0gJ0VzY2FwZSc6IEZlY2hhIG8gZHJvcGRvd24uXG4gICAgICogLSAnICc6IChiYXJyYSBkZSBlc3Bhw6dvKSBTZWxlY2lvbmEgYSBvcMOnw6NvIGZvY2FkYSBzZSBvIGRyb3Bkb3duIGVzdGl2ZXIgYWJlcnRvLCBvdSBhbHRlcm5hIGEgYWJlcnR1cmEgZG8gZHJvcGRvd24uXG4gICAgICogUHJldmluZSBvIGNvbXBvcnRhbWVudG8gcGFkcsOjbyBkbyBuYXZlZ2Fkb3IgcXVhbmRvIG5lY2Vzc8OhcmlvIHBhcmEgZ2FyYW50aXIgYSBuYXZlZ2HDp8OjbyBhZGVxdWFkYSBwZWxvIHRlY2xhZG8uXG4gICAgICogQHBhcmFtIGV2ZW50IE8gZXZlbnRvIGRlIHRlY2xhZG8gZGlzcGFyYWRvIHBlbG8gdXN1w6FyaW8uXG4gICAgICovXG4gICAgcHVibGljIG9uS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5maWx0ZXJlZE9wdGlvbnMoKTtcblxuICAgICAgICBpZiAoIW9wdGlvbnMubGVuZ3RoICYmIGV2ZW50LmtleSAhPT0gJ0VzY2FwZScgJiYgZXZlbnQua2V5ICE9PSAnRW50ZXInICYmIGV2ZW50LmtleSAhPT0gJyAnKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBfc2VsZWN0T3B0aW9uID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuZm9jdXNlZEluZGV4KCkgPj0gMCAmJiB0aGlzLmZvY3VzZWRJbmRleCgpIDwgb3B0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0SXRlbShvcHRpb25zW3RoaXMuZm9jdXNlZEluZGV4KCldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xuICAgICAgICAgICAgY2FzZSAnQXJyb3dEb3duJzpcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5zaG93T3B0aW9ucygpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9nZ2xlKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZm9jdXNOZXh0T3B0aW9uKG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0Fycm93VXAnOlxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2hvd09wdGlvbnMoKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9mb2N1c1ByZXZpb3VzT3B0aW9uKG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ1RhYic6XG4gICAgICAgICAgICAgICAgLy8gUXVhbmRvIGjDoSBmaWx0cm8gYWJlcnRvLCBUYWIgZGV2ZSBuYXZlZ2FyIHBhcmEgZGVudHJvIGRvIG92ZXJsYXkgKG7Do28gZmVjaGFyKVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNob3dPcHRpb25zKCkgJiYgdGhpcy5maWx0ZXIoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF9zZWxlY3RPcHRpb24oKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9jbG9zZURyb3Bkb3duKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdFbnRlcic6XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2hvd09wdGlvbnMoKSkge1xuICAgICAgICAgICAgICAgICAgICBfc2VsZWN0T3B0aW9uKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b2dnbGUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdFc2NhcGUnOlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNob3dPcHRpb25zKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX2Nsb3NlRHJvcGRvd24oKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJyAnOlxuICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2hvd09wdGlvbnMoKSkge1xuICAgICAgICAgICAgICAgICAgICBfc2VsZWN0T3B0aW9uKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b2dnbGUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXRvcm5hIG8gcsOzdHVsbyAobGFiZWwpIGFzc29jaWFkbyBhIHVtYSBvcMOnw6NvIGZvcm5lY2lkYS5cbiAgICAgKiBAcGFyYW0gb3B0aW9uIC0gQSBvcMOnw6NvIGRvIHRpcG8gVCBwYXJhIGEgcXVhbCBvIHLDs3R1bG8gZGV2ZSBzZXIgb2J0aWRvLlxuICAgICAqIEByZXR1cm5zIE8gcsOzdHVsbyBkYSBvcMOnw6NvIGNvbW8gdW1hIHN0cmluZy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0T3B0aW9uTGFiZWwob3B0aW9uOiBUKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldExhYmVsRnJvbU9wdGlvbihvcHRpb24pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZ1bsOnw6NvIGRlIHRyYWNrQnkgdXRpbGl6YWRhIGVtIGRpcmV0aXZhcyAqbmdGb3IgcGFyYSBvdGltaXphciBhIHJlbmRlcml6YcOnw6NvIGRlIGxpc3Rhcy5cbiAgICAgKiBSZXRvcm5hIG8gaWRlbnRpZmljYWRvciDDum5pY28gKGBpZGApIGRlIGNhZGEgaXRlbSBkbyB0aXBvIGBJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+YC5cbiAgICAgKiBAcGFyYW0gXyAtIMONbmRpY2UgZG8gaXRlbSBuYSBsaXN0YSAobsOjbyB1dGlsaXphZG8pLlxuICAgICAqIEBwYXJhbSBpdGVtIC0gTyBpdGVtIGF0dWFsIGRhIGxpc3RhIGRvIHRpcG8gYEludGVybmFsRHJvcGRvd25PcHRpb248VD5gLlxuICAgICAqIEByZXR1cm5zIE8gaWRlbnRpZmljYWRvciDDum5pY28gZG8gaXRlbSBjb21vIHVtYSBzdHJpbmcuXG4gICAgICovXG4gICAgcHVibGljIHRyYWNrQnlJZChfOiBudW1iZXIsIGl0ZW06IEludGVybmFsRHJvcGRvd25PcHRpb248VD4pOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gaXRlbS5pZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBWZXJpZmljYSBzZSBhIG9ww6fDo28gZm9ybmVjaWRhIGVzdMOhIHNlbGVjaW9uYWRhLlxuICAgICAqIEBwYXJhbSBvcHRpb24gLSBBIG9ww6fDo28gaW50ZXJuYSBkbyBkcm9wZG93biBhIHNlciB2ZXJpZmljYWRhLlxuICAgICAqIEByZXR1cm5zIGB0cnVlYCBzZSBhIG9ww6fDo28gZXN0aXZlciBzZWxlY2lvbmFkYSwgY2FzbyBjb250csOhcmlvIGBmYWxzZWAuXG4gICAgICovXG4gICAgcHVibGljIGlzT3B0aW9uU2VsZWN0ZWQob3B0aW9uOiBJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICB0aGlzLnZhbHVlcygpLmZpbmQoKG8pID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbyA9PT0gb3B0aW9uO1xuICAgICAgICAgICAgfSkgIT09IHVuZGVmaW5lZFxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFsdGVybmEgYSBzZWxlw6fDo28gZGUgdG9kb3Mgb3MgaXRlbnMgZGlzcG9uw612ZWlzLlxuICAgICAqIFNlIG8gbW9kbyBtw7psdGlwbG8gZXN0aXZlciBhdGl2YWRvLCBzZWxlY2lvbmEgdG9kb3Mgb3MgaXRlbnMgZmlsdHJhZG9zIHF1ZSBuw6NvIHPDo28gYWdydXBhZG9yZXNcbiAgICAgKiBjYXNvIG5lbSB0b2RvcyBlc3RlamFtIHNlbGVjaW9uYWRvcywgb3UgbGltcGEgYSBzZWxlw6fDo28gY2FzbyB0b2RvcyBqw6EgZXN0ZWphbSBzZWxlY2lvbmFkb3MuXG4gICAgICogQXDDs3MgYSBhbHRlcmHDp8Ojbywgbm90aWZpY2EgYSBtdWRhbsOnYSBkZSB2YWxvci5cbiAgICAgKi9cbiAgICBwdWJsaWMgdG9nZ2xlU2VsZWN0QWxsKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMubXVsdGlwbGUoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuZmlsdGVyZWRPcHRpb25zKCkuZmlsdGVyKChvcHRpb24pID0+ICFvcHRpb24uZ3JvdXBlcik7XG5cbiAgICAgICAgaWYgKHRoaXMuYWxsU2VsZWN0ZWQoKSkge1xuICAgICAgICAgICAgdGhpcy52YWx1ZXMuc2V0KFtdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudmFsdWVzLnNldChvcHRpb25zKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX29uQ2hhbmdlKHRoaXMudmFsdWVzKCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldG9ybmEgbyByw7N0dWxvIChsYWJlbCkgZGUgdW1hIG9ww6fDo28gZm9ybmVjaWRhLlxuICAgICAqIEVzdGUgbcOpdG9kbyB1dGlsaXphIGEgcHJvcHJpZWRhZGUgZGVmaW5pZGEgcG9yIGBvcHRpb25MYWJlbGAgcGFyYSBleHRyYWlyIG8gdmFsb3IgZG8gcsOzdHVsbyBkYSBvcMOnw6NvLlxuICAgICAqIENhc28gYG9wdGlvbkxhYmVsYCBuw6NvIGVzdGVqYSBkZWZpbmlkbywgcmV0b3JuYSBhIHJlcHJlc2VudGHDp8OjbyBlbSBzdHJpbmcgZGEgcHLDs3ByaWEgb3DDp8Ojby5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSBvcHRpb24gQSBvcMOnw6NvIGRhIHF1YWwgbyByw7N0dWxvIHNlcsOhIGV4dHJhw61kby5cbiAgICAgKiBAcmV0dXJucyBPIHLDs3R1bG8gZGEgb3DDp8OjbyBjb21vIHVtYSBzdHJpbmcuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfZ2V0TGFiZWxGcm9tT3B0aW9uKG9wdGlvbjogVCk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IG9wdGlvbkxhYmVsID0gdGhpcy5vcHRpb25MYWJlbCgpO1xuICAgICAgICByZXR1cm4gb3B0aW9uTGFiZWwgPyBTdHJpbmcob3B0aW9uW29wdGlvbkxhYmVsXSkgOiBTdHJpbmcob3B0aW9uKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBWYWxpZGEgYXMgZW50cmFkYXMgZG8gY29tcG9uZW50ZSBkZSBzZWxlw6fDo28uXG4gICAgICogRXN0ZSBtw6l0b2RvIHZlcmlmaWNhIHNlIGFzIG9ww6fDtWVzIGZvcm5lY2lkYXMgc8OjbyB2w6FsaWRhcy4gQ2FzbyBhcyBvcMOnw7VlcyBzZWphbSBvYmpldG9zLFxuICAgICAqIGdhcmFudGUgcXVlIGEgcHJvcHJpZWRhZGUgYG9wdGlvbkxhYmVsYCBlc3RlamEgZGVmaW5pZGEsIGxhbsOnYW5kbyB1bSBlcnJvIGNhc28gY29udHLDoXJpby5cbiAgICAgKiBTZSBuw6NvIGhvdXZlciBvcMOnw7VlcywgYSB2YWxpZGHDp8OjbyDDqSBpZ25vcmFkYS5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSBTZSBhcyBvcMOnw7VlcyBmb3JlbSBvYmpldG9zIGUgYG9wdGlvbkxhYmVsYCBuw6NvIGVzdGl2ZXIgZGVmaW5pZG8uXG4gICAgICovXG4gICAgcHJpdmF0ZSBfdmFsaWRhdGVJbnB1dHMoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMoKTtcblxuICAgICAgICBpZiAoIW9wdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBoYXNPYmplY3RPcHRpb25zID0gb3B0aW9ucy5zb21lKChvcHRpb24pID0+IHR5cGVvZiBvcHRpb24gPT09ICdvYmplY3QnICYmIG9wdGlvbiAhPT0gbnVsbCk7XG5cbiAgICAgICAgaWYgKGhhc09iamVjdE9wdGlvbnMpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25MYWJlbCgpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgXCJvcHRpb25MYWJlbFwiIGlucHV0IGlzIHJlcXVpcmVkIHdoZW4gb3B0aW9ucyBhcmUgb2JqZWN0cy4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFzc29jaWEgdW0gYDxsYWJlbCBmb3I9XCIuLi5cIj5gIGV4dGVybm8gKHF1ZSBhcG9udGEgcGFyYSBvIGBpZGAgZG8gaG9zdCkgYW9cbiAgICAgKiBjb21ib2JveCBpbnRlcm5vLCByZXNvbHZlbmRvIG8gcHJvYmxlbWEgZGUgXCJvcnBoYW5lZCBsYWJlbFwiLlxuICAgICAqXG4gICAgICogQ29tbyBvIGhvc3QgYHMtc2VsZWN0YCBuw6NvIMOpIHVtIGVsZW1lbnRvIHJvdHVsw6F2ZWwgKGxhYmVsYWJsZSksIG8gYGZvcmAgbsOjb1xuICAgICAqIGNyaWEgdsOtbmN1bG8gcHJvZ3JhbcOhdGljby4gRXN0ZSBtw6l0b2RvOlxuICAgICAqIC0gbG9jYWxpemEgbyBsYWJlbCBxdWUgcmVmZXJlbmNpYSBvIGBpZGAgZG8gaG9zdDtcbiAgICAgKiAtIGdhcmFudGUgcXVlIGVzc2UgbGFiZWwgdGVuaGEgdW0gYGlkYDtcbiAgICAgKiAtIGFwb250YSBvIGBhcmlhLWxhYmVsbGVkYnlgIGRvIGNvbWJvYm94IHBhcmEgZXNzZSBsYWJlbDtcbiAgICAgKiAtIGFkaWNpb25hIHVtIGNsaXF1ZSBubyBsYWJlbCBwYXJhIGZvY2FyIG8gY29tYm9ib3ggKGVxdWl2YWxlbnRlIGFvIGBmb3JgKS5cbiAgICAgKlxuICAgICAqIE7Do28gc29icmVzY3JldmUgdW0gYGFyaWFMYWJlbGxlZEJ5YCBleHBsw61jaXRvIGluZm9ybWFkbyBwZWxvIGNvbnN1bWlkb3IuXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIF9hc3NvY2lhdGVFeHRlcm5hbExhYmVsKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5hcmlhTGFiZWxsZWRCeSgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBob3N0SWQgPSB0aGlzLl9ob3N0UmVmLm5hdGl2ZUVsZW1lbnQuaWQ7XG4gICAgICAgIGlmICghaG9zdElkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsYWJlbCA9IHRoaXMuX2ZpbmRMYWJlbEZvcihob3N0SWQpO1xuICAgICAgICBpZiAoIWxhYmVsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWxhYmVsLmlkKSB7XG4gICAgICAgICAgICB0aGlzLl9yZW5kZXJlci5zZXRBdHRyaWJ1dGUobGFiZWwsICdpZCcsIGAke3RoaXMuY29tcG9uZW50SWR9LWxhYmVsYCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlc29sdmVkQXJpYUxhYmVsbGVkQnkuc2V0KGxhYmVsLmlkKTtcblxuICAgICAgICAvLyBPIGF0cmlidXRvIGBmb3JgIG7Do28gZnVuY2lvbmEgZW0gaG9zdCBuw6NvLXJvdHVsw6F2ZWwsIGVudMOjbyByZXBsaWNhbW9zXG4gICAgICAgIC8vIG8gY29tcG9ydGFtZW50byBkZSBcImNsaWNhciBubyBsYWJlbCBmb2NhIG8gY29udHJvbGVcIiBtYW51YWxtZW50ZS5cbiAgICAgICAgdGhpcy5fY2xpY2thYmxlTGFiZWwgPSBsYWJlbDtcbiAgICAgICAgbGFiZWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9vbkxhYmVsQ2xpY2spO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvY2FsaXphIG8gYDxsYWJlbD5gIGN1am8gYXRyaWJ1dG8gYGZvcmAgY29ycmVzcG9uZGUgYW8gaWQgaW5mb3JtYWRvLlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIGhvc3RJZCBJZCBkbyBob3N0IHJlZmVyZW5jaWFkbyBwZWxvIGxhYmVsLlxuICAgICAqIEByZXR1cm5zIE8gZWxlbWVudG8gbGFiZWwgY29ycmVzcG9uZGVudGUgb3UgYG51bGxgLlxuICAgICAqL1xuICAgIHByaXZhdGUgX2ZpbmRMYWJlbEZvcihob3N0SWQ6IHN0cmluZyk6IEhUTUxMYWJlbEVsZW1lbnQgfCBudWxsIHtcbiAgICAgICAgY29uc3QgbGFiZWxzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbDxIVE1MTGFiZWxFbGVtZW50PignbGFiZWxbZm9yXScpO1xuICAgICAgICBmb3IgKGNvbnN0IGxhYmVsIG9mIEFycmF5LmZyb20obGFiZWxzKSkge1xuICAgICAgICAgICAgaWYgKGxhYmVsLmdldEF0dHJpYnV0ZSgnZm9yJykgPT09IGhvc3RJZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBsYWJlbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNb3ZlIG8gZm9jbyBwYXJhIG8gY29tYm9ib3ggaW50ZXJubyBhbyBjbGljYXIgbm8gbGFiZWwgZXh0ZXJubyBhc3NvY2lhZG8uXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9vbkxhYmVsQ2xpY2sgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jb250YWluZXJEaXYoKT8ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBGZWNoYSBvIGRyb3Bkb3duIGRlIG9ww6fDtWVzIGRvIGNvbXBvbmVudGUgc2VsZWN0LlxuICAgICAqIEVzdGUgbcOpdG9kbyBvY3VsdGEgYXMgb3DDp8O1ZXMgZGlzcG9uw612ZWlzIGUgcmVkZWZpbmUgbyDDrW5kaWNlIGRvIGl0ZW0gZm9jYWRvIHBhcmEgLTEsXG4gICAgICogaW5kaWNhbmRvIHF1ZSBuZW5odW0gaXRlbSBlc3TDoSBhdHVhbG1lbnRlIGZvY2Fkby5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgX2Nsb3NlRHJvcGRvd24oKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2hvd09wdGlvbnMuc2V0KGZhbHNlKTtcbiAgICAgICAgdGhpcy5mb2N1c2VkSW5kZXguc2V0KC0xKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGljaW9uYSB1bSBpZGVudGlmaWNhZG9yIMO6bmljbyBhIGNhZGEgb3DDp8OjbyBmb3JuZWNpZGEuXG4gICAgICogUGFyYSBjYWRhIGl0ZW0gbm8gYXJyYXkgZGUgb3DDp8O1ZXMsIGdlcmEgdW0gb2JqZXRvIGBJbnRlcm5hbERyb3Bkb3duT3B0aW9uYCBjb250ZW5kbyBvIGRhZG8gb3JpZ2luYWxcbiAgICAgKiBlIHVtIGNhbXBvIGBpZGAgw7puaWNvIGJhc2VhZG8gbm8gdGltZXN0YW1wIGF0dWFsIGUgbm8gw61uZGljZSBkbyBpdGVtLiBDYXNvIGEgb3DDp8OjbyBzZWphIHVtIGdydXBvXG4gICAgICogKGRldGVjdGFkbyBwZWxhIHByZXNlbsOnYSBkZSB1bSBhcnJheSBgaXRlbXNgKSwgYWRpY2lvbmEgdGFtYsOpbSBhIHByb3ByaWVkYWRlIGBncm91cGVyOiB0cnVlYC5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSBvcHRpb25zIEFycmF5IGRlIG9ww6fDtWVzIGRvIHRpcG8gYFRgIGEgc2VyZW0gcHJvY2Vzc2FkYXMuXG4gICAgICogQHJldHVybnMgVW0gYXJyYXkgZGUgb2JqZXRvcyBgSW50ZXJuYWxEcm9wZG93bk9wdGlvbjxUPmAgY29tIGlkZW50aWZpY2Fkb3JlcyDDum5pY29zLlxuICAgICAqL1xuICAgIHByaXZhdGUgX2FkZElkVG9PcHRpb25zKG9wdGlvbnM6IFRbXSk6IEludGVybmFsRHJvcGRvd25PcHRpb248VD5bXSB7XG4gICAgICAgIGNvbnN0IHRpbWVzdGFtcCA9IERhdGUubm93KCk7XG5cbiAgICAgICAgcmV0dXJuIG9wdGlvbnMubWFwKChvcHRpb24sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5ncm91cCgpICYmIEFycmF5LmlzQXJyYXkoKG9wdGlvbiBhcyBhbnkpLml0ZW1zKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IG9wdGlvbixcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGBpZF8ke3RpbWVzdGFtcH1fJHtpbmRleCsrfWAsXG4gICAgICAgICAgICAgICAgICAgIGdyb3VwZXI6IHRydWUsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBkYXRhOiBvcHRpb24sXG4gICAgICAgICAgICAgICAgaWQ6IGBpZF8ke3RpbWVzdGFtcH1fJHtpbmRleCsrfWAsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0ZSB1bWEgbGlzdGEgZGUgb3DDp8O1ZXMgcG9zc2l2ZWxtZW50ZSBhZ3J1cGFkYXMgZW0gdW1hIGxpc3RhIHBsYW5hIGRlIG9ww6fDtWVzLlxuICAgICAqIFBhcmEgY2FkYSBvcMOnw6NvIHF1ZSBwb3NzdWkgdW0gYWdydXBhZG9yIChgZ3JvdXBlcmApIGUgdW0gYXJyYXkgZGUgaXRlbnMgZW0gYGRhdGEuaXRlbXNgLFxuICAgICAqIGFkaWNpb25hIGEgb3DDp8OjbyBkbyBhZ3J1cGFkb3IgZSwgZW0gc2VndWlkYSwgYWRpY2lvbmEgY2FkYSBpdGVtIGRvIGdydXBvIGNvbW8gdW1hIG5vdmEgb3DDp8Ojb1xuICAgICAqIGluZGl2aWR1YWwsIGF0cmlidWluZG8gdW0gYGlkYCDDum5pY28gcGFyYSBjYWRhIGl0ZW0gZG8gZ3J1cG8uXG4gICAgICogQ2FzbyBhIG9ww6fDo28gbsOjbyBzZWphIHVtIGFncnVwYWRvciwgZWxhIMOpIGFkaWNpb25hZGEgZGlyZXRhbWVudGUgYW8gcmVzdWx0YWRvLlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHBhcmFtIG9wdGlvbnMgTGlzdGEgZGUgb3DDp8O1ZXMgaW50ZXJuYXMgZG8gZHJvcGRvd24sIHBvZGVuZG8gY29udGVyIGFncnVwYWRvcmVzLlxuICAgICAqIEByZXR1cm5zIExpc3RhIHBsYW5hIGRlIG9ww6fDtWVzLCBpbmNsdWluZG8gYWdydXBhZG9yZXMgZSBzZXVzIGl0ZW5zIGV4cGFuZGlkb3MuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfZ3JvdXBlclRvRmxhdChvcHRpb25zOiBJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+W10pOiBJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+W10ge1xuICAgICAgICBjb25zdCByZXN1bHQ6IEludGVybmFsRHJvcGRvd25PcHRpb248VD5bXSA9IFtdO1xuXG4gICAgICAgIG9wdGlvbnMuZm9yRWFjaCgob3B0aW9uKSA9PiB7XG4gICAgICAgICAgICBpZiAob3B0aW9uLmdyb3VwZXIgJiYgQXJyYXkuaXNBcnJheSgob3B0aW9uLmRhdGEgYXMgYW55KS5pdGVtcykpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChvcHRpb24pO1xuICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VwSXRlbXMgPSAob3B0aW9uLmRhdGEgYXMgYW55KS5pdGVtcy5tYXAoKGl0ZW06IFQsIGluZGV4OiBudW1iZXIpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IGl0ZW0sXG4gICAgICAgICAgICAgICAgICAgIGlkOiBgJHtvcHRpb24uaWR9X2l0ZW1fJHtpbmRleH1gLFxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCguLi5ncm91cEl0ZW1zKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gob3B0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNb3ZlIG8gZm9jbyBwYXJhIGEgcHLDs3hpbWEgb3DDp8OjbyBkaXNwb27DrXZlbCBuYSBsaXN0YSwgaWdub3JhbmRvIG9ww6fDtWVzIHF1ZSBzZWphbSBhZ3J1cGFkb3Jlcy5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSBvcHRpb25zIExpc3RhIGRlIG9ww6fDtWVzIGludGVybmFzIGRvIGRyb3Bkb3duLlxuICAgICAqL1xuICAgIHByaXZhdGUgX2ZvY3VzTmV4dE9wdGlvbihvcHRpb25zOiBJbnRlcm5hbERyb3Bkb3duT3B0aW9uPFQ+W10pIHtcbiAgICAgICAgbGV0IG5leHRJbmRleCA9IHRoaXMuZm9jdXNlZEluZGV4KCkgKyAxO1xuXG4gICAgICAgIHdoaWxlIChuZXh0SW5kZXggPCBvcHRpb25zLmxlbmd0aCAmJiBvcHRpb25zW25leHRJbmRleF0uZ3JvdXBlcikge1xuICAgICAgICAgICAgbmV4dEluZGV4Kys7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobmV4dEluZGV4IDwgb3B0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNlZEluZGV4LnNldChuZXh0SW5kZXgpO1xuICAgICAgICAgICAgdGhpcy5fc2Nyb2xsVG9Gb2N1c2VkT3B0aW9uKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNb3ZlIG8gZm9jbyBwYXJhIGEgb3DDp8OjbyBhbnRlcmlvciBuYSBsaXN0YSwgaWdub3JhbmRvIG9ww6fDtWVzIGRvIHRpcG8gXCJncm91cGVyXCIuXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyBMaXN0YSBkZSBvcMOnw7VlcyBpbnRlcm5hcyBkbyBkcm9wZG93bi5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9mb2N1c1ByZXZpb3VzT3B0aW9uKG9wdGlvbnM6IEludGVybmFsRHJvcGRvd25PcHRpb248VD5bXSkge1xuICAgICAgICBsZXQgcHJldkluZGV4ID0gdGhpcy5mb2N1c2VkSW5kZXgoKSAtIDE7XG5cbiAgICAgICAgd2hpbGUgKHByZXZJbmRleCA+PSAwICYmIG9wdGlvbnNbcHJldkluZGV4XS5ncm91cGVyKSB7XG4gICAgICAgICAgICBwcmV2SW5kZXgtLTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcmV2SW5kZXggPj0gMCkge1xuICAgICAgICAgICAgdGhpcy5mb2N1c2VkSW5kZXguc2V0KHByZXZJbmRleCk7XG4gICAgICAgICAgICB0aGlzLl9zY3JvbGxUb0ZvY3VzZWRPcHRpb24oKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJvbGEgYSBsaXN0YSBkZSBvcMOnw7VlcyBwYXJhIGdhcmFudGlyIHF1ZSBhIG9ww6fDo28gYXR1YWxtZW50ZSBmb2NhZGEgZXN0ZWphIHZpc8OtdmVsLlxuICAgICAqIEVzdGUgbcOpdG9kbyBvYnTDqW0gbyBJRCBkYSBvcMOnw6NvIGF0dWFsbWVudGUgZm9jYWRhIGEgcGFydGlyIGRhIGxpc3RhIGRlIG9ww6fDtWVzIGZpbHRyYWRhcy5cbiAgICAgKiBTZSB1bSBJRCB2w6FsaWRvIGZvciBlbmNvbnRyYWRvLCBidXNjYSBvIGVsZW1lbnRvIGNvcnJlc3BvbmRlbnRlIG5vIERPTSBlIHV0aWxpemFcbiAgICAgKiBgc2Nyb2xsSW50b1ZpZXdgIHBhcmEgcm9sYXIgYXTDqSBhIG9ww6fDo28sIGFsaW5oYW5kby1hIGFvIGJsb2NvIG1haXMgcHLDs3hpbW8uXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIF9zY3JvbGxUb0ZvY3VzZWRPcHRpb24oKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGlkID0gdGhpcy5maWx0ZXJlZE9wdGlvbnMoKVt0aGlzLmZvY3VzZWRJbmRleCgpXT8uaWQ7XG5cbiAgICAgICAgaWYgKCFpZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG4gICAgICAgIGVsPy5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiAnbmVhcmVzdCcgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVmaW5lIG8gZm9jbyBubyBpdGVtIGF0dWFsbWVudGUgc2VsZWNpb25hZG8gYW8gYWJyaXIgbyBkcm9wZG93bi5cbiAgICAgKiBObyBtb2RvIHNpbXBsZXMsIGZvY2EgbyBpdGVtIHNlbGVjaW9uYWRvLiBObyBtb2RvIG3Dumx0aXBsbywgZm9jYSBvIHByaW1laXJvIGl0ZW0gc2VsZWNpb25hZG8uXG4gICAgICogQXDDs3MgcmVuZGVyaXphw6fDo28gZG8gb3ZlcmxheSwgcm9sYSBhIGxpc3RhIGF0w6kgbyBpdGVtIGZvY2Fkby5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHByaXZhdGUgX2ZvY3VzU2VsZWN0ZWRPcHRpb24oKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmZpbHRlcmVkT3B0aW9ucygpO1xuICAgICAgICBsZXQgc2VsZWN0ZWRJbmRleCA9IC0xO1xuXG4gICAgICAgIGlmICh0aGlzLm11bHRpcGxlKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpcnN0U2VsZWN0ZWQgPSB0aGlzLnZhbHVlcygpWzBdO1xuICAgICAgICAgICAgaWYgKGZpcnN0U2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICBzZWxlY3RlZEluZGV4ID0gb3B0aW9ucy5maW5kSW5kZXgoKG8pID0+IG8uaWQgPT09IGZpcnN0U2VsZWN0ZWQuaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLnZhbHVlKCk7XG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICBzZWxlY3RlZEluZGV4ID0gb3B0aW9ucy5maW5kSW5kZXgoKG8pID0+IG8uaWQgPT09IHNlbGVjdGVkLmlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZm9jdXNlZEluZGV4LnNldChzZWxlY3RlZEluZGV4KTtcblxuICAgICAgICBpZiAoc2VsZWN0ZWRJbmRleCA+PSAwKSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuX3Njcm9sbFRvRm9jdXNlZE9wdGlvbigpKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuIiwiPGRpdlxuICAgICNjb250YWluZXJEaXZcbiAgICBjZGtPdmVybGF5T3JpZ2luXG4gICAgI3RyaWdnZXI9XCJjZGtPdmVybGF5T3JpZ2luXCJcbiAgICBjbGFzcz1cInNlbGVjdC1jb250YWluZXIgZ3JvdXAgZmxleCBoLVszNXB4XSB3LWZ1bGwgb3ZlcmZsb3ctaGlkZGVuIHJvdW5kZWQtWzNweF0gYm9yZGVyIG91dGxpbmUtMSBvdXRsaW5lLXByaW1hcnkgZm9jdXM6b3V0bGluZVwiXG4gICAgW2NsYXNzLnBvaW50ZXItZXZlbnRzLW5vbmVdPVwiZGlzYWJsZWQoKVwiXG4gICAgW2NsYXNzLmJvcmRlci1ncmF5c2NhbGUtMjBdPVwiZGlzYWJsZWQoKVwiXG4gICAgW2NsYXNzLmJnLWdyYXlzY2FsZS01XT1cImRpc2FibGVkKClcIlxuICAgIFtjbGFzcy5wb2ludGVyLWV2ZW50cy1hdXRvXT1cIiFkaXNhYmxlZCgpXCJcbiAgICBbY2xhc3MuYm9yZGVyLWdyYXlzY2FsZS0zMF09XCIhZGlzYWJsZWQoKVwiXG4gICAgW2NsYXNzLmJnLWdyYXlzY2FsZS0wXT1cIiFkaXNhYmxlZCgpXCJcbiAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cImRpc2FibGVkKClcIlxuICAgIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwic2hvd09wdGlvbnMoKVwiXG4gICAgW2F0dHIuYXJpYS1oYXNwb3B1cF09XCInbGlzdGJveCdcIlxuICAgIFthdHRyLmFyaWEtY29udHJvbHNdPVwiY29tcG9uZW50SWQgKyAnLWxpc3Rib3gnXCJcbiAgICBbYXR0ci5hcmlhLW93bnNdPVwic2hvd09wdGlvbnMoKSA/IGNvbXBvbmVudElkICsgJy1saXN0Ym94JyA6IG51bGxcIlxuICAgIFthdHRyLmFyaWEtYWN0aXZlZGVzY2VuZGFudF09XCJzaG93T3B0aW9ucygpID8gZm9jdXNlZE9wdGlvbklkKCkgOiBudWxsXCJcbiAgICByb2xlPVwiY29tYm9ib3hcIlxuICAgIFtpZF09XCJjb21wb25lbnRJZCArICctY29tYm9ib3gnXCJcbiAgICAoY2xpY2spPVwib25Db250YWluZXJEaXZDbGljaygpXCJcbiAgICAoa2V5ZG93bik9XCJvbktleURvd24oJGV2ZW50KVwiXG4gICAgdGFiaW5kZXg9XCIwXCJcbiAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImFyaWFMYWJlbCgpIHx8IG51bGxcIlxuICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCJyZXNvbHZlZEFyaWFMYWJlbGxlZEJ5KCkgfHwgbnVsbFwiXG4+XG4gICAgPHNwYW5cbiAgICAgICAgY2xhc3M9XCJmbGV4IGZsZXgtZ3JvdyBzZWxlY3Qtbm9uZSBweC0zIHB5LVs3cHhdXCJcbiAgICAgICAgW2NsYXNzLnRleHQtZ3JheXNjYWxlLTkwXT1cIiFkaXNhYmxlZCgpICYmICFpc0NsZWFuKClcIlxuICAgICAgICBbY2xhc3MudGV4dC1ncmF5c2NhbGUtNjBdPVwiIWRpc2FibGVkKCkgJiYgaXNDbGVhbigpXCJcbiAgICAgICAgW2NsYXNzLnRleHQtZ3JheXNjYWxlLTMwXT1cImRpc2FibGVkKClcIlxuICAgID5cbiAgICAgICAge3sgcHJpbnQoKSB8fCBwbGFjZWhvbGRlcigpIH19XG4gICAgPC9zcGFuPlxuXG4gICAgQGlmICghZGlzYWJsZWQoKSAmJiBzaG93Q2xlYXIoKSAmJiAhaXNDbGVhbigpKSB7XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIGNsYXNzPVwibXgtM1wiXG4gICAgICAgICAgICAoY2xpY2spPVwiY2xlYXIoJGV2ZW50KVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuYXJpYV9jbGVhcl9zZWxlY3Rpb24nIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZhcyBmYS10aW1lcyBmbGV4IGl0ZW1zLWNlbnRlclwiXG4gICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgID48L2k+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgIH1cblxuICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJkcm9wZG93bi1jb250YWluZXIgZmxleCBpdGVtcy1jZW50ZXIgYm9yZGVyLWwgcHgtMyBncm91cC1ob3ZlcjpiZy1ncmF5c2NhbGUtMTAgZ3JvdXAtZm9jdXM6Ym9yZGVyLXByaW1hcnlcIlxuICAgICAgICBbY2xhc3MuYm9yZGVyLWdyYXlzY2FsZS0yMF09XCJkaXNhYmxlZCgpXCJcbiAgICAgICAgW2NsYXNzLmJvcmRlci1ncmF5c2NhbGUtMzBdPVwiIWRpc2FibGVkKClcIlxuICAgID5cbiAgICAgICAgPGlcbiAgICAgICAgICAgIGNsYXNzPVwiZmFzXCJcbiAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICBbY2xhc3MudGV4dC1ncmF5c2NhbGUtMzBdPVwiZGlzYWJsZWQoKVwiXG4gICAgICAgICAgICBbY2xhc3MudGV4dC1ncmF5c2NhbGUtOTBdPVwiIWRpc2FibGVkKClcIlxuICAgICAgICAgICAgW2NsYXNzLmZhLWNhcmV0LWRvd25dPVwiIXNob3dPcHRpb25zKClcIlxuICAgICAgICAgICAgW2NsYXNzLmZhLWNhcmV0LXVwXT1cInNob3dPcHRpb25zKClcIlxuICAgICAgICA+PC9pPlxuICAgIDwvZGl2PlxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZVxuICAgICNkcm9wZG93blRlbXBsYXRlXG4gICAgY2RrQ29ubmVjdGVkT3ZlcmxheVxuICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5T3JpZ2luXT1cInRyaWdnZXJcIlxuICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5T3Blbl09XCJzaG93T3B0aW9ucygpXCJcbiAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheUhhc0JhY2tkcm9wXT1cInRydWVcIlxuICAgIChiYWNrZHJvcENsaWNrKT1cInNob3dPcHRpb25zLnNldChmYWxzZSlcIlxuICAgIGNka0Nvbm5lY3RlZE92ZXJsYXlCYWNrZHJvcENsYXNzPVwiY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3BcIlxuICAgIChkZXRhY2gpPVwic2hvd09wdGlvbnMuc2V0KGZhbHNlKVwiXG4+XG4gICAgPGRpdlxuICAgICAgICBbaWRdPVwiY29tcG9uZW50SWQgKyAnLWxpc3Rib3gnXCJcbiAgICAgICAgY2xhc3M9XCJkcm9wZG93bi1ib2R5LWNsYXNzIHotWzEwMDBdIHJvdW5kZWQtWzNweF0gYmctZ3JheXNjYWxlLTAgcHktMSBzaGFkb3ctbWRcIlxuICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cImNvbnRhaW5lckRpdi5vZmZzZXRXaWR0aFwiXG4gICAgICAgIFthdHRyLmFyaWEtbXVsdGlzZWxlY3RhYmxlXT1cIm11bHRpcGxlKCkgPyB0cnVlIDogbnVsbFwiXG4gICAgICAgIFtAdmlzaWJpbGl0eUNoYW5nZWRdXG4gICAgICAgIHJvbGU9XCJsaXN0Ym94XCJcbiAgICA+XG4gICAgICAgIEBpZiAoZmlsdGVyKCkpIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IHctZnVsbCBpdGVtcy1jZW50ZXIgZ2FwLTMgcHgtMyBweS0xLjVcIj5cbiAgICAgICAgICAgICAgICBAaWYgKG11bHRpcGxlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgPHMtY2hlY2tib3hcbiAgICAgICAgICAgICAgICAgICAgICAgICNzZWxlY3RBbGxDaGVja2JveFxuICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwiYWxsU2VsZWN0ZWQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaW5kZXRlcm1pbmF0ZV09XCJzZWxlY3RBbGxJc0luZGV0ZXJtaW5hdGUoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2hlY2tlZENoYW5nZSk9XCJ0b2dnbGVTZWxlY3RBbGwoKVwiXG4gICAgICAgICAgICAgICAgICAgID48L3MtY2hlY2tib3g+XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlbGF0aXZlIGZsZXggaC1bMzVweF0gZ3Jvd1wiPlxuICAgICAgICAgICAgICAgICAgICA8Zm9ybVxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IHctZnVsbCBncm93XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtR3JvdXBdPVwiZmlsdGVyRm9ybVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICNmaWx0ZXJJbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidy1mdWxsIGdyb3cgcm91bmRlZC1bM3B4XSBib3JkZXIgYm9yZGVyLWdyYXlzY2FsZS0zMCBwbC0yLjUgcHItNyBvdXRsaW5lLTEgb3V0bGluZS1wcmltYXJ5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZmlsdGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJvbkZpbHRlcktleURvd24oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmZpbHRlcl9vcHRpb25zJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1jb250cm9sc109XCJjb21wb25lbnRJZCArICctbGlzdGJveCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtYWN0aXZlZGVzY2VuZGFudF09XCJmb2N1c2VkT3B0aW9uSWQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvZm9ybT5cbiAgICAgICAgICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmFzIGZhLXNlYXJjaCBhYnNvbHV0ZSByaWdodC0yLjUgdG9wLTIuNSB0ZXh0LWdyYXlzY2FsZS05MFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNsZWFyRmlsdGVyKClcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuY2xlYXJfZmlsdGVyJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYXMgZmEtdGltZXMgZmxleCBpdGVtcy1jZW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG5cbiAgICAgICAgPCEtLSBWaXJ0dWFsIHNjcm9sbCAtLT5cbiAgICAgICAgQGlmICh2aXJ0dWFsU2Nyb2xsKCkgJiYgZmlsdGVyZWRPcHRpb25zKCkubGVuZ3RoID4gMTApIHtcbiAgICAgICAgICAgIDxjZGstdmlydHVhbC1zY3JvbGwtdmlld3BvcnRcbiAgICAgICAgICAgICAgICBbaXRlbVNpemVdPVwidmlydHVhbFNjcm9sbEl0ZW1TaXplKClcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiaC01MiBvdmVyZmxvdy1hdXRvXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpjZGtWaXJ0dWFsRm9yPVwibGV0IG9wdGlvbiBvZiBmaWx0ZXJlZE9wdGlvbnMoKTsgdHJhY2tCeTogdHJhY2tCeUlkXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzLXNlbGVjdC1vcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIFtpZF09XCJvcHRpb24uaWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cImdldE9wdGlvbkxhYmVsKG9wdGlvbi5kYXRhKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbXVsdGlwbGVdPVwibXVsdGlwbGUoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2ttYXJrXT1cImNoZWNrbWFyaygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpc1NlbGVjdGVkXT1cImlzT3B0aW9uU2VsZWN0ZWQob3B0aW9uKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0ZWQpPVwic2VsZWN0SXRlbShvcHRpb24pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpc0dyb3VwZXJdPVwib3B0aW9uLmdyb3VwZXIgPz8gZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2lzRm9jdXNlZF09XCJvcHRpb24uZGF0YSA9PT0gZm9jdXNlZEl0ZW0oKVwiXG4gICAgICAgICAgICAgICAgICAgID48L3Mtc2VsZWN0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvY2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0PlxuICAgICAgICB9XG5cbiAgICAgICAgPCEtLSBOb3JtYWwgbGlzdCAtLT5cbiAgICAgICAgQGlmICghdmlydHVhbFNjcm9sbCgpIHx8IGZpbHRlcmVkT3B0aW9ucygpLmxlbmd0aCA8PSAxMCkge1xuICAgICAgICAgICAgPHVsIGNsYXNzPVwibWF4LWgtNTIgb3ZlcmZsb3ctYXV0b1wiPlxuICAgICAgICAgICAgICAgIEBmb3IgKG9wdGlvbiBvZiBmaWx0ZXJlZE9wdGlvbnMoKTsgdHJhY2sgb3B0aW9uLmlkKSB7XG4gICAgICAgICAgICAgICAgICAgIDxzLXNlbGVjdC1vcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIFtpZF09XCJvcHRpb24uaWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cImdldE9wdGlvbkxhYmVsKG9wdGlvbi5kYXRhKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbXVsdGlwbGVdPVwibXVsdGlwbGUoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2ttYXJrXT1cImNoZWNrbWFyaygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpc1NlbGVjdGVkXT1cImlzT3B0aW9uU2VsZWN0ZWQob3B0aW9uKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0ZWQpPVwic2VsZWN0SXRlbShvcHRpb24pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpc0dyb3VwZXJdPVwib3B0aW9uLmdyb3VwZXIgPz8gZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2lzRm9jdXNlZF09XCJvcHRpb24uZGF0YSA9PT0gZm9jdXNlZEl0ZW0oKVwiXG4gICAgICAgICAgICAgICAgICAgID48L3Mtc2VsZWN0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L3VsPlxuICAgICAgICB9XG5cbiAgICAgICAgQGlmIChmaWx0ZXJlZE9wdGlvbnMoKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibS0zIHRleHQtZ3JheXNjYWxlLTYwXCI+XG4gICAgICAgICAgICAgICAge3sgZW1wdHlNZXNzYWdlKCkgPz8gJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5ub19yZWNvcmRzX2ZvdW5kJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICB9XG4gICAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG4iXX0=
|