@ohioepa/oepa-ui-lib 1.1.0 → 1.2.1
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/esm2022/lib/account-search-input/account-search-input.component.mjs +11 -19
- package/esm2022/lib/account-search-input/account-search.service.mjs +31 -0
- package/esm2022/lib/account-search-modal/account-search-modal.component.mjs +10 -18
- package/esm2022/lib/action-btn/action-btn.component.mjs +3 -3
- package/esm2022/lib/action-btn-modal/action-btn-modal.component.mjs +3 -3
- package/esm2022/lib/address/address.component.mjs +3 -3
- package/esm2022/lib/address/oepa-address.service.mjs +13 -7
- package/esm2022/lib/blank/blank.component.mjs +3 -3
- package/esm2022/lib/checkbox/checkbox.component.mjs +3 -3
- package/esm2022/lib/checkbox-input/checkbox-input.component.mjs +3 -3
- package/esm2022/lib/comment-modal/comment-modal.component.mjs +3 -3
- package/esm2022/lib/common-forms.module.mjs +44 -36
- package/esm2022/lib/confirmation-modal/confirmation-modal.component.mjs +3 -3
- package/esm2022/lib/contact/contact.component.mjs +3 -3
- package/esm2022/lib/date-input/date-input.component.mjs +3 -3
- package/esm2022/lib/date-input-modal/date-input-modal.component.mjs +3 -3
- package/esm2022/lib/datepicker/datepicker.component.mjs +3 -3
- package/esm2022/lib/daterangepicker/daterangepicker.component.mjs +3 -3
- package/esm2022/lib/dual-list-box/array.pipes.mjs +6 -6
- package/esm2022/lib/dual-list-box/dual-list-box.component.mjs +3 -3
- package/esm2022/lib/ebiz-address/ebiz-address.component.mjs +3 -3
- package/esm2022/lib/edoc-attachment/edoc-attachment.component.mjs +10 -9
- package/esm2022/lib/edoc-attachment/edoc-attachment.service.mjs +13 -7
- package/esm2022/lib/entity/entity.service.mjs +13 -7
- package/esm2022/lib/entity/organization-create-modal/organization-create-modal.component.mjs +3 -3
- package/esm2022/lib/entity/organization-search-input/organization-search-input.component.mjs +3 -3
- package/esm2022/lib/entity/organization-search-modal/organization-search-modal.component.mjs +5 -5
- package/esm2022/lib/entity/person-create-modal/person-create-modal.component.mjs +3 -3
- package/esm2022/lib/entity/person-search-input/person-search-input.component.mjs +3 -3
- package/esm2022/lib/entity/person-search-modal/person-search-modal.component.mjs +5 -5
- package/esm2022/lib/entity/place-create-modal/place-create-modal.component.mjs +3 -3
- package/esm2022/lib/entity/place-search-input/place-search-input.component.mjs +3 -3
- package/esm2022/lib/entity/place-search-modal/place-search-modal.component.mjs +5 -5
- package/esm2022/lib/file-upload/file-upload.component.mjs +9 -8
- package/esm2022/lib/lynx-image-upload/lynx-image-upload.component.mjs +8 -7
- package/esm2022/lib/lynx-image-upload/lynx.service.mjs +13 -7
- package/esm2022/lib/message/message.component.mjs +3 -3
- package/esm2022/lib/message-list/message-list.component.mjs +3 -3
- package/esm2022/lib/multi-file-upload/multi-file-upload.component.mjs +9 -8
- package/esm2022/lib/notes-modal/notes-modal.component.mjs +3 -3
- package/esm2022/lib/numeric-input/numeric-input.component.mjs +3 -3
- package/esm2022/lib/numeric-input.directive.mjs +3 -3
- package/esm2022/lib/oepa-account/account-service.mjs +62 -0
- package/esm2022/lib/oepa-error-message/oepa-error-message.component.mjs +3 -3
- package/esm2022/lib/oepa-file-utils/oepa-file-util.service.mjs +227 -0
- package/esm2022/lib/oepa-forms.service.mjs +3 -3
- package/esm2022/lib/oepa-reference/oepa-reference.service.mjs +47 -0
- package/esm2022/lib/oepa-user-account/oepa-user-account.service.mjs +304 -0
- package/esm2022/lib/oepa-wait-message/oepa-wait-message.component.mjs +3 -3
- package/esm2022/lib/parameter/parameter.service.mjs +13 -7
- package/esm2022/lib/params-help-button/params-help-button.component.mjs +10 -10
- package/esm2022/lib/params-help-button/params-help.service.mjs +26 -0
- package/esm2022/lib/phone-number/phone-number.component.mjs +3 -3
- package/esm2022/lib/pin-modal/oepa-pin.service.mjs +13 -7
- package/esm2022/lib/pin-modal/pin-modal.component.mjs +5 -5
- package/esm2022/lib/select-input/select-input.component.mjs +3 -3
- package/esm2022/lib/server-timeout-modal/server-timeout-modal.component.mjs +5 -5
- package/esm2022/lib/shopping-cart/shopping-cart-summary/shopping-cart-summary.component.mjs +3 -3
- package/esm2022/lib/shopping-cart/shopping-cart-view/shopping-cart-view.component.mjs +3 -3
- package/esm2022/lib/shopping-cart/shopping-cart.service.mjs +13 -7
- package/esm2022/lib/start-end-timepicker/start-end-timepicker.component.mjs +3 -3
- package/esm2022/lib/table/oepa-table-cell-classname.pipe.mjs +3 -3
- package/esm2022/lib/table/oepa-table-cell-colspan.pipe.mjs +3 -3
- package/esm2022/lib/table/oepa-table-cell-hidden.pipe.mjs +3 -3
- package/esm2022/lib/table/oepa-table-cell-icon-classname.pipe.mjs +3 -3
- package/esm2022/lib/table/oepa-table-cell-img-src.pipe.mjs +3 -3
- package/esm2022/lib/table/oepa-table-cell-inner-html.pipe.mjs +3 -3
- package/esm2022/lib/table/oepa-table-cell-input-component.pipe.mjs +3 -3
- package/esm2022/lib/table/oepa-table-cell-not-selectable.pipe.mjs +3 -3
- package/esm2022/lib/table/oepa-table-cell-value.pipe.mjs +3 -3
- package/esm2022/lib/table/oepa-table-filtering.directive.mjs +3 -3
- package/esm2022/lib/table/oepa-table-sorting.directive.mjs +3 -3
- package/esm2022/lib/table/p-table/p-table.component.mjs +11 -10
- package/esm2022/lib/table/table-data-cell/table-data-cell.component.mjs +3 -3
- package/esm2022/lib/table/table-export.service.mjs +16 -7
- package/esm2022/lib/table/table-header-cell/table-header-cell.component.mjs +3 -3
- package/esm2022/lib/table/table.component.mjs +15 -14
- package/esm2022/lib/table/table.service.mjs +3 -3
- package/esm2022/lib/template-confirmation-modal/template-confirmation-modal.component.mjs +3 -3
- package/esm2022/lib/text-area-input/text-area-input.component.mjs +3 -3
- package/esm2022/lib/text-input/text-input.component.mjs +3 -3
- package/esm2022/lib/timeout-modal/timeout-modal.component.mjs +3 -3
- package/esm2022/lib/timepicker/timepicker.component.mjs +3 -3
- package/esm2022/lib/validation/validation.service.mjs +3 -3
- package/esm2022/lib/yes-no/yes-no.component.mjs +3 -3
- package/esm2022/lib/yes-no-boolean/yes-no.component.mjs +3 -3
- package/esm2022/lib/yes-no-other-input/yes-no-other-input.component.mjs +3 -3
- package/esm2022/lib/zip-code/zip-code.component.mjs +3 -3
- package/esm2022/public-api.mjs +1 -28
- package/fesm2022/ohioepa-oepa-ui-lib.mjs +1369 -2662
- package/fesm2022/ohioepa-oepa-ui-lib.mjs.map +1 -1
- package/lib/account-search-input/account-search-input.component.d.ts +3 -4
- package/lib/account-search-input/account-search.service.d.ts +12 -0
- package/lib/account-search-modal/account-search-modal.component.d.ts +3 -5
- package/lib/address/oepa-address.service.d.ts +2 -1
- package/lib/common-forms.module.d.ts +72 -82
- package/lib/edoc-attachment/edoc-attachment.component.d.ts +2 -1
- package/lib/edoc-attachment/edoc-attachment.service.d.ts +2 -1
- package/lib/entity/entity.service.d.ts +2 -1
- package/lib/file-upload/file-upload.component.d.ts +2 -1
- package/lib/lynx-image-upload/lynx-image-upload.component.d.ts +2 -1
- package/lib/lynx-image-upload/lynx.service.d.ts +2 -1
- package/lib/multi-file-upload/multi-file-upload.component.d.ts +2 -1
- package/lib/oepa-account/account-service.d.ts +23 -0
- package/lib/oepa-file-utils/oepa-file-util.service.d.ts +53 -0
- package/lib/oepa-reference/oepa-reference.service.d.ts +26 -0
- package/lib/oepa-user-account/oepa-user-account.service.d.ts +122 -0
- package/lib/parameter/parameter.service.d.ts +2 -1
- package/lib/params-help-button/params-help-button.component.d.ts +3 -3
- package/lib/params-help-button/params-help.service.d.ts +11 -0
- package/lib/pin-modal/oepa-pin.service.d.ts +2 -1
- package/lib/pin-modal/pin-modal.component.d.ts +2 -1
- package/lib/server-timeout-modal/server-timeout-modal.component.d.ts +1 -1
- package/lib/shopping-cart/shopping-cart.service.d.ts +2 -1
- package/lib/table/p-table/p-table.component.d.ts +2 -1
- package/lib/table/table-export.service.d.ts +2 -1
- package/lib/table/table.component.d.ts +1 -1
- package/ohioepa-oepa-ui-lib-1.2.1.tgz +0 -0
- package/package.json +3 -3
- package/public-api.d.ts +0 -27
- package/esm2022/lib/document/document-editor/document-editor.component.mjs +0 -225
- package/esm2022/lib/document/document-event-entity-type.mjs +0 -7
- package/esm2022/lib/document/document-event-type.mjs +0 -7
- package/esm2022/lib/document/document-event.mjs +0 -2
- package/esm2022/lib/document/document-group/document-group.component.mjs +0 -210
- package/esm2022/lib/document/document-part/document-part.component.mjs +0 -19
- package/esm2022/lib/document/document-part-editor/document-part-editor.component.mjs +0 -296
- package/esm2022/lib/document/document-placeholder-modal/document-placeholder-modal.component.mjs +0 -49
- package/esm2022/lib/document/document-section/document-section.component.mjs +0 -226
- package/esm2022/lib/document/document.service.mjs +0 -325
- package/esm2022/lib/document/group-modal/group-modal.component.mjs +0 -46
- package/esm2022/lib/document/part-modal/part-modal.component.mjs +0 -48
- package/esm2022/lib/document/portal-document-class.mjs +0 -2
- package/esm2022/lib/document/portal-document-group.mjs +0 -2
- package/esm2022/lib/document/portal-document-part.mjs +0 -2
- package/esm2022/lib/document/portal-document-placeholder.mjs +0 -2
- package/esm2022/lib/document/portal-document-section.mjs +0 -2
- package/esm2022/lib/document/portal-document-text.mjs +0 -2
- package/esm2022/lib/document/portal-document-type.mjs +0 -2
- package/esm2022/lib/document/portal-document.mjs +0 -2
- package/esm2022/lib/document/portal-email-attachment-type.mjs +0 -2
- package/esm2022/lib/document/portal-email-attachment.mjs +0 -2
- package/esm2022/lib/document/portal-email-filter.mjs +0 -2
- package/esm2022/lib/document/portal-email.mjs +0 -2
- package/esm2022/lib/document/section-modal/section-modal.component.mjs +0 -46
- package/esm2022/lib/esri-map/esri-map.component.mjs +0 -416
- package/esm2022/lib/ohio-lat-long/ohio-lat-long.component.mjs +0 -176
- package/lib/document/document-editor/document-editor.component.d.ts +0 -34
- package/lib/document/document-event-entity-type.d.ts +0 -5
- package/lib/document/document-event-type.d.ts +0 -5
- package/lib/document/document-event.d.ts +0 -9
- package/lib/document/document-group/document-group.component.d.ts +0 -38
- package/lib/document/document-part/document-part.component.d.ts +0 -10
- package/lib/document/document-part-editor/document-part-editor.component.d.ts +0 -46
- package/lib/document/document-placeholder-modal/document-placeholder-modal.component.d.ts +0 -19
- package/lib/document/document-section/document-section.component.d.ts +0 -37
- package/lib/document/document.service.d.ts +0 -90
- package/lib/document/group-modal/group-modal.component.d.ts +0 -20
- package/lib/document/part-modal/part-modal.component.d.ts +0 -20
- package/lib/document/portal-document-class.d.ts +0 -10
- package/lib/document/portal-document-group.d.ts +0 -15
- package/lib/document/portal-document-part.d.ts +0 -22
- package/lib/document/portal-document-placeholder.d.ts +0 -12
- package/lib/document/portal-document-section.d.ts +0 -13
- package/lib/document/portal-document-text.d.ts +0 -7
- package/lib/document/portal-document-type.d.ts +0 -15
- package/lib/document/portal-document.d.ts +0 -27
- package/lib/document/portal-email-attachment-type.d.ts +0 -6
- package/lib/document/portal-email-attachment.d.ts +0 -12
- package/lib/document/portal-email-filter.d.ts +0 -12
- package/lib/document/portal-email.d.ts +0 -18
- package/lib/document/section-modal/section-modal.component.d.ts +0 -20
- package/lib/esri-map/esri-map.component.d.ts +0 -41
- package/lib/ohio-lat-long/ohio-lat-long.component.d.ts +0 -63
- package/ohioepa-oepa-ui-lib-1.1.0.tgz +0 -0
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
import { Component, Input, Output, EventEmitter } from '@angular/core';
|
|
2
|
-
import { Validators } from '@angular/forms';
|
|
3
|
-
import * as i0 from "@angular/core";
|
|
4
|
-
import * as i1 from "@angular/forms";
|
|
5
|
-
import * as i2 from "ngx-bootstrap/modal";
|
|
6
|
-
export class SectionModalComponent {
|
|
7
|
-
fb;
|
|
8
|
-
bsModalRef;
|
|
9
|
-
section;
|
|
10
|
-
label = '';
|
|
11
|
-
onSectionSave = new EventEmitter();
|
|
12
|
-
modalForm;
|
|
13
|
-
constructor(fb, bsModalRef) {
|
|
14
|
-
this.fb = fb;
|
|
15
|
-
this.bsModalRef = bsModalRef;
|
|
16
|
-
}
|
|
17
|
-
ngOnInit() {
|
|
18
|
-
this.createForm();
|
|
19
|
-
}
|
|
20
|
-
createForm() {
|
|
21
|
-
this.modalForm = this.fb.group({
|
|
22
|
-
name: [this.section.name, [Validators.required]]
|
|
23
|
-
});
|
|
24
|
-
}
|
|
25
|
-
save() {
|
|
26
|
-
this.section.name = this.modalForm.get('name')?.value;
|
|
27
|
-
this.onSectionSave.emit(this.section);
|
|
28
|
-
this.bsModalRef.hide();
|
|
29
|
-
}
|
|
30
|
-
cancel() {
|
|
31
|
-
this.bsModalRef.hide();
|
|
32
|
-
}
|
|
33
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SectionModalComponent, deps: [{ token: i1.FormBuilder }, { token: i2.BsModalRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
34
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: SectionModalComponent, selector: "oepa-insert-section-modal", inputs: { section: "section", label: "label" }, outputs: { onSectionSave: "onSectionSave" }, ngImport: i0, template: "<div class=\"modal-header\">\n <h4 class=\"modal-title pull-left\">{{label}}</h4>\n <button type=\"button\" class=\"close pull-right\" aria-label=\"Close\" (click)=\"cancel()\">\n <span aria-hidden=\"true\">×</span>\n </button>\n </div>\n <div class=\"modal-body\">\n <div [formGroup]=\"modalForm\">\n <div class=\"row\">\n <div class=\"col-sm-12 form-group\">\n <label>Section Name</label>\n <input class=\"form-control\" id=\"partNameInput\" formControlName=\"name\"/>\n </div>\n </div>\n\n </div>\n </div>\n <div class=\"modal-footer\">\n <button type=\"submit\" id=\"saveBtn\" [disabled]=\"modalForm.invalid\" class=\"btn btn-primary mr-1\" (click)=\"save()\">Save</button>\n <button type=\"button\" id=\"cancelBtn\" class=\"btn btn-primary mr-1\" (click)=\"cancel()\">Cancel</button>\n </div>", styles: [""], dependencies: [{ kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }] });
|
|
35
|
-
}
|
|
36
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SectionModalComponent, decorators: [{
|
|
37
|
-
type: Component,
|
|
38
|
-
args: [{ selector: 'oepa-insert-section-modal', template: "<div class=\"modal-header\">\n <h4 class=\"modal-title pull-left\">{{label}}</h4>\n <button type=\"button\" class=\"close pull-right\" aria-label=\"Close\" (click)=\"cancel()\">\n <span aria-hidden=\"true\">×</span>\n </button>\n </div>\n <div class=\"modal-body\">\n <div [formGroup]=\"modalForm\">\n <div class=\"row\">\n <div class=\"col-sm-12 form-group\">\n <label>Section Name</label>\n <input class=\"form-control\" id=\"partNameInput\" formControlName=\"name\"/>\n </div>\n </div>\n\n </div>\n </div>\n <div class=\"modal-footer\">\n <button type=\"submit\" id=\"saveBtn\" [disabled]=\"modalForm.invalid\" class=\"btn btn-primary mr-1\" (click)=\"save()\">Save</button>\n <button type=\"button\" id=\"cancelBtn\" class=\"btn btn-primary mr-1\" (click)=\"cancel()\">Cancel</button>\n </div>" }]
|
|
39
|
-
}], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i2.BsModalRef }], propDecorators: { section: [{
|
|
40
|
-
type: Input
|
|
41
|
-
}], label: [{
|
|
42
|
-
type: Input
|
|
43
|
-
}], onSectionSave: [{
|
|
44
|
-
type: Output
|
|
45
|
-
}] } });
|
|
46
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VjdGlvbi1tb2RhbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vZXBhLXVpLWxpYi9zcmMvbGliL2RvY3VtZW50L3NlY3Rpb24tbW9kYWwvc2VjdGlvbi1tb2RhbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vZXBhLXVpLWxpYi9zcmMvbGliL2RvY3VtZW50L3NlY3Rpb24tbW9kYWwvc2VjdGlvbi1tb2RhbC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRS9FLE9BQU8sRUFBMEIsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7QUFRcEUsTUFBTSxPQUFPLHFCQUFxQjtJQVFaO0lBQXdCO0lBUG5DLE9BQU8sQ0FBeUI7SUFDaEMsS0FBSyxHQUFHLEVBQUUsQ0FBQztJQUVWLGFBQWEsR0FBd0MsSUFBSSxZQUFZLEVBQXlCLENBQUM7SUFFbEcsU0FBUyxDQUFhO0lBRTdCLFlBQW9CLEVBQWUsRUFBUyxVQUFzQjtRQUE5QyxPQUFFLEdBQUYsRUFBRSxDQUFhO1FBQVMsZUFBVSxHQUFWLFVBQVUsQ0FBWTtJQUFJLENBQUM7SUFFdkUsUUFBUTtRQUNOLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNwQixDQUFDO0lBRU8sVUFBVTtRQUNoQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQzdCLElBQUksRUFBRSxDQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQ2xELENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxJQUFJO1FBQ0YsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsS0FBSyxDQUFDO1FBQ3RELElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxNQUFNO1FBQ0osSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN6QixDQUFDO3dHQTVCVSxxQkFBcUI7NEZBQXJCLHFCQUFxQiw4SkNWbEMsMDVCQW9CUTs7NEZEVksscUJBQXFCO2tCQUxqQyxTQUFTOytCQUNFLDJCQUEyQjt5R0FLNUIsT0FBTztzQkFBZixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFFSSxhQUFhO3NCQUF0QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUG9ydGFsRG9jdW1lbnRTZWN0aW9uIH0gZnJvbSAnLi4vcG9ydGFsLWRvY3VtZW50LXNlY3Rpb24nO1xuaW1wb3J0IHsgRm9ybUdyb3VwLCBGb3JtQnVpbGRlciwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEJzTW9kYWxSZWYgfSBmcm9tICduZ3gtYm9vdHN0cmFwL21vZGFsJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnb2VwYS1pbnNlcnQtc2VjdGlvbi1tb2RhbCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9zZWN0aW9uLW1vZGFsLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vc2VjdGlvbi1tb2RhbC5jb21wb25lbnQuY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgU2VjdGlvbk1vZGFsQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KCkgc2VjdGlvbiE6IFBvcnRhbERvY3VtZW50U2VjdGlvbjtcbiAgQElucHV0KCkgbGFiZWwgPSAnJztcblxuICBAT3V0cHV0KCkgb25TZWN0aW9uU2F2ZTogRXZlbnRFbWl0dGVyPFBvcnRhbERvY3VtZW50U2VjdGlvbj4gPSBuZXcgRXZlbnRFbWl0dGVyPFBvcnRhbERvY3VtZW50U2VjdGlvbj4oKTtcblxuICBwdWJsaWMgbW9kYWxGb3JtITogRm9ybUdyb3VwO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyLCBwdWJsaWMgYnNNb2RhbFJlZjogQnNNb2RhbFJlZikgeyB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5jcmVhdGVGb3JtKCk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUZvcm0oKSB7XG4gICAgdGhpcy5tb2RhbEZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIG5hbWU6IFsgdGhpcy5zZWN0aW9uLm5hbWUsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV1cbiAgICB9KTtcbiAgfVxuXG4gIHNhdmUoKSB7XG4gICAgdGhpcy5zZWN0aW9uLm5hbWUgPSB0aGlzLm1vZGFsRm9ybS5nZXQoJ25hbWUnKT8udmFsdWU7XG4gICAgdGhpcy5vblNlY3Rpb25TYXZlLmVtaXQodGhpcy5zZWN0aW9uKTtcbiAgICB0aGlzLmJzTW9kYWxSZWYuaGlkZSgpO1xuICB9XG5cbiAgY2FuY2VsKCkge1xuICAgIHRoaXMuYnNNb2RhbFJlZi5oaWRlKCk7XG4gIH1cblxufVxuIiwiPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxuICAgIDxoNCBjbGFzcz1cIm1vZGFsLXRpdGxlIHB1bGwtbGVmdFwiPnt7bGFiZWx9fTwvaDQ+XG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjbG9zZSBwdWxsLXJpZ2h0XCIgYXJpYS1sYWJlbD1cIkNsb3NlXCIgKGNsaWNrKT1cImNhbmNlbCgpXCI+XG4gICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiZ0aW1lczs8L3NwYW4+XG4gICAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCI+XG4gICAgICA8ZGl2IFtmb3JtR3JvdXBdPVwibW9kYWxGb3JtXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTEyIGZvcm0tZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICAgIDxsYWJlbD5TZWN0aW9uIE5hbWU8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJwYXJ0TmFtZUlucHV0XCIgZm9ybUNvbnRyb2xOYW1lPVwibmFtZVwiLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiPlxuICAgIDxidXR0b24gdHlwZT1cInN1Ym1pdFwiIGlkPVwic2F2ZUJ0blwiIFtkaXNhYmxlZF09XCJtb2RhbEZvcm0uaW52YWxpZFwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IG1yLTFcIiAoY2xpY2spPVwic2F2ZSgpXCI+U2F2ZTwvYnV0dG9uPlxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGlkPVwiY2FuY2VsQnRuXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgbXItMVwiIChjbGljayk9XCJjYW5jZWwoKVwiPkNhbmNlbDwvYnV0dG9uPlxuICA8L2Rpdj4iXX0=
|
|
@@ -1,416 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
Copyright 2018 Esri
|
|
3
|
-
Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
-
you may not use this file except in compliance with the License.
|
|
5
|
-
You may obtain a copy of the License at
|
|
6
|
-
http://www.apache.org/licenses/LICENSE-2.0
|
|
7
|
-
Unless required by applicable law or agreed to in writing, software
|
|
8
|
-
distributed under the License is distributed on an "AS IS" BASIS,
|
|
9
|
-
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
10
|
-
See the License for the specific language governing permissions and
|
|
11
|
-
limitations under the License.
|
|
12
|
-
*/
|
|
13
|
-
import { Component, ViewChild, Input, Output, EventEmitter } from '@angular/core';
|
|
14
|
-
import { loadModules } from 'esri-loader';
|
|
15
|
-
import * as i0 from "@angular/core";
|
|
16
|
-
import * as i1 from "@angular/common";
|
|
17
|
-
export class EsriMapComponent {
|
|
18
|
-
mapLoaded = new EventEmitter();
|
|
19
|
-
onNewCoordinates = new EventEmitter();
|
|
20
|
-
mapViewEl;
|
|
21
|
-
latLongSearchEl;
|
|
22
|
-
/**
|
|
23
|
-
* @private _zoom sets map zoom
|
|
24
|
-
* @private _center sets map center
|
|
25
|
-
* @private _basemap sets type of map
|
|
26
|
-
*/
|
|
27
|
-
_zoom = 10;
|
|
28
|
-
_center = [0.1278, 51.5074];
|
|
29
|
-
_basemap = 'streets-vector';
|
|
30
|
-
currentMapView;
|
|
31
|
-
// private currentGraphic: esri.Graphic = null;
|
|
32
|
-
// private selectedPoint: esri.Point = null;
|
|
33
|
-
_currentLatLong;
|
|
34
|
-
set currentLatLong(currentLatLong) {
|
|
35
|
-
this._currentLatLong = currentLatLong;
|
|
36
|
-
}
|
|
37
|
-
get currentLatLong() {
|
|
38
|
-
return this._currentLatLong;
|
|
39
|
-
}
|
|
40
|
-
set zoom(zoom) {
|
|
41
|
-
this._zoom = zoom;
|
|
42
|
-
}
|
|
43
|
-
get zoom() {
|
|
44
|
-
return this._zoom;
|
|
45
|
-
}
|
|
46
|
-
set center(center) {
|
|
47
|
-
this._center = center;
|
|
48
|
-
}
|
|
49
|
-
get center() {
|
|
50
|
-
return this._center;
|
|
51
|
-
}
|
|
52
|
-
set basemap(basemap) {
|
|
53
|
-
this._basemap = basemap;
|
|
54
|
-
}
|
|
55
|
-
get basemap() {
|
|
56
|
-
return this._basemap;
|
|
57
|
-
}
|
|
58
|
-
showSearch = false;
|
|
59
|
-
constructor() { }
|
|
60
|
-
async initializeMap() {
|
|
61
|
-
// var mapView;
|
|
62
|
-
const [EsriMap, EsriMapView, EsriBasemapToggle, locator, Search] = await loadModules([
|
|
63
|
-
'esri/Map',
|
|
64
|
-
'esri/views/MapView',
|
|
65
|
-
"esri/widgets/BasemapToggle",
|
|
66
|
-
"esri/rest/locator",
|
|
67
|
-
"esri/widgets/Search"
|
|
68
|
-
]);
|
|
69
|
-
const me = this;
|
|
70
|
-
// Set type of map
|
|
71
|
-
const mapProperties = {
|
|
72
|
-
basemap: this._basemap,
|
|
73
|
-
};
|
|
74
|
-
const map = new EsriMap(mapProperties);
|
|
75
|
-
// Set type of map view
|
|
76
|
-
const mapViewProperties = {
|
|
77
|
-
container: this.mapViewEl.nativeElement,
|
|
78
|
-
center: this._center,
|
|
79
|
-
zoom: this._zoom,
|
|
80
|
-
map: map,
|
|
81
|
-
popup: {
|
|
82
|
-
dockEnabled: false,
|
|
83
|
-
dockOptions: {
|
|
84
|
-
buttonEnabled: false,
|
|
85
|
-
breakpoint: false,
|
|
86
|
-
}
|
|
87
|
-
},
|
|
88
|
-
};
|
|
89
|
-
var mapView = new EsriMapView(mapViewProperties);
|
|
90
|
-
mapView.popup.actionsMenuEnabled = false;
|
|
91
|
-
mapView.popup._displayActionTextLimit = 0; // controls whether action button text is shown
|
|
92
|
-
this.currentMapView = mapView;
|
|
93
|
-
// All resources in the MapView and the map have loaded.
|
|
94
|
-
// Now execute additional processes
|
|
95
|
-
// this.currentMapView.when(() => {
|
|
96
|
-
// this.mapLoaded.emit(true);
|
|
97
|
-
// });
|
|
98
|
-
// 1 - Create the widget
|
|
99
|
-
const toggle = new EsriBasemapToggle({
|
|
100
|
-
// 2 - Set properties
|
|
101
|
-
view: mapView, // view that provides access to the map's 'topo' basemap
|
|
102
|
-
nextBasemap: "hybrid" // allows for toggling to the 'hybrid' basemap
|
|
103
|
-
});
|
|
104
|
-
// Add widget to the top right corner of the view
|
|
105
|
-
mapView.ui.add(toggle, "bottom-right");
|
|
106
|
-
var updateLatLongAction = {
|
|
107
|
-
title: "Yes",
|
|
108
|
-
id: "update-lat-long",
|
|
109
|
-
// image: "Measure_Distance16.png",
|
|
110
|
-
className: "bi bi-hand-thumbs-up-fill"
|
|
111
|
-
};
|
|
112
|
-
var cancelUpdateAction = {
|
|
113
|
-
title: "No",
|
|
114
|
-
id: "cancel-update",
|
|
115
|
-
// image: "Measure_Distance16.png",
|
|
116
|
-
className: "bi bi-hand-thumbs-down-fill"
|
|
117
|
-
};
|
|
118
|
-
//this.currentMapView.popup.content = '{facilityName}';
|
|
119
|
-
// this.currentMapView.on("click", event => {
|
|
120
|
-
// let clickSymbol: esri.SimpleMarkerSymbol = new SimpleMarkerSymbol({
|
|
121
|
-
// type: 'simple-marker',
|
|
122
|
-
// style: 'diamond',
|
|
123
|
-
// color: 'red',
|
|
124
|
-
// size: '20pt'
|
|
125
|
-
// });
|
|
126
|
-
// this.currentMapView.graphics.remove(this.currentGraphic);
|
|
127
|
-
// this.currentGraphic = new Graphic({
|
|
128
|
-
// geometry : event.mapPoint,
|
|
129
|
-
// symbol : clickSymbol
|
|
130
|
-
// })
|
|
131
|
-
// this.addPoint(String(event.mapPoint.latitude), String(event.mapPoint.longitude));
|
|
132
|
-
// });
|
|
133
|
-
// var symbol = new SimpleMarkerSymbol(
|
|
134
|
-
// SimpleMarkerSymbol.STYLE_CIRCLE,
|
|
135
|
-
// 12,
|
|
136
|
-
// new SimpleLineSymbol(
|
|
137
|
-
// SimpleLineSymbol.STYLE_NULL,
|
|
138
|
-
// new Color([247, 34, 101, 0.9]),
|
|
139
|
-
// 1
|
|
140
|
-
// ),
|
|
141
|
-
// new Color([207, 34, 171, 0.5])
|
|
142
|
-
// );
|
|
143
|
-
// mapView.when(() => {
|
|
144
|
-
// this.mapLoaded.emit(true);
|
|
145
|
-
// mapView.on("click", function(event) {
|
|
146
|
-
// // you must overwrite default click-for-popup
|
|
147
|
-
// // behavior to display your own popup
|
|
148
|
-
// // me.currentMapView.popup.autoOpenEnabled = false;
|
|
149
|
-
// // Get the coordinates of the click on the view
|
|
150
|
-
// var lat = Math.round(event.mapPoint.latitude * 1000) / 1000;
|
|
151
|
-
// var lon = Math.round(event.mapPoint.longitude * 1000) / 1000;
|
|
152
|
-
// var info = lat + ', ' + lon;
|
|
153
|
-
// mapView.graphics.clear();
|
|
154
|
-
// mapView.graphics.add(new Graphic(event.mapPoint, symbol));
|
|
155
|
-
// map.infoWindow.setContent("X: " + event.mapPoint.x.toString() + ", <br>Y: " + event.mapPoint.y.toString());
|
|
156
|
-
// mapView.infoWindow.show(event.mapPoint)
|
|
157
|
-
// const poptest = new Popup({
|
|
158
|
-
// title: "Reverse geocode: [" + lon + ", " + lat + "]",
|
|
159
|
-
// location: event.mapPoint, // Set the location of the popup to the clicked location
|
|
160
|
-
// content: "This is a point of interest" // content displayed in the popup
|
|
161
|
-
// })
|
|
162
|
-
// mapView.popup.open({
|
|
163
|
-
// // Set the popup's title to the coordinates of the location
|
|
164
|
-
// title: "Reverse geocode: [" + lon + ", " + lat + "]",
|
|
165
|
-
// location: event.mapPoint, // Set the location of the popup to the clicked location
|
|
166
|
-
// content: "This is a point of interest" // content displayed in the popup
|
|
167
|
-
// });
|
|
168
|
-
// // me.showPopup(info, event);
|
|
169
|
-
// });
|
|
170
|
-
// // mapView.popup.on("trigger-action", function(evt){
|
|
171
|
-
// // if(evt.action.id === "more-details"){
|
|
172
|
-
// // // add graphic at view.popup.location
|
|
173
|
-
// // }
|
|
174
|
-
// // });
|
|
175
|
-
// })
|
|
176
|
-
/*
|
|
177
|
-
* Create the Search Box widget used for address lookup. searchId is the id of the HTML tag (usually a DIV)
|
|
178
|
-
* that is the placeholder for the search box.
|
|
179
|
-
*/
|
|
180
|
-
if (this.showSearch) {
|
|
181
|
-
var searchWidget = new Search({
|
|
182
|
-
view: mapView,
|
|
183
|
-
locationEnabled: false,
|
|
184
|
-
container: this.latLongSearchEl.nativeElement,
|
|
185
|
-
popupEnabled: false
|
|
186
|
-
});
|
|
187
|
-
}
|
|
188
|
-
mapView.when(function () {
|
|
189
|
-
if (me._currentLatLong &&
|
|
190
|
-
me._currentLatLong.latDecimal && me._currentLatLong.latDecimal !== '' &&
|
|
191
|
-
me._currentLatLong.longDecimal && me._currentLatLong.longDecimal !== '') {
|
|
192
|
-
me.addPoint(me._currentLatLong.latDecimal, me._currentLatLong.longDecimal, 'xxx');
|
|
193
|
-
me.zoomToFacility(me._currentLatLong.latDecimal, me._currentLatLong.longDecimal);
|
|
194
|
-
}
|
|
195
|
-
});
|
|
196
|
-
mapView.when(function () {
|
|
197
|
-
mapView.on("mouse-wheel", function (event) {
|
|
198
|
-
// prevents zooming with the mouse-wheel event
|
|
199
|
-
event.stopPropagation();
|
|
200
|
-
});
|
|
201
|
-
});
|
|
202
|
-
mapView.when(function () {
|
|
203
|
-
if (searchWidget) {
|
|
204
|
-
searchWidget.on("select-result", function (event) {
|
|
205
|
-
showPopup("xxx", event.result.feature.geometry);
|
|
206
|
-
// let newLatLong: LatLong = {
|
|
207
|
-
// latDecimal: mapView.popup.location.latitude,
|
|
208
|
-
// longDecimal: mapView.popup.location.longitude
|
|
209
|
-
// }
|
|
210
|
-
// me.onNewCoordinates.emit(newLatLong); // this updates lat/long fields as soon as you click selected address
|
|
211
|
-
});
|
|
212
|
-
}
|
|
213
|
-
});
|
|
214
|
-
mapView.when(function () {
|
|
215
|
-
mapView.popup.autoOpenEnabled = false;
|
|
216
|
-
mapView.on("click", function (event) {
|
|
217
|
-
searchWidget.clear();
|
|
218
|
-
mapView.popup.clear();
|
|
219
|
-
// Get the coordinates of the click on the view around the decimals to 3 decimals
|
|
220
|
-
// var lat = Math.round(event.mapPoint.latitude * 1000) / 1000;
|
|
221
|
-
// var lon = Math.round(event.mapPoint.longitude * 1000) / 1000;
|
|
222
|
-
// this.selectedPoint = event.mapPoint;
|
|
223
|
-
// mapView.popup.open({ //define
|
|
224
|
-
// title: "<div style='font-size: 12px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;'>Update Latitude and Longitude</div>",
|
|
225
|
-
// content:
|
|
226
|
-
// "<div style='bold'>Address: </div>" + "<div>" + address + "</div>" +
|
|
227
|
-
// "<input type='button' value=' Yes' id='" + options.mapId + "updateLatLong'> <input type='button' value='No' id='" + options.mapId + "cancelInfoWindow'>" ,
|
|
228
|
-
// location: event.mapPoint,
|
|
229
|
-
// actions: [updateLatLongAction, cancelUpdateAction],
|
|
230
|
-
// });
|
|
231
|
-
// Display the popup
|
|
232
|
-
// Execute a reverse geocode using the clicked location
|
|
233
|
-
locator.locationToAddress("https://geocode.arcgis.com/arcgis/rest/services/World/GeocodeServer", { location: event.mapPoint })
|
|
234
|
-
.then(function (response) {
|
|
235
|
-
// If an address is successfully found, show it in the popup's content
|
|
236
|
-
mapView.popup.content = response.address;
|
|
237
|
-
var address = response.address;
|
|
238
|
-
showPopup(address, event.mapPoint);
|
|
239
|
-
})
|
|
240
|
-
.catch(function (error) {
|
|
241
|
-
// If the promise fails and no result is found, show a generic message
|
|
242
|
-
mapView.popup.content = "No address was found for this location";
|
|
243
|
-
showPopup("No address found.", event.mapPoint);
|
|
244
|
-
});
|
|
245
|
-
mapView.popup.visible = true;
|
|
246
|
-
});
|
|
247
|
-
});
|
|
248
|
-
mapView.when(function () {
|
|
249
|
-
mapView.popup.on("trigger-action", function (event) {
|
|
250
|
-
// Execute the measureThis() function if the measure-this action is clicked
|
|
251
|
-
if (event.action.id === "update-lat-long") {
|
|
252
|
-
updateLatLong();
|
|
253
|
-
}
|
|
254
|
-
else if (event.action.id === "cancel-update") {
|
|
255
|
-
cancelUpdate();
|
|
256
|
-
}
|
|
257
|
-
});
|
|
258
|
-
});
|
|
259
|
-
function showPopup(address, pt) {
|
|
260
|
-
mapView.popup.open({
|
|
261
|
-
title: "<div style='font-size: 12px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;'>Update Latitude and Longitude?</div>",
|
|
262
|
-
content:
|
|
263
|
-
// "<div style='bold'>Address: </div>" + "<div>" + address + "</div>" +
|
|
264
|
-
"<div style='font-size: 12px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;'><div>Would you like to update the latitude and longitude values as shown below?</div>" +
|
|
265
|
-
'<br/>' +
|
|
266
|
-
"<div>Latitude: " + Math.round(pt.latitude * 100000) / 100000 + "</div>" +
|
|
267
|
-
"<div>Longitude: " + Math.round(pt.longitude * 100000) / 100000 + "</div></div>",
|
|
268
|
-
// "<input type='button' value=' Yes' id='" + options.mapId + "updateLatLong'> <input type='button' value='No' id='" + options.mapId + "cancelInfoWindow'>" ,
|
|
269
|
-
location: pt,
|
|
270
|
-
actions: [updateLatLongAction, cancelUpdateAction],
|
|
271
|
-
collapsed: true
|
|
272
|
-
});
|
|
273
|
-
// mapView.popup._displayActionTextLimit = 3; // controls whether action button text is shown
|
|
274
|
-
}
|
|
275
|
-
function updateLatLong() {
|
|
276
|
-
mapView.graphics.removeAll();
|
|
277
|
-
// mapView.graphics.add(new Graphic(event.mapPoint, symbol));
|
|
278
|
-
me.addPoint(mapView.popup.location.latitude, mapView.popup.location.longitude, 'xxx');
|
|
279
|
-
let newLatLong = {
|
|
280
|
-
latDecimal: mapView.popup.location.latitude,
|
|
281
|
-
longDecimal: mapView.popup.location.longitude
|
|
282
|
-
};
|
|
283
|
-
me.onNewCoordinates.emit(newLatLong);
|
|
284
|
-
cancelUpdate();
|
|
285
|
-
mapView.popup.close();
|
|
286
|
-
// console.log("updateLatLong called for lat: " + mapView.popup.location.latitude + ", long: " + mapView.popup.location.longitude);
|
|
287
|
-
}
|
|
288
|
-
function cancelUpdate() {
|
|
289
|
-
mapView.popup.close();
|
|
290
|
-
// console.log("cancelUpdate called");
|
|
291
|
-
}
|
|
292
|
-
//*** Add div element to show coordates ***//
|
|
293
|
-
var coordsWidget = document.createElement("div");
|
|
294
|
-
coordsWidget.id = "coordsWidget";
|
|
295
|
-
coordsWidget.className = "esri-widget esri-component";
|
|
296
|
-
coordsWidget.style.padding = "7px 15px 5px";
|
|
297
|
-
mapView.ui.add(coordsWidget, "bottom-right");
|
|
298
|
-
//*** Update lat, lon, zoom and scale ***//
|
|
299
|
-
function showCoordinates(pt) {
|
|
300
|
-
var coords = "Lat/Lon " + pt.latitude.toFixed(3) + " " + pt.longitude.toFixed(3) +
|
|
301
|
-
" | Scale 1:" + Math.round(mapView.scale * 1) / 1 +
|
|
302
|
-
" | Zoom " + mapView.zoom;
|
|
303
|
-
coordsWidget.innerHTML = coords;
|
|
304
|
-
}
|
|
305
|
-
//*** Add event and show center coordinates after the view is finished moving e.g. zoom, pan ***//
|
|
306
|
-
mapView.watch(["stationary"], function () {
|
|
307
|
-
showCoordinates(mapView.center);
|
|
308
|
-
});
|
|
309
|
-
//*** Add event to show mouse coordinates on click and move ***//
|
|
310
|
-
mapView.on(["pointer-down", "pointer-move"], function (evt) {
|
|
311
|
-
showCoordinates(mapView.toMap({ x: evt.x, y: evt.y }));
|
|
312
|
-
});
|
|
313
|
-
}
|
|
314
|
-
async resetMap() {
|
|
315
|
-
this.currentMapView.graphics.removeAll();
|
|
316
|
-
this.currentMapView.goTo({
|
|
317
|
-
target: this._center,
|
|
318
|
-
zoom: this._zoom
|
|
319
|
-
});
|
|
320
|
-
this.zoomToFacility;
|
|
321
|
-
}
|
|
322
|
-
async zoomToFacility(lat, long) {
|
|
323
|
-
const [Point] = await loadModules([
|
|
324
|
-
'esri/geometry/Point'
|
|
325
|
-
]);
|
|
326
|
-
let point = new Point({
|
|
327
|
-
latitude: lat, //39.957767,
|
|
328
|
-
longitude: long //-82.994939
|
|
329
|
-
});
|
|
330
|
-
this.currentMapView.goTo({
|
|
331
|
-
target: point,
|
|
332
|
-
zoom: 16
|
|
333
|
-
});
|
|
334
|
-
}
|
|
335
|
-
// async removeSelectedPoint() {
|
|
336
|
-
// if (this.currentGraphic) {
|
|
337
|
-
// this.currentMapView.map.
|
|
338
|
-
// }
|
|
339
|
-
// }
|
|
340
|
-
/**
|
|
341
|
-
* Adds a new point to the current map with the given lat/long values.
|
|
342
|
-
* @param lat
|
|
343
|
-
* @param long
|
|
344
|
-
*/
|
|
345
|
-
async addPoint(lat, long, name) {
|
|
346
|
-
const [Point, Graphic, SimpleMarkerSymbol, ActionButton] = await loadModules([
|
|
347
|
-
'esri/geometry/Point',
|
|
348
|
-
'esri/Graphic',
|
|
349
|
-
'esri/symbols/SimpleMarkerSymbol',
|
|
350
|
-
'esri/support/actions/ActionButton'
|
|
351
|
-
]);
|
|
352
|
-
let point = new Point({
|
|
353
|
-
latitude: lat, //39.957767,
|
|
354
|
-
longitude: long //-82.994939
|
|
355
|
-
});
|
|
356
|
-
let symbol = new SimpleMarkerSymbol({
|
|
357
|
-
// type: 'simple-marker',
|
|
358
|
-
style: 'circle',
|
|
359
|
-
color: 'blue',
|
|
360
|
-
size: '12px'
|
|
361
|
-
});
|
|
362
|
-
let actionButton = new ActionButton({
|
|
363
|
-
active: true,
|
|
364
|
-
visible: true,
|
|
365
|
-
disabled: false,
|
|
366
|
-
id: 'selectFacility',
|
|
367
|
-
title: 'Select Facility',
|
|
368
|
-
type: 'button'
|
|
369
|
-
});
|
|
370
|
-
let currentGraphic = new Graphic({
|
|
371
|
-
geometry: point,
|
|
372
|
-
symbol: symbol,
|
|
373
|
-
popupTemplate: {
|
|
374
|
-
title: name,
|
|
375
|
-
content: name,
|
|
376
|
-
},
|
|
377
|
-
actions: [actionButton]
|
|
378
|
-
});
|
|
379
|
-
this.currentMapView.graphics.add(currentGraphic);
|
|
380
|
-
this._currentLatLong = {
|
|
381
|
-
latDecimal: lat,
|
|
382
|
-
longDecimal: long
|
|
383
|
-
};
|
|
384
|
-
// console.log('Added point: ', lat, long);
|
|
385
|
-
}
|
|
386
|
-
ngOnInit() {
|
|
387
|
-
this.initializeMap();
|
|
388
|
-
}
|
|
389
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: EsriMapComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
390
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: EsriMapComponent, selector: "oepa-esri-map", inputs: { currentLatLong: "currentLatLong", zoom: "zoom", center: "center", basemap: "basemap", showSearch: "showSearch" }, outputs: { mapLoaded: "mapLoaded", onNewCoordinates: "onNewCoordinates" }, viewQueries: [{ propertyName: "mapViewEl", first: true, predicate: ["mapViewNode"], descendants: true, static: true }, { propertyName: "latLongSearchEl", first: true, predicate: ["latLongSearchNode"], descendants: true }], ngImport: i0, template: "<!-- Here's the DIV that we inject the map into -->\n<div *ngIf=\"showSearch\" class=\"row\">\n <div class=\"col-md-12\">\n <div class=\"alert alert-success\">\n <label>Search for Address:</label>\n <div>Type an address in the input box below and select a match from the drop down list or select the\n magnifying glass button to plot the address on the map.</div>\n <div #latLongSearchNode></div>\n </div>\n </div>\n</div>\n<div #mapViewNode></div>", styles: ["@import\"https://js.arcgis.com/4.11/esri/css/main.css\";.esri-view{height:500px}.esri-view-width-less-than-large .esri-popup__action-text{display:block!important}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
|
|
391
|
-
}
|
|
392
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: EsriMapComponent, decorators: [{
|
|
393
|
-
type: Component,
|
|
394
|
-
args: [{ selector: 'oepa-esri-map', template: "<!-- Here's the DIV that we inject the map into -->\n<div *ngIf=\"showSearch\" class=\"row\">\n <div class=\"col-md-12\">\n <div class=\"alert alert-success\">\n <label>Search for Address:</label>\n <div>Type an address in the input box below and select a match from the drop down list or select the\n magnifying glass button to plot the address on the map.</div>\n <div #latLongSearchNode></div>\n </div>\n </div>\n</div>\n<div #mapViewNode></div>", styles: ["@import\"https://js.arcgis.com/4.11/esri/css/main.css\";.esri-view{height:500px}.esri-view-width-less-than-large .esri-popup__action-text{display:block!important}\n"] }]
|
|
395
|
-
}], ctorParameters: () => [], propDecorators: { mapLoaded: [{
|
|
396
|
-
type: Output
|
|
397
|
-
}], onNewCoordinates: [{
|
|
398
|
-
type: Output
|
|
399
|
-
}], mapViewEl: [{
|
|
400
|
-
type: ViewChild,
|
|
401
|
-
args: ['mapViewNode', { static: true }]
|
|
402
|
-
}], latLongSearchEl: [{
|
|
403
|
-
type: ViewChild,
|
|
404
|
-
args: ['latLongSearchNode', { static: false }]
|
|
405
|
-
}], currentLatLong: [{
|
|
406
|
-
type: Input
|
|
407
|
-
}], zoom: [{
|
|
408
|
-
type: Input
|
|
409
|
-
}], center: [{
|
|
410
|
-
type: Input
|
|
411
|
-
}], basemap: [{
|
|
412
|
-
type: Input
|
|
413
|
-
}], showSearch: [{
|
|
414
|
-
type: Input
|
|
415
|
-
}] } });
|
|
416
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXNyaS1tYXAuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb2VwYS11aS1saWIvc3JjL2xpYi9lc3JpLW1hcC9lc3JpLW1hcC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vZXBhLXVpLWxpYi9zcmMvbGliL2VzcmktbWFwL2VzcmktbWFwLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7OztFQVdFO0FBRUYsT0FBTyxFQUFFLFNBQVMsRUFBVSxTQUFTLEVBQWMsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFdEcsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGFBQWEsQ0FBQzs7O0FBUzFDLE1BQU0sT0FBTyxnQkFBZ0I7SUFFakIsU0FBUyxHQUFHLElBQUksWUFBWSxFQUFXLENBQUM7SUFDeEMsZ0JBQWdCLEdBQTBCLElBQUksWUFBWSxFQUFXLENBQUM7SUFDNUIsU0FBUyxDQUFjO0lBQ3hCLGVBQWUsQ0FBYztJQUVoRjs7OztPQUlHO0lBQ0ssS0FBSyxHQUFXLEVBQUUsQ0FBQztJQUNuQixPQUFPLEdBQWtCLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzNDLFFBQVEsR0FBVyxnQkFBZ0IsQ0FBQztJQUVwQyxjQUFjLENBQWdCO0lBQ3RDLCtDQUErQztJQUMvQyw0Q0FBNEM7SUFDcEMsZUFBZSxDQUFXO0lBRWxDLElBQ0ksY0FBYyxDQUFDLGNBQXVCO1FBQ3hDLElBQUksQ0FBQyxlQUFlLEdBQUcsY0FBYyxDQUFDO0lBQ3hDLENBQUM7SUFFRCxJQUFJLGNBQWM7UUFDaEIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDO0lBQzlCLENBQUM7SUFFRCxJQUNJLElBQUksQ0FBQyxJQUFZO1FBQ25CLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0lBQ3BCLENBQUM7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Q0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBRWpELElBQUksQ0FBQyxlQUFlLEdBQUc7WUFDckIsVUFBVSxFQUFFLEdBQUc7WUFDZixXQUFXLEVBQUUsSUFBSTtTQUNsQixDQUFBO1FBQ0QsMkNBQTJDO0lBQzdDLENBQUM7SUFFRCxRQUFRO1FBQ04sSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7d0dBMWJVLGdCQUFnQjs0RkFBaEIsZ0JBQWdCLDJkQ3hCN0IsZ2VBV3dCOzs0RkRhWCxnQkFBZ0I7a0JBTDVCLFNBQVM7K0JBQ0UsZUFBZTt3REFNZixTQUFTO3NCQUFsQixNQUFNO2dCQUNHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFDNkMsU0FBUztzQkFBNUQsU0FBUzt1QkFBQyxhQUFhLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUNTLGVBQWU7c0JBQWpFLFNBQVM7dUJBQUMsbUJBQW1CLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQWlCN0MsY0FBYztzQkFEakIsS0FBSztnQkFVRixJQUFJO3NCQURQLEtBQUs7Z0JBVUYsTUFBTTtzQkFEVCxLQUFLO2dCQVVGLE9BQU87c0JBRFYsS0FBSztnQkFTRyxVQUFVO3NCQUFsQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAgQ29weXJpZ2h0IDIwMTggRXNyaVxuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qL1xuXG5pbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgVmlld0NoaWxkLCBFbGVtZW50UmVmLCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgbG9hZE1vZHVsZXMgfSBmcm9tICdlc3JpLWxvYWRlcic7XG5pbXBvcnQgZXNyaSA9IF9fZXNyaTtcbmltcG9ydCB7IExhdExvbmcgfSBmcm9tICdAb2hpb2VwYS9vZXBhLWViaXotbGliJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnb2VwYS1lc3JpLW1hcCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9lc3JpLW1hcC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2VzcmktbWFwLmNvbXBvbmVudC5jc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBFc3JpTWFwQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuICBAT3V0cHV0KCkgbWFwTG9hZGVkID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuICBAT3V0cHV0KCkgb25OZXdDb29yZGluYXRlczogRXZlbnRFbWl0dGVyPExhdExvbmc+ID0gbmV3IEV2ZW50RW1pdHRlcjxMYXRMb25nPigpO1xuICBAVmlld0NoaWxkKCdtYXBWaWV3Tm9kZScsIHsgc3RhdGljOiB0cnVlIH0pIHByaXZhdGUgbWFwVmlld0VsITogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgnbGF0TG9uZ1NlYXJjaE5vZGUnLCB7IHN0YXRpYzogZmFsc2UgfSkgbGF0TG9uZ1NlYXJjaEVsITogRWxlbWVudFJlZjtcblxuICAvKipcbiAgICogQHByaXZhdGUgX3pvb20gc2V0cyBtYXAgem9vbVxuICAgKiBAcHJpdmF0ZSBfY2VudGVyIHNldHMgbWFwIGNlbnRlclxuICAgKiBAcHJpdmF0ZSBfYmFzZW1hcCBzZXRzIHR5cGUgb2YgbWFwXG4gICAqL1xuICBwcml2YXRlIF96b29tOiBudW1iZXIgPSAxMDtcbiAgcHJpdmF0ZSBfY2VudGVyOiBBcnJheTxudW1iZXI+ID0gWzAuMTI3OCwgNTEuNTA3NF07XG4gIHByaXZhdGUgX2Jhc2VtYXA6IHN0cmluZyA9ICdzdHJlZXRzLXZlY3Rvcic7XG5cbiAgcHJpdmF0ZSBjdXJyZW50TWFwVmlldyE6IGVzcmkuTWFwVmlldztcbiAgLy8gcHJpdmF0ZSBjdXJyZW50R3JhcGhpYzogZXNyaS5HcmFwaGljID0gbnVsbDtcbiAgLy8gcHJpdmF0ZSBzZWxlY3RlZFBvaW50OiBlc3JpLlBvaW50ID0gbnVsbDtcbiAgcHJpdmF0ZSBfY3VycmVudExhdExvbmchOiBMYXRMb25nO1xuXG4gIEBJbnB1dCgpXG4gIHNldCBjdXJyZW50TGF0TG9uZyhjdXJyZW50TGF0TG9uZzogTGF0TG9uZykge1xuICAgIHRoaXMuX2N1cnJlbnRMYXRMb25nID0gY3VycmVudExhdExvbmc7XG4gIH1cblxuICBnZXQgY3VycmVudExhdExvbmcoKTogTGF0TG9uZyB7XG4gICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRMYXRMb25nO1xuICB9XG5cbiAgQElucHV0KClcbiAgc2V0IHpvb20oem9vbTogbnVtYmVyKSB7XG4gICAgdGhpcy5fem9vbSA9IHpvb207XG4gIH1cblxuICBnZXQgem9vbSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl96b29tO1xuICB9XG5cbiAgQElucHV0KClcbiAgc2V0IGNlbnRlcihjZW50ZXI6IEFycmF5PG51bWJlcj4pIHtcbiAgICB0aGlzLl9jZW50ZXIgPSBjZW50ZXI7XG4gIH1cblxuICBnZXQgY2VudGVyKCk6IEFycmF5PG51bWJlcj4ge1xuICAgIHJldHVybiB0aGlzLl9jZW50ZXI7XG4gIH1cblxuICBASW5wdXQoKVxuICBzZXQgYmFzZW1hcChiYXNlbWFwOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9iYXNlbWFwID0gYmFzZW1hcDtcbiAgfVxuXG4gIGdldCBiYXNlbWFwKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2Jhc2VtYXA7XG4gIH1cblxuICBASW5wdXQoKSBzaG93U2VhcmNoID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoKSB7IH1cblxuICBhc3luYyBpbml0aWFsaXplTWFwKCkge1xuICAgIC8vIHZhciBtYXBWaWV3O1xuICAgIGNvbnN0IFtFc3JpTWFwLCBFc3JpTWFwVmlldywgRXNyaUJhc2VtYXBUb2dnbGUsIGxvY2F0b3IgLCBTZWFyY2ggXSA9IGF3YWl0IGxvYWRNb2R1bGVzKFtcbiAgICAgICdlc3JpL01hcCcsXG4gICAgICAnZXNyaS92aWV3cy9NYXBWaWV3JyxcbiAgICAgIFwiZXNyaS93aWRnZXRzL0Jhc2VtYXBUb2dnbGVcIixcbiAgICAgIFwiZXNyaS9yZXN0L2xvY2F0b3JcIixcbiAgICAgIFwiZXNyaS93aWRnZXRzL1NlYXJjaFwiXG4gICAgXSk7XG5cbiAgICBjb25zdCBtZSA9IHRoaXM7XG4gICAgLy8gU2V0IHR5cGUgb2YgbWFwXG4gICAgY29uc3QgbWFwUHJvcGVydGllczogZXNyaS5NYXBQcm9wZXJ0aWVzID0ge1xuICAgICAgYmFzZW1hcDogdGhpcy5fYmFzZW1hcCxcbiAgICB9O1xuXG4gICAgY29uc3QgbWFwOiBlc3JpLk1hcCA9IG5ldyBFc3JpTWFwKG1hcFByb3BlcnRpZXMpO1xuXG4gICAgLy8gU2V0IHR5cGUgb2YgbWFwIHZpZXdcbiAgICBjb25zdCBtYXBWaWV3UHJvcGVydGllczogZXNyaS5NYXBWaWV3UHJvcGVydGllcyA9IHtcbiAgICAgIGNvbnRhaW5lcjogdGhpcy5tYXBWaWV3RWwubmF0aXZlRWxlbWVudCxcbiAgICAgIGNlbnRlcjogdGhpcy5fY2VudGVyLFxuICAgICAgem9vbTogdGhpcy5fem9vbSxcbiAgICAgIG1hcDogbWFwLFxuICAgICAgcG9wdXA6IHtcbiAgICAgICAgZG9ja0VuYWJsZWQ6IGZhbHNlLFxuICAgICAgICBkb2NrT3B0aW9uczoge1xuICAgICAgICAgIGJ1dHRvbkVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICAgIGJyZWFrcG9pbnQ6IGZhbHNlLFxuICAgICAgICB9XG4gICAgICB9LFxuICAgIH07XG5cbiAgICB2YXIgbWFwVmlldyA9IG5ldyBFc3JpTWFwVmlldyhtYXBWaWV3UHJvcGVydGllcyk7XG4gICAgbWFwVmlldy5wb3B1cC5hY3Rpb25zTWVudUVuYWJsZWQgPSBmYWxzZTtcbiAgICBtYXBWaWV3LnBvcHVwLl9kaXNwbGF5QWN0aW9uVGV4dExpbWl0ID0gMDsgLy8gY29udHJvbHMgd2hldGhlciBhY3Rpb24gYnV0dG9uIHRleHQgaXMgc2hvd25cbiAgICB0aGlzLmN1cnJlbnRNYXBWaWV3ID0gbWFwVmlldztcblxuICAgIC8vIEFsbCByZXNvdXJjZXMgaW4gdGhlIE1hcFZpZXcgYW5kIHRoZSBtYXAgaGF2ZSBsb2FkZWQuXG4gICAgLy8gTm93IGV4ZWN1dGUgYWRkaXRpb25hbCBwcm9jZXNzZXNcbiAgICAvLyB0aGlzLmN1cnJlbnRNYXBWaWV3LndoZW4oKCkgPT4ge1xuICAgIC8vICAgdGhpcy5tYXBMb2FkZWQuZW1pdCh0cnVlKTtcbiAgICAvLyB9KTtcblxuICAgIC8vIDEgLSBDcmVhdGUgdGhlIHdpZGdldFxuICAgIGNvbnN0IHRvZ2dsZTogZXNyaS5CYXNlbWFwVG9nZ2xlID0gbmV3IEVzcmlCYXNlbWFwVG9nZ2xlKHtcbiAgICAgIC8vIDIgLSBTZXQgcHJvcGVydGllc1xuICAgICAgdmlldzogbWFwVmlldywgLy8gdmlldyB0aGF0IHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgbWFwJ3MgJ3RvcG8nIGJhc2VtYXBcbiAgICAgIG5leHRCYXNlbWFwOiBcImh5YnJpZFwiIC8vIGFsbG93cyBmb3IgdG9nZ2xpbmcgdG8gdGhlICdoeWJyaWQnIGJhc2VtYXBcbiAgICB9KTtcblxuICAgIC8vIEFkZCB3aWRnZXQgdG8gdGhlIHRvcCByaWdodCBjb3JuZXIgb2YgdGhlIHZpZXdcbiAgICBtYXBWaWV3LnVpLmFkZCh0b2dnbGUsIFwiYm90dG9tLXJpZ2h0XCIpO1xuXG4gICAgdmFyIHVwZGF0ZUxhdExvbmdBY3Rpb24gPSB7XG4gICAgICB0aXRsZTogXCJZZXNcIixcbiAgICAgIGlkOiBcInVwZGF0ZS1sYXQtbG9uZ1wiLFxuICAgICAgLy8gaW1hZ2U6IFwiTWVhc3VyZV9EaXN0YW5jZTE2LnBuZ1wiLFxuICAgICAgY2xhc3NOYW1lOiBcImJpIGJpLWhhbmQtdGh1bWJzLXVwLWZpbGxcIlxuICAgIH07XG5cbiAgICB2YXIgY2FuY2VsVXBkYXRlQWN0aW9uID0ge1xuICAgICAgdGl0bGU6IFwiTm9cIixcbiAgICAgIGlkOiBcImNhbmNlbC11cGRhdGVcIixcbiAgICAgIC8vIGltYWdlOiBcIk1lYXN1cmVfRGlzdGFuY2UxNi5wbmdcIixcbiAgICAgIGNsYXNzTmFtZTogXCJiaSBiaS1oYW5kLXRodW1icy1kb3duLWZpbGxcIlxuICAgIH07XG5cbiAgICAvL3RoaXMuY3VycmVudE1hcFZpZXcucG9wdXAuY29udGVudCA9ICd7ZmFjaWxpdHlOYW1lfSc7XG5cbiAgICAvLyB0aGlzLmN1cnJlbnRNYXBWaWV3Lm9uKFwiY2xpY2tcIiwgZXZlbnQgPT4ge1xuICAgIC8vICAgbGV0IGNsaWNrU3ltYm9sOiBlc3JpLlNpbXBsZU1hcmtlclN5bWJvbCA9IG5ldyBTaW1wbGVNYXJrZXJTeW1ib2woe1xuICAgIC8vICAgICB0eXBlOiAnc2ltcGxlLW1hcmtlcicsXG4gICAgLy8gICAgIHN0eWxlOiAnZGlhbW9uZCcsXG4gICAgLy8gICAgIGNvbG9yOiAncmVkJyxcbiAgICAvLyAgICAgc2l6ZTogJzIwcHQnXG4gICAgLy8gICB9KTtcbiAgICAvLyAgIHRoaXMuY3VycmVudE1hcFZpZXcuZ3JhcGhpY3MucmVtb3ZlKHRoaXMuY3VycmVudEdyYXBoaWMpO1xuICAgIC8vICAgdGhpcy5jdXJyZW50R3JhcGhpYyA9IG5ldyBHcmFwaGljKHtcbiAgICAvLyAgICAgZ2VvbWV0cnkgOiBldmVudC5tYXBQb2ludCxcbiAgICAvLyAgICAgc3ltYm9sIDogY2xpY2tTeW1ib2xcbiAgICAvLyAgIH0pXG5cbiAgICAvLyAgIHRoaXMuYWRkUG9pbnQoU3RyaW5nKGV2ZW50Lm1hcFBvaW50LmxhdGl0dWRlKSwgU3RyaW5nKGV2ZW50Lm1hcFBvaW50LmxvbmdpdHVkZSkpO1xuICAgIC8vIH0pO1xuXG4gICAgLy8gdmFyIHN5bWJvbCA9IG5ldyBTaW1wbGVNYXJrZXJTeW1ib2woXG4gICAgLy8gICBTaW1wbGVNYXJrZXJTeW1ib2wuU1RZTEVfQ0lSQ0xFLFxuICAgIC8vICAgMTIsXG4gICAgLy8gICBuZXcgU2ltcGxlTGluZVN5bWJvbChcbiAgICAvLyAgICAgU2ltcGxlTGluZVN5bWJvbC5TVFlMRV9OVUxMLFxuICAgIC8vICAgICBuZXcgQ29sb3IoWzI0NywgMzQsIDEwMSwgMC45XSksXG4gICAgLy8gICAgIDFcbiAgICAvLyAgICksXG4gICAgLy8gICBuZXcgQ29sb3IoWzIwNywgMzQsIDE3MSwgMC41XSlcbiAgICAvLyApO1xuXG4gICAgLy8gbWFwVmlldy53aGVuKCgpID0+IHtcbiAgICAvLyAgIHRoaXMubWFwTG9hZGVkLmVtaXQodHJ1ZSk7XG4gICAgLy8gICBtYXBWaWV3Lm9uKFwiY2xpY2tcIiwgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAvLyAgICAgLy8geW91IG11c3Qgb3ZlcndyaXRlIGRlZmF1bHQgY2xpY2stZm9yLXBvcHVwXG4gICAgLy8gICAgIC8vIGJlaGF2aW9yIHRvIGRpc3BsYXkgeW91ciBvd24gcG9wdXBcbiAgICAvLyAgICAgLy8gbWUuY3VycmVudE1hcFZpZXcucG9wdXAuYXV0b09wZW5FbmFibGVkID0gZmFsc2U7XG5cbiAgICAvLyAgICAgLy8gR2V0IHRoZSBjb29yZGluYXRlcyBvZiB0aGUgY2xpY2sgb24gdGhlIHZpZXdcbiAgICAvLyAgICAgdmFyIGxhdCA9IE1hdGgucm91bmQoZXZlbnQubWFwUG9pbnQubGF0aXR1ZGUgKiAxMDAwKSAvIDEwMDA7XG4gICAgLy8gICAgIHZhciBsb24gPSBNYXRoLnJvdW5kKGV2ZW50Lm1hcFBvaW50LmxvbmdpdHVkZSAqIDEwMDApIC8gMTAwMDtcbiAgICAvLyAgICAgdmFyIGluZm8gPSBsYXQgKyAnLCAnICsgbG9uO1xuXG4gICAgLy8gICAgIG1hcFZpZXcuZ3JhcGhpY3MuY2xlYXIoKTtcbiAgICAvLyAgICAgbWFwVmlldy5ncmFwaGljcy5hZGQobmV3IEdyYXBoaWMoZXZlbnQubWFwUG9pbnQsIHN5bWJvbCkpO1xuICAgIC8vICAgICBtYXAuaW5mb1dpbmRvdy5zZXRDb250ZW50KFwiWDogXCIgKyBldmVudC5tYXBQb2ludC54LnRvU3RyaW5nKCkgKyBcIiwgPGJyPlk6IFwiICsgZXZlbnQubWFwUG9pbnQueS50b1N0cmluZygpKTtcbiAgICAvLyAgICAgbWFwVmlldy5pbmZvV2luZG93LnNob3coZXZlbnQubWFwUG9pbnQpXG5cbiAgICAvLyAgICAgY29uc3QgcG9wdGVzdCA9IG5ldyBQb3B1cCh7XG4gICAgLy8gICAgICAgdGl0bGU6IFwiUmV2ZXJzZSBnZW9jb2RlOiBbXCIgKyBsb24gKyBcIiwgXCIgKyBsYXQgKyBcIl1cIixcbiAgICAvLyAgICAgICBsb2NhdGlvbjogZXZlbnQubWFwUG9pbnQsIC8vIFNldCB0aGUgbG9jYXRpb24gb2YgdGhlIHBvcHVwIHRvIHRoZSBjbGlja2VkIGxvY2F0aW9uXG4gICAgLy8gICAgICAgY29udGVudDogXCJUaGlzIGlzIGEgcG9pbnQgb2YgaW50ZXJlc3RcIiAgLy8gY29udGVudCBkaXNwbGF5ZWQgaW4gdGhlIHBvcHVwXG4gICAgLy8gICAgIH0pXG4gICAgLy8gICAgIG1hcFZpZXcucG9wdXAub3Blbih7XG4gICAgLy8gICAgICAgLy8gU2V0IHRoZSBwb3B1cCdzIHRpdGxlIHRvIHRoZSBjb29yZGluYXRlcyBvZiB0aGUgbG9jYXRpb25cbiAgICAvLyAgICAgICB0aXRsZTogXCJSZXZlcnNlIGdlb2NvZGU6IFtcIiArIGxvbiArIFwiLCBcIiArIGxhdCArIFwiXVwiLFxuICAgIC8vICAgICAgIGxvY2F0aW9uOiBldmVudC5tYXBQb2ludCwgLy8gU2V0IHRoZSBsb2NhdGlvbiBvZiB0aGUgcG9wdXAgdG8gdGhlIGNsaWNrZWQgbG9jYXRpb25cbiAgICAvLyAgICAgICBjb250ZW50OiBcIlRoaXMgaXMgYSBwb2ludCBvZiBpbnRlcmVzdFwiICAvLyBjb250ZW50IGRpc3BsYXllZCBpbiB0aGUgcG9wdXBcbiAgICAvLyAgICAgfSk7XG4gICAgLy8gICAgIC8vIG1lLnNob3dQb3B1cChpbmZvLCBldmVudCk7XG5cbiAgICAvLyAgICB9KTtcblxuICAgIC8vICAgLy8gIG1hcFZpZXcucG9wdXAub24oXCJ0cmlnZ2VyLWFjdGlvblwiLCBmdW5jdGlvbihldnQpe1xuICAgIC8vICAgLy8gICAgaWYoZXZ0LmFjdGlvbi5pZCA9PT0gXCJtb3JlLWRldGFpbHNcIil7XG4gICAgLy8gICAvLyAgICAgIC8vIGFkZCBncmFwaGljIGF0IHZpZXcucG9wdXAubG9jYXRpb25cbiAgICAvLyAgIC8vICAgIH1cbiAgICAvLyAgIC8vICB9KTtcblxuICAgIC8vICAgfSlcblxuICAgIC8qXG4gICAgICogQ3JlYXRlIHRoZSBTZWFyY2ggQm94IHdpZGdldCB1c2VkIGZvciBhZGRyZXNzIGxvb2t1cC4gc2VhcmNoSWQgaXMgdGhlIGlkIG9mIHRoZSBIVE1MIHRhZyAodXN1YWxseSBhIERJVilcbiAgICAgKiB0aGF0IGlzIHRoZSBwbGFjZWhvbGRlciBmb3IgdGhlIHNlYXJjaCBib3guXG4gICAgICovXG4gICAgaWYgKHRoaXMuc2hvd1NlYXJjaCkge1xuICAgICAgdmFyIHNlYXJjaFdpZGdldCA9IG5ldyBTZWFyY2goe1xuICAgICAgICB2aWV3OiBtYXBWaWV3LFxuICAgICAgICBsb2NhdGlvbkVuYWJsZWQ6IGZhbHNlLFxuICAgICAgICBjb250YWluZXI6IHRoaXMubGF0TG9uZ1NlYXJjaEVsLm5hdGl2ZUVsZW1lbnQsXG4gICAgICAgIHBvcHVwRW5hYmxlZDogZmFsc2VcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIG1hcFZpZXcud2hlbihmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAobWUuX2N1cnJlbnRMYXRMb25nICYmXG4gICAgICAgICAgbWUuX2N1cnJlbnRMYXRMb25nLmxhdERlY2ltYWwgJiYgbWUuX2N1cnJlbnRMYXRMb25nLmxhdERlY2ltYWwgIT09ICcnICYmXG4gICAgICAgICAgbWUuX2N1cnJlbnRMYXRMb25nLmxvbmdEZWNpbWFsICYmIG1lLl9jdXJyZW50TGF0TG9uZy5sb25nRGVjaW1hbCAhPT0gJycpIHtcbiAgICAgICAgbWUuYWRkUG9pbnQobWUuX2N1cnJlbnRMYXRMb25nLmxhdERlY2ltYWwsIG1lLl9jdXJyZW50TGF0TG9uZy5sb25nRGVjaW1hbCwgJ3h4eCcpO1xuICAgICAgICBtZS56b29tVG9GYWNpbGl0eShtZS5fY3VycmVudExhdExvbmcubGF0RGVjaW1hbCwgbWUuX2N1cnJlbnRMYXRMb25nLmxvbmdEZWNpbWFsKTtcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgbWFwVmlldy53aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIG1hcFZpZXcub24oXCJtb3VzZS13aGVlbFwiLCBmdW5jdGlvbiAoZXZlbnQ6YW55KSB7XG4gICAgICAgIC8vIHByZXZlbnRzIHpvb21pbmcgd2l0aCB0aGUgbW91c2Utd2hlZWwgZXZlbnRcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB9KTtcbiAgICB9KVxuXG4gICAgbWFwVmlldy53aGVuKGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKHNlYXJjaFdpZGdldCkge1xuICAgICAgICBzZWFyY2hXaWRnZXQub24oXCJzZWxlY3QtcmVzdWx0XCIsIGZ1bmN0aW9uIChldmVudDphbnkpIHtcbiAgICAgICAgICBzaG93UG9wdXAoXCJ4eHhcIiwgZXZlbnQucmVzdWx0LmZlYXR1cmUuZ2VvbWV0cnkpO1xuICBcbiAgICAgICAgICAvLyBsZXQgbmV3TGF0TG9uZzogTGF0TG9uZyA9IHtcbiAgICAgICAgICAvLyAgIGxhdERlY2ltYWw6IG1hcFZpZXcucG9wdXAubG9jYXRpb24ubGF0aXR1ZGUsXG4gICAgICAgICAgLy8gICBsb25nRGVjaW1hbDogbWFwVmlldy5wb3B1cC5sb2NhdGlvbi5sb25naXR1ZGVcbiAgICAgICAgICAvLyB9XG4gICAgICAgICAgLy8gbWUub25OZXdDb29yZGluYXRlcy5lbWl0KG5ld0xhdExvbmcpOyAvLyB0aGlzIHVwZGF0ZXMgbGF0L2xvbmcgZmllbGRzIGFzIHNvb24gYXMgeW91IGNsaWNrIHNlbGVjdGVkIGFkZHJlc3NcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSlcblxuICAgIG1hcFZpZXcud2hlbihmdW5jdGlvbiAoKSB7XG4gICAgICBtYXBWaWV3LnBvcHVwLmF1dG9PcGVuRW5hYmxlZCA9IGZhbHNlO1xuICAgICAgbWFwVmlldy5vbihcImNsaWNrXCIsIGZ1bmN0aW9uIChldmVudDphbnkpIHtcbiAgICAgICAgc2VhcmNoV2lkZ2V0LmNsZWFyKCk7XG4gICAgICAgIG1hcFZpZXcucG9wdXAuY2xlYXIoKTtcbiAgICAgICAgLy8gR2V0IHRoZSBjb29yZGluYXRlcyBvZiB0aGUgY2xpY2sgb24gdGhlIHZpZXcgYXJvdW5kIHRoZSBkZWNpbWFscyB0byAzIGRlY2ltYWxzXG4gICAgICAgIC8vIHZhciBsYXQgPSBNYXRoLnJvdW5kKGV2ZW50Lm1hcFBvaW50LmxhdGl0dWRlICogMTAwMCkgLyAxMDAwO1xuICAgICAgICAvLyB2YXIgbG9uID0gTWF0aC5yb3VuZChldmVudC5tYXBQb2ludC5sb25naXR1ZGUgKiAxMDAwKSAvIDEwMDA7XG4gICAgICAgIC8vIHRoaXMuc2VsZWN0ZWRQb2ludCA9IGV2ZW50Lm1hcFBvaW50O1xuXG4gICAgICAgIC8vIG1hcFZpZXcucG9wdXAub3Blbih7ICAgLy9kZWZpbmVcbiAgICAgICAgLy8gICB0aXRsZTogXCI8ZGl2IHN0eWxlPSdmb250LXNpemU6IDEycHg7IGZvbnQtZmFtaWx5OiBWZXJkYW5hLCBHZW5ldmEsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Jz5VcGRhdGUgTGF0aXR1ZGUgYW5kIExvbmdpdHVkZTwvZGl2PlwiLFxuICAgICAgICAvLyAgIGNvbnRlbnQ6IFxuICAgICAgICAvLyAgICBcIjxkaXYgc3R5bGU9J2JvbGQnPkFkZHJlc3M6IDwvZGl2PlwiICsgXCI8ZGl2PlwiICsgYWRkcmVzcyArIFwiPC9kaXY+XCIgK1xuICAgICAgICAvLyAgIFwiPGlucHV0IHR5cGU9J2J1dHRvbicgdmFsdWU9JyBZZXMnIGlkPSdcIiArIG9wdGlvbnMubWFwSWQgKyBcInVwZGF0ZUxhdExvbmcnPiZuYnNwOzxpbnB1dCB0eXBlPSdidXR0b24nIHZhbHVlPSdObycgaWQ9J1wiICsgb3B0aW9ucy5tYXBJZCArIFwiY2FuY2VsSW5mb1dpbmRvdyc+XCIgLFxuICAgICAgICAvLyAgIGxvY2F0aW9uOiBldmVudC5tYXBQb2ludCxcbiAgICAgICAgLy8gICBhY3Rpb25zOiBbdXBkYXRlTGF0TG9uZ0FjdGlvbiwgY2FuY2VsVXBkYXRlQWN0aW9uXSxcbiAgICAgICAgLy8gfSk7XG4gICAgICAgIC8vIERpc3BsYXkgdGhlIHBvcHVwXG4gICAgICAgIC8vIEV4ZWN1dGUgYSByZXZlcnNlIGdlb2NvZGUgdXNpbmcgdGhlIGNsaWNrZWQgbG9jYXRpb25cbiAgICAgICAgbG9jYXRvci5sb2NhdGlvblRvQWRkcmVzcyhcImh0dHBzOi8vZ2VvY29kZS5hcmNnaXMuY29tL2FyY2dpcy9yZXN0L3NlcnZpY2VzL1dvcmxkL0dlb2NvZGVTZXJ2ZXJcIiwgeyBsb2NhdGlvbjogZXZlbnQubWFwUG9pbnQgfSlcbiAgICAgICAgICAudGhlbihmdW5jdGlvbiAocmVzcG9uc2U6YW55KSB7XG4gICAgICAgICAgICAvLyBJZiBhbiBhZGRyZXNzIGlzIHN1Y2Nlc3NmdWxseSBmb3VuZCwgc2hvdyBpdCBpbiB0aGUgcG9wdXAncyBjb250ZW50XG4gICAgICAgICAgICBtYXBWaWV3LnBvcHVwLmNvbnRlbnQgPSByZXNwb25zZS5hZGRyZXNzO1xuICAgICAgICAgICAgdmFyIGFkZHJlc3MgPSByZXNwb25zZS5hZGRyZXNzO1xuICAgICAgICAgICAgc2hvd1BvcHVwKGFkZHJlc3MsIGV2ZW50Lm1hcFBvaW50KTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5jYXRjaChmdW5jdGlvbiAoZXJyb3I6YW55KSB7XG4gICAgICAgICAgICAvLyBJZiB0aGUgcHJvbWlzZSBmYWlscyBhbmQgbm8gcmVzdWx0IGlzIGZvdW5kLCBzaG93IGEgZ2VuZXJpYyBtZXNzYWdlXG4gICAgICAgICAgICBtYXBWaWV3LnBvcHVwLmNvbnRlbnQgPSBcIk5vIGFkZHJlc3Mgd2FzIGZvdW5kIGZvciB0aGlzIGxvY2F0aW9uXCI7XG4gICAgICAgICAgICBzaG93UG9wdXAoXCJObyBhZGRyZXNzIGZvdW5kLlwiLCBldmVudC5tYXBQb2ludCk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgbWFwVmlldy5wb3B1cC52aXNpYmxlID0gdHJ1ZTtcbiAgICAgIH0pO1xuICAgIH0pXG5cbiAgICBtYXBWaWV3LndoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgbWFwVmlldy5wb3B1cC5vbihcInRyaWdnZXItYWN0aW9uXCIsIGZ1bmN0aW9uIChldmVudDphbnkpIHtcbiAgICAgICAgLy8gRXhlY3V0ZSB0aGUgbWVhc3VyZVRoaXMoKSBmdW5jdGlvbiBpZiB0aGUgbWVhc3VyZS10aGlzIGFjdGlvbiBpcyBjbGlja2VkXG4gICAgICAgIGlmIChldmVudC5hY3Rpb24uaWQgPT09IFwidXBkYXRlLWxhdC1sb25nXCIpIHtcbiAgICAgICAgICB1cGRhdGVMYXRMb25nKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQuYWN0aW9uLmlkID09PSBcImNhbmNlbC11cGRhdGVcIikge1xuICAgICAgICAgIGNhbmNlbFVwZGF0ZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KVxuXG4gICAgZnVuY3Rpb24gc2hvd1BvcHVwKGFkZHJlc3M6YW55LCBwdDphbnkpIHtcbiAgICAgIG1hcFZpZXcucG9wdXAub3Blbih7XG4gICAgICAgIHRpdGxlOiBcIjxkaXYgc3R5bGU9J2ZvbnQtc2l6ZTogMTJweDsgZm9udC1mYW1pbHk6IFZlcmRhbmEsIEdlbmV2YSwgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsnPlVwZGF0ZSBMYXRpdHVkZSBhbmQgTG9uZ2l0dWRlPzwvZGl2PlwiLFxuICAgICAgICBjb250ZW50OlxuICAgICAgICAgIC8vICBcIjxkaXYgc3R5bGU9J2JvbGQnPkFkZHJlc3M6IDwvZGl2PlwiICsgXCI8ZGl2PlwiICsgYWRkcmVzcyArIFwiPC9kaXY+XCIgK1xuICAgICAgICAgIFwiPGRpdiBzdHlsZT0nZm9udC1zaXplOiAxMnB4OyBmb250LWZhbWlseTogVmVyZGFuYSwgR2VuZXZhLCBBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOyc+PGRpdj5Xb3VsZCB5b3UgbGlrZSB0byB1cGRhdGUgdGhlIGxhdGl0dWRlIGFuZCBsb25naXR1ZGUgdmFsdWVzIGFzIHNob3duIGJlbG93PzwvZGl2PlwiICtcbiAgICAgICAgICAnPGJyLz4nICtcbiAgICAgICAgICBcIjxkaXY+TGF0aXR1ZGU6IFwiICsgTWF0aC5yb3VuZChwdC5sYXRpdHVkZSAqIDEwMDAwMCkgLyAxMDAwMDAgKyBcIjwvZGl2PlwiICtcbiAgICAgICAgICBcIjxkaXY+TG9uZ2l0dWRlOiBcIiArIE1hdGgucm91bmQocHQubG9uZ2l0dWRlICogMTAwMDAwKSAvIDEwMDAwMCArIFwiPC9kaXY+PC9kaXY+XCIsXG4gICAgICAgIC8vIFwiPGlucHV0IHR5cGU9J2J1dHRvbicgdmFsdWU9JyBZZXMnIGlkPSdcIiArIG9wdGlvbnMubWFwSWQgKyBcInVwZGF0ZUxhdExvbmcnPiZuYnNwOzxpbnB1dCB0eXBlPSdidXR0b24nIHZhbHVlPSdObycgaWQ9J1wiICsgb3B0aW9ucy5tYXBJZCArIFwiY2FuY2VsSW5mb1dpbmRvdyc+XCIgLFxuICAgICAgICBsb2NhdGlvbjogcHQsXG4gICAgICAgIGFjdGlvbnM6IFt1cGRhdGVMYXRMb25nQWN0aW9uLCBjYW5jZWxVcGRhdGVBY3Rpb25dLFxuICAgICAgICBjb2xsYXBzZWQ6IHRydWVcbiAgICAgIH0pO1xuICAgICAgLy8gbWFwVmlldy5wb3B1cC5fZGlzcGxheUFjdGlvblRleHRMaW1pdCA9IDM7IC8vIGNvbnRyb2xzIHdoZXRoZXIgYWN0aW9uIGJ1dHRvbiB0ZXh0IGlzIHNob3duXG5cbiAgICB9XG5cbiAgICBmdW5jdGlvbiB1cGRhdGVMYXRMb25nKCkge1xuICAgICAgbWFwVmlldy5ncmFwaGljcy5yZW1vdmVBbGwoKTtcbiAgICAgIC8vIG1hcFZpZXcuZ3JhcGhpY3MuYWRkKG5ldyBHcmFwaGljKGV2ZW50Lm1hcFBvaW50LCBzeW1ib2wpKTtcbiAgICAgIG1lLmFkZFBvaW50KG1hcFZpZXcucG9wdXAubG9jYXRpb24ubGF0aXR1ZGUsIG1hcFZpZXcucG9wdXAubG9jYXRpb24ubG9uZ2l0dWRlLCAneHh4Jyk7XG5cbiAgICAgIGxldCBuZXdMYXRMb25nOiBMYXRMb25nID0ge1xuICAgICAgICBsYXREZWNpbWFsOiBtYXBWaWV3LnBvcHVwLmxvY2F0aW9uLmxhdGl0dWRlLFxuICAgICAgICBsb25nRGVjaW1hbDogbWFwVmlldy5wb3B1cC5sb2NhdGlvbi5sb25naXR1ZGVcbiAgICAgIH1cbiAgICAgIG1lLm9uTmV3Q29vcmRpbmF0ZXMuZW1pdChuZXdMYXRMb25nKTtcblxuICAgICAgY2FuY2VsVXBkYXRlKCk7XG4gICAgICBtYXBWaWV3LnBvcHVwLmNsb3NlKCk7XG4gICAgICAvLyBjb25zb2xlLmxvZyhcInVwZGF0ZUxhdExvbmcgY2FsbGVkIGZvciBsYXQ6IFwiICsgbWFwVmlldy5wb3B1cC5sb2NhdGlvbi5sYXRpdHVkZSArIFwiLCBsb25nOiBcIiArIG1hcFZpZXcucG9wdXAubG9jYXRpb24ubG9uZ2l0dWRlKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjYW5jZWxVcGRhdGUoKSB7XG4gICAgICBtYXBWaWV3LnBvcHVwLmNsb3NlKCk7XG4gICAgICAvLyBjb25zb2xlLmxvZyhcImNhbmNlbFVwZGF0ZSBjYWxsZWRcIik7XG4gICAgfVxuXG4gICAgLy8qKiogQWRkIGRpdiBlbGVtZW50IHRvIHNob3cgY29vcmRhdGVzICoqKi8vXG4gICAgdmFyIGNvb3Jkc1dpZGdldCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgY29vcmRzV2lkZ2V0LmlkID0gXCJjb29yZHNXaWRnZXRcIjtcbiAgICBjb29yZHNXaWRnZXQuY2xhc3NOYW1lID0gXCJlc3JpLXdpZGdldCBlc3JpLWNvbXBvbmVudFwiO1xuICAgIGNvb3Jkc1dpZGdldC5zdHlsZS5wYWRkaW5nID0gXCI3cHggMTVweCA1cHhcIjtcbiAgICBtYXBWaWV3LnVpLmFkZChjb29yZHNXaWRnZXQsIFwiYm90dG9tLXJpZ2h0XCIpO1xuXG4gICAgLy8qKiogVXBkYXRlIGxhdCwgbG9uLCB6b29tIGFuZCBzY2FsZSAqKiovL1xuICAgIGZ1bmN0aW9uIHNob3dDb29yZGluYXRlcyhwdDphbnkpIHtcbiAgICAgIHZhciBjb29yZHMgPSBcIkxhdC9Mb24gXCIgKyBwdC5sYXRpdHVkZS50b0ZpeGVkKDMpICsgXCIgXCIgKyBwdC5sb25naXR1ZGUudG9GaXhlZCgzKSArXG4gICAgICAgIFwiIHwgU2NhbGUgMTpcIiArIE1hdGgucm91bmQobWFwVmlldy5zY2FsZSAqIDEpIC8gMSArXG4gICAgICAgIFwiIHwgWm9vbSBcIiArIG1hcFZpZXcuem9vbTtcbiAgICAgIGNvb3Jkc1dpZGdldC5pbm5lckhUTUwgPSBjb29yZHM7XG4gICAgfVxuXG4gICAgLy8qKiogQWRkIGV2ZW50IGFuZCBzaG93IGNlbnRlciBjb29yZGluYXRlcyBhZnRlciB0aGUgdmlldyBpcyBmaW5pc2hlZCBtb3ZpbmcgZS5nLiB6b29tLCBwYW4gKioqLy9cbiAgICBtYXBWaWV3LndhdGNoKFtcInN0YXRpb25hcnlcIl0sIGZ1bmN0aW9uICgpIHtcbiAgICAgIHNob3dDb29yZGluYXRlcyhtYXBWaWV3LmNlbnRlcik7XG4gICAgfSk7XG5cbiAgICAvLyoqKiBBZGQgZXZlbnQgdG8gc2hvdyBtb3VzZSBjb29yZGluYXRlcyBvbiBjbGljayBhbmQgbW92ZSAqKiovL1xuICAgIG1hcFZpZXcub24oW1wicG9pbnRlci1kb3duXCIsIFwicG9pbnRlci1tb3ZlXCJdLCBmdW5jdGlvbiAoZXZ0OmFueSkge1xuICAgICAgc2hvd0Nvb3JkaW5hdGVzKG1hcFZpZXcudG9NYXAoeyB4OiBldnQueCwgeTogZXZ0LnkgfSkpO1xuICAgIH0pO1xuXG4gIH1cblxuICBhc3luYyByZXNldE1hcCgpIHtcbiAgICB0aGlzLmN1cnJlbnRNYXBWaWV3LmdyYXBoaWNzLnJlbW92ZUFsbCgpO1xuICAgIHRoaXMuY3VycmVudE1hcFZpZXcuZ29Ubyh7XG4gICAgICB0YXJnZXQ6IHRoaXMuX2NlbnRlcixcbiAgICAgIHpvb206IHRoaXMuX3pvb21cbiAgICB9XG4gICAgKTtcbiAgICB0aGlzLnpvb21Ub0ZhY2lsaXR5XG4gIH1cblxuICBhc3luYyB6b29tVG9GYWNpbGl0eShsYXQ6IHN0cmluZywgbG9uZzogc3RyaW5nKSB7XG4gICAgY29uc3QgW1BvaW50XSA9IGF3YWl0IGxvYWRNb2R1bGVzKFtcbiAgICAgICdlc3JpL2dlb21ldHJ5L1BvaW50J1xuICAgIF0pO1xuICAgIGxldCBwb2ludDogZXNyaS5Qb2ludCA9IG5ldyBQb2ludCh7XG4gICAgICBsYXRpdHVkZTogbGF0LCAvLzM5Ljk1Nzc2NyxcbiAgICAgIGxvbmdpdHVkZTogbG9uZyAvLy04Mi45OTQ5MzlcbiAgICB9KTtcblxuICAgIHRoaXMuY3VycmVudE1hcFZpZXcuZ29Ubyh7XG4gICAgICB0YXJnZXQ6IHBvaW50LFxuICAgICAgem9vbTogMTZcbiAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8vIGFzeW5jIHJlbW92ZVNlbGVjdGVkUG9pbnQoKSB7XG4gIC8vICAgaWYgKHRoaXMuY3VycmVudEdyYXBoaWMpIHtcbiAgLy8gICAgIHRoaXMuY3VycmVudE1hcFZpZXcubWFwLlxuICAvLyAgIH1cbiAgLy8gfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgbmV3IHBvaW50IHRvIHRoZSBjdXJyZW50IG1hcCB3aXRoIHRoZSBnaXZlbiBsYXQvbG9uZyB2YWx1ZXMuXG4gICAqIEBwYXJhbSBsYXQgXG4gICAqIEBwYXJhbSBsb25nIFxuICAgKi9cbiAgYXN5bmMgYWRkUG9pbnQobGF0OiBzdHJpbmcsIGxvbmc6IHN0cmluZywgbmFtZTogc3RyaW5nKSB7XG4gICAgY29uc3QgW1BvaW50LCBHcmFwaGljLCBTaW1wbGVNYXJrZXJTeW1ib2wsIEFjdGlvbkJ1dHRvbl0gPSBhd2FpdCBsb2FkTW9kdWxlcyhbXG4gICAgICAnZXNyaS9nZW9tZXRyeS9Qb2ludCcsXG4gICAgICAnZXNyaS9HcmFwaGljJyxcbiAgICAgICdlc3JpL3N5bWJvbHMvU2ltcGxlTWFya2VyU3ltYm9sJyxcbiAgICAgICdlc3JpL3N1cHBvcnQvYWN0aW9ucy9BY3Rpb25CdXR0b24nXG4gICAgXSk7XG5cbiAgICBsZXQgcG9pbnQ6IGVzcmkuUG9pbnQgPSBuZXcgUG9pbnQoe1xuICAgICAgbGF0aXR1ZGU6IGxhdCwgLy8zOS45NTc3NjcsXG4gICAgICBsb25naXR1ZGU6IGxvbmcgLy8tODIuOTk0OTM5XG4gICAgfSk7XG5cbiAgICBsZXQgc3ltYm9sOiBlc3JpLlNpbXBsZU1hcmtlclN5bWJvbCA9IG5ldyBTaW1wbGVNYXJrZXJTeW1ib2woe1xuICAgICAgLy8gdHlwZTogJ3NpbXBsZS1tYXJrZXInLFxuICAgICAgc3R5bGU6ICdjaXJjbGUnLFxuICAgICAgY29sb3I6ICdibHVlJyxcbiAgICAgIHNpemU6ICcxMnB4J1xuICAgIH0pO1xuXG4gICAgbGV0IGFjdGlvbkJ1dHRvbjogZXNyaS5BY3Rpb25CdXR0b24gPSBuZXcgQWN0aW9uQnV0dG9uKHtcbiAgICAgIGFjdGl2ZTogdHJ1ZSxcbiAgICAgIHZpc2libGU6IHRydWUsXG4gICAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgICBpZDogJ3NlbGVjdEZhY2lsaXR5JyxcbiAgICAgIHRpdGxlOiAnU2VsZWN0IEZhY2lsaXR5JyxcbiAgICAgIHR5cGU6ICdidXR0b24nXG4gICAgfSk7XG5cbiAgICBsZXQgY3VycmVudEdyYXBoaWMgPSBuZXcgR3JhcGhpYyh7XG4gICAgICBnZW9tZXRyeTogcG9pbnQsXG4gICAgICBzeW1ib2w6IHN5bWJvbCxcbiAgICAgIHBvcHVwVGVtcGxhdGU6IHtcbiAgICAgICAgdGl0bGU6IG5hbWUsXG4gICAgICAgIGNvbnRlbnQ6IG5hbWUsXG4gICAgICB9LFxuICAgICAgYWN0aW9uczogW2FjdGlvbkJ1dHRvbl1cbiAgICB9KTtcblxuICAgIHRoaXMuY3VycmVudE1hcFZpZXcuZ3JhcGhpY3MuYWRkKGN1cnJlbnRHcmFwaGljKTtcblxuICAgIHRoaXMuX2N1cnJlbnRMYXRMb25nID0ge1xuICAgICAgbGF0RGVjaW1hbDogbGF0LFxuICAgICAgbG9uZ0RlY2ltYWw6IGxvbmdcbiAgICB9XG4gICAgLy8gY29uc29sZS5sb2coJ0FkZGVkIHBvaW50OiAnLCBsYXQsIGxvbmcpO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5pbml0aWFsaXplTWFwKCk7XG4gIH1cblxufSIsIjwhLS0gSGVyZSdzIHRoZSBESVYgdGhhdCB3ZSBpbmplY3QgdGhlIG1hcCBpbnRvIC0tPlxuPGRpdiAqbmdJZj1cInNob3dTZWFyY2hcIiBjbGFzcz1cInJvd1wiPlxuICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCI+XG4gICAgPGRpdiBjbGFzcz1cImFsZXJ0IGFsZXJ0LXN1Y2Nlc3NcIj5cbiAgICAgIDxsYWJlbD5TZWFyY2ggZm9yIEFkZHJlc3M6PC9sYWJlbD5cbiAgICAgIDxkaXY+VHlwZSBhbiBhZGRyZXNzIGluIHRoZSBpbnB1dCBib3ggYmVsb3cgYW5kIHNlbGVjdCBhIG1hdGNoIGZyb20gdGhlIGRyb3AgZG93biBsaXN0IG9yIHNlbGVjdCB0aGVcbiAgICAgICAgbWFnbmlmeWluZyBnbGFzcyBidXR0b24gdG8gcGxvdCB0aGUgYWRkcmVzcyBvbiB0aGUgbWFwLjwvZGl2PlxuICAgICAgPGRpdiAjbGF0TG9uZ1NlYXJjaE5vZGU+PC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG48ZGl2ICNtYXBWaWV3Tm9kZT48L2Rpdj4iXX0=
|