@cqa-lib/cqa-ui 1.1.179 → 1.1.181
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/esm2020/lib/custom-textarea/custom-textarea.component.mjs +6 -3
- package/esm2020/lib/custom-toggle/custom-toggle.component.mjs +35 -0
- package/esm2020/lib/execution-screen/ai-action-step/ai-action-step.component.mjs +6 -3
- package/esm2020/lib/execution-screen/ai-agent-step/ai-agent-step.component.mjs +6 -3
- package/esm2020/lib/execution-screen/api-step/api-step.component.mjs +6 -3
- package/esm2020/lib/execution-screen/basic-step/basic-step.component.mjs +6 -3
- package/esm2020/lib/execution-screen/condition-step/condition-step.component.mjs +6 -3
- package/esm2020/lib/execution-screen/db-verification-step/db-verification-step.component.mjs +6 -3
- package/esm2020/lib/execution-screen/document-verification-step/document-verification-step.component.mjs +9 -3
- package/esm2020/lib/execution-screen/file-download-step/file-download-step.component.mjs +6 -3
- package/esm2020/lib/execution-screen/live-execution-step/live-execution-step.component.mjs +6 -3
- package/esm2020/lib/execution-screen/loop-step/loop-step.component.mjs +6 -3
- package/esm2020/lib/execution-screen/step-group/step-group.component.mjs +6 -3
- package/esm2020/lib/file-upload/file-upload.component.mjs +87 -0
- package/esm2020/lib/item-list/item-list.component.mjs +59 -0
- package/esm2020/lib/item-list/item-list.model.mjs +2 -0
- package/esm2020/lib/step-builder/step-builder-ai-agent/step-builder-ai-agent.component.mjs +136 -0
- package/esm2020/lib/step-builder/step-builder-custom-code/step-builder-custom-code.component.mjs +65 -0
- package/esm2020/lib/step-builder/step-builder-database/step-builder-database.component.mjs +1 -1
- package/esm2020/lib/step-builder/step-builder-document/step-builder-document.component.mjs +241 -0
- package/esm2020/lib/step-builder/step-builder-document-generation-template-step/step-builder-document-generation-template-step.component.mjs +176 -0
- package/esm2020/lib/step-builder/step-builder-record-step/step-builder-record-step.component.mjs +31 -0
- package/esm2020/lib/test-case-details/custom-edit-step/custom-edit-step.component.mjs +3 -3
- package/esm2020/lib/test-case-details/element-list/element-list.component.mjs +50 -0
- package/esm2020/lib/test-case-details/element-popup/element-popup-data.mjs +5 -0
- package/esm2020/lib/test-case-details/element-popup/element-popup-ref.mjs +32 -0
- package/esm2020/lib/test-case-details/element-popup/element-popup.component.mjs +272 -0
- package/esm2020/lib/test-case-details/element-popup/element-popup.service.mjs +97 -0
- package/esm2020/lib/test-case-details/normal-step/normal-step.component.mjs +151 -19
- package/esm2020/lib/test-case-details/test-data-modal/test-data-modal-data.mjs +5 -0
- package/esm2020/lib/test-case-details/test-data-modal/test-data-modal-environment.model.mjs +10 -0
- package/esm2020/lib/test-case-details/test-data-modal/test-data-modal-parameter.model.mjs +8 -0
- package/esm2020/lib/test-case-details/test-data-modal/test-data-modal-ref.mjs +32 -0
- package/esm2020/lib/test-case-details/test-data-modal/test-data-modal.component.mjs +301 -0
- package/esm2020/lib/test-case-details/test-data-modal/test-data-modal.service.mjs +97 -0
- package/esm2020/lib/ui-kit.module.mjs +58 -3
- package/esm2020/lib/utils/tw-overlay-container.mjs +7 -3
- package/esm2020/public-api.mjs +19 -1
- package/fesm2015/cqa-lib-cqa-ui.mjs +2971 -1106
- package/fesm2015/cqa-lib-cqa-ui.mjs.map +1 -1
- package/fesm2020/cqa-lib-cqa-ui.mjs +2966 -1121
- package/fesm2020/cqa-lib-cqa-ui.mjs.map +1 -1
- package/lib/custom-textarea/custom-textarea.component.d.ts +2 -1
- package/lib/custom-toggle/custom-toggle.component.d.ts +12 -0
- package/lib/execution-screen/ai-action-step/ai-action-step.component.d.ts +2 -1
- package/lib/execution-screen/ai-agent-step/ai-agent-step.component.d.ts +2 -1
- package/lib/execution-screen/api-step/api-step.component.d.ts +2 -1
- package/lib/execution-screen/basic-step/basic-step.component.d.ts +2 -1
- package/lib/execution-screen/condition-step/condition-step.component.d.ts +2 -1
- package/lib/execution-screen/db-verification-step/db-verification-step.component.d.ts +2 -1
- package/lib/execution-screen/document-verification-step/document-verification-step.component.d.ts +2 -1
- package/lib/execution-screen/file-download-step/file-download-step.component.d.ts +2 -1
- package/lib/execution-screen/live-execution-step/live-execution-step.component.d.ts +2 -1
- package/lib/execution-screen/loop-step/loop-step.component.d.ts +2 -1
- package/lib/execution-screen/step-group/step-group.component.d.ts +2 -1
- package/lib/file-upload/file-upload.component.d.ts +26 -0
- package/lib/item-list/item-list.component.d.ts +25 -0
- package/lib/item-list/item-list.model.d.ts +16 -0
- package/lib/step-builder/step-builder-ai-agent/step-builder-ai-agent.component.d.ts +47 -0
- package/lib/step-builder/step-builder-custom-code/step-builder-custom-code.component.d.ts +27 -0
- package/lib/step-builder/step-builder-document/step-builder-document.component.d.ts +81 -0
- package/lib/step-builder/step-builder-document-generation-template-step/step-builder-document-generation-template-step.component.d.ts +55 -0
- package/lib/step-builder/step-builder-record-step/step-builder-record-step.component.d.ts +16 -0
- package/lib/test-case-details/element-list/element-list.component.d.ts +26 -0
- package/lib/test-case-details/element-popup/element-popup-data.d.ts +16 -0
- package/lib/test-case-details/element-popup/element-popup-ref.d.ts +13 -0
- package/lib/test-case-details/element-popup/element-popup.component.d.ts +60 -0
- package/lib/test-case-details/element-popup/element-popup.service.d.ts +23 -0
- package/lib/test-case-details/normal-step/normal-step.component.d.ts +17 -2
- package/lib/test-case-details/test-data-modal/test-data-modal-data.d.ts +31 -0
- package/lib/test-case-details/test-data-modal/test-data-modal-environment.model.d.ts +12 -0
- package/lib/test-case-details/test-data-modal/test-data-modal-parameter.model.d.ts +11 -0
- package/lib/test-case-details/test-data-modal/test-data-modal-ref.d.ts +13 -0
- package/lib/test-case-details/test-data-modal/test-data-modal.component.d.ts +91 -0
- package/lib/test-case-details/test-data-modal/test-data-modal.service.d.ts +23 -0
- package/lib/ui-kit.module.d.ts +60 -49
- package/package.json +1 -1
- package/public-api.d.ts +18 -0
- package/styles.css +1 -1
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { InjectionToken } from '@angular/core';
|
|
2
|
+
/** Sentinel returned from afterClosed() when user clicked "Edit in depth". */
|
|
3
|
+
export const TEST_DATA_MODAL_EDIT_IN_DEPTH = Symbol('TestDataModalEditInDepth');
|
|
4
|
+
export const TEST_DATA_MODAL_DATA = new InjectionToken('TEST_DATA_MODAL_DATA');
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1kYXRhLW1vZGFsLWRhdGEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL3Rlc3QtZGF0YS1tb2RhbC90ZXN0LWRhdGEtbW9kYWwtZGF0YS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBK0IvQyw4RUFBOEU7QUFDOUUsTUFBTSxDQUFDLE1BQU0sNkJBQTZCLEdBQUcsTUFBTSxDQUFDLDBCQUEwQixDQUFDLENBQUM7QUFFaEYsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxjQUFjLENBQ3BELHNCQUFzQixDQUN2QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB0eXBlIHsgUGFyYW1ldGVyU2NvcGVGaWx0ZXIgfSBmcm9tICcuL3Rlc3QtZGF0YS1tb2RhbC1wYXJhbWV0ZXIubW9kZWwnO1xuXG5leHBvcnQgdHlwZSBUZXN0RGF0YU1vZGFsVGFiID0gJ3BsYWluLXRleHQnIHwgJ3BhcmFtZXRlcicgfCAnZW52aXJvbm1lbnQnIHwgJ3J1bnRpbWUnO1xuXG4vKipcbiAqIENvbmZpZy9kYXRhIGZvciBUZXN0IERhdGEgTW9kYWwgY29udHJvbHMuXG4gKiBNaXJyb3JzIExvb3AgU3RlcCBwYXR0ZXJuOiBzaW5nbGUgY29uZmlnIG9iamVjdCBob2xkcyBhbGwgY29udHJvbCBzdGF0ZTtcbiAqIHZhbHVlcyBhcmUgaW5pdGlhbGl6ZWQgZnJvbSBjb25maWcgYW5kIGJvdW5kIHRvIGVkaXRGb3JtLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRlc3REYXRhTW9kYWxEYXRhIHtcbiAgLyoqIEluaXRpYWwgdmFsdWUgZm9yIFBsYWluIFRleHQgdGFiIChlLmcuIFVSTCBmb3IgbmF2aWdhdGUgc3RlcCkuICovXG4gIHZhbHVlPzogc3RyaW5nO1xuICAvKiogT3B0aW9uYWwgaGVscCBVUkwgZm9yIFwiTmVlZCBoZWxwP1wiIGxpbmsuICovXG4gIGhlbHBVcmw/OiBzdHJpbmc7XG4gIC8qKiBJbml0aWFsbHkgc2VsZWN0ZWQgdGFiLiBEZWZhdWx0cyB0byAncGxhaW4tdGV4dCcuICovXG4gIGFjdGl2ZVRhYj86IFRlc3REYXRhTW9kYWxUYWI7XG4gIC8qKiBQYXJhbWV0ZXIgdGFiOiBzY29wZSBmaWx0ZXIgKEFsbCAvIEdsb2JhbCAvIExvY2FsKS4gKi9cbiAgcGFyYW1ldGVyU2NvcGVGaWx0ZXI/OiBQYXJhbWV0ZXJTY29wZUZpbHRlcjtcbiAgLyoqIFBhcmFtZXRlciB0YWI6IHNlYXJjaCBxdWVyeS4gKi9cbiAgcGFyYW1ldGVyU2VhcmNoUXVlcnk/OiBzdHJpbmc7XG4gIC8qKiBQYXJhbWV0ZXIgdGFiOiBzZWxlY3RlZCBwYXJhbWV0ZXIgaWQgKGZvciBoaWdobGlnaHQpLiAqL1xuICBzZWxlY3RlZFBhcmFtZXRlcklkPzogc3RyaW5nIHwgbnVsbDtcbiAgLyoqIEVudmlyb25tZW50IHRhYjogc2VhcmNoIHF1ZXJ5LiAqL1xuICBlbnZpcm9ubWVudFNlYXJjaFF1ZXJ5Pzogc3RyaW5nO1xuICAvKiogRW52aXJvbm1lbnQgdGFiOiBzZWxlY3RlZCBlbnZpcm9ubWVudCBpZCAoZm9yIGhpZ2hsaWdodCkuICovXG4gIHNlbGVjdGVkRW52aXJvbm1lbnRJZD86IHN0cmluZyB8IG51bGw7XG4gIC8qKiBSdW50aW1lIHRhYjogdmFsdWUgKGluZGVwZW5kZW50IGZyb20gUGxhaW4gVGV4dCAvIFBhcmFtZXRlciAvIEVudmlyb25tZW50KS4gKi9cbiAgcnVudGltZVZhbHVlPzogc3RyaW5nO1xufVxuXG4vKiogU2VudGluZWwgcmV0dXJuZWQgZnJvbSBhZnRlckNsb3NlZCgpIHdoZW4gdXNlciBjbGlja2VkIFwiRWRpdCBpbiBkZXB0aFwiLiAqL1xuZXhwb3J0IGNvbnN0IFRFU1RfREFUQV9NT0RBTF9FRElUX0lOX0RFUFRIID0gU3ltYm9sKCdUZXN0RGF0YU1vZGFsRWRpdEluRGVwdGgnKTtcblxuZXhwb3J0IGNvbnN0IFRFU1RfREFUQV9NT0RBTF9EQVRBID0gbmV3IEluamVjdGlvblRva2VuPFRlc3REYXRhTW9kYWxEYXRhPihcbiAgJ1RFU1RfREFUQV9NT0RBTF9EQVRBJ1xuKTtcbiJdfQ==
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/** Mock data for Environment tab (no API). Replace with API call when integrating. */
|
|
2
|
+
export const MOCK_ENVIRONMENT_ITEMS = [
|
|
3
|
+
{ id: 'e1', name: 'BASE_URL', value: 'https://ohrm.example.com', environment: 'OHRM login', editable: true },
|
|
4
|
+
{ id: 'e2', name: 'USERNAME', value: 'admin', environment: 'OHRM login', editable: true },
|
|
5
|
+
{ id: 'e3', name: 'PASSWORD', value: '••••••••', environment: 'OHRM login', editable: true },
|
|
6
|
+
{ id: 'e4', name: 'API_BASE', value: 'https://api.halight.com/v1', environment: 'Halight Env', editable: true },
|
|
7
|
+
{ id: 'e5', name: 'AUTH_TOKEN', value: 'Bearer eyJ...', environment: 'Halight Env', editable: true },
|
|
8
|
+
{ id: 'e6', name: 'TENANT_ID', value: 'tenant-abc-123', environment: 'Halight Env', editable: false },
|
|
9
|
+
];
|
|
10
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1kYXRhLW1vZGFsLWVudmlyb25tZW50Lm1vZGVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi90ZXN0LWNhc2UtZGV0YWlscy90ZXN0LWRhdGEtbW9kYWwvdGVzdC1kYXRhLW1vZGFsLWVudmlyb25tZW50Lm1vZGVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVdBLHNGQUFzRjtBQUN0RixNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBc0I7SUFDdkQsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLDBCQUEwQixFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTtJQUM1RyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTtJQUN6RixFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTtJQUM1RixFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsNEJBQTRCLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO0lBQy9HLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxlQUFlLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO0lBQ3BHLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUU7Q0FDdEcsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBFbnZpcm9ubWVudCB2YXJpYWJsZSBpdGVtIGZvciB0aGUgRW52aXJvbm1lbnQgdGFiICh2YXJpYWJsZSBsaWJyYXJ5IGJ5IGVudmlyb25tZW50KS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW52aXJvbm1lbnRJdGVtIHtcbiAgaWQ6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICB2YWx1ZTogc3RyaW5nO1xuICAvKiogRGlzcGxheSBuYW1lIG9mIHRoZSBlbnZpcm9ubWVudCBncm91cCAoZS5nLiBcIk9IUk0gbG9naW5cIiwgXCJIYWxpZ2h0IEVudlwiKS4gKi9cbiAgZW52aXJvbm1lbnQ6IHN0cmluZztcbiAgLyoqIFdoZW4gdHJ1ZSwgc2hvdyBlZGl0IGljb24gd2hlbiBzZWxlY3RlZC4gKi9cbiAgZWRpdGFibGU/OiBib29sZWFuO1xufVxuXG4vKiogTW9jayBkYXRhIGZvciBFbnZpcm9ubWVudCB0YWIgKG5vIEFQSSkuIFJlcGxhY2Ugd2l0aCBBUEkgY2FsbCB3aGVuIGludGVncmF0aW5nLiAqL1xuZXhwb3J0IGNvbnN0IE1PQ0tfRU5WSVJPTk1FTlRfSVRFTVM6IEVudmlyb25tZW50SXRlbVtdID0gW1xuICB7IGlkOiAnZTEnLCBuYW1lOiAnQkFTRV9VUkwnLCB2YWx1ZTogJ2h0dHBzOi8vb2hybS5leGFtcGxlLmNvbScsIGVudmlyb25tZW50OiAnT0hSTSBsb2dpbicsIGVkaXRhYmxlOiB0cnVlIH0sXG4gIHsgaWQ6ICdlMicsIG5hbWU6ICdVU0VSTkFNRScsIHZhbHVlOiAnYWRtaW4nLCBlbnZpcm9ubWVudDogJ09IUk0gbG9naW4nLCBlZGl0YWJsZTogdHJ1ZSB9LFxuICB7IGlkOiAnZTMnLCBuYW1lOiAnUEFTU1dPUkQnLCB2YWx1ZTogJ+KAouKAouKAouKAouKAouKAouKAouKAoicsIGVudmlyb25tZW50OiAnT0hSTSBsb2dpbicsIGVkaXRhYmxlOiB0cnVlIH0sXG4gIHsgaWQ6ICdlNCcsIG5hbWU6ICdBUElfQkFTRScsIHZhbHVlOiAnaHR0cHM6Ly9hcGkuaGFsaWdodC5jb20vdjEnLCBlbnZpcm9ubWVudDogJ0hhbGlnaHQgRW52JywgZWRpdGFibGU6IHRydWUgfSxcbiAgeyBpZDogJ2U1JywgbmFtZTogJ0FVVEhfVE9LRU4nLCB2YWx1ZTogJ0JlYXJlciBleUouLi4nLCBlbnZpcm9ubWVudDogJ0hhbGlnaHQgRW52JywgZWRpdGFibGU6IHRydWUgfSxcbiAgeyBpZDogJ2U2JywgbmFtZTogJ1RFTkFOVF9JRCcsIHZhbHVlOiAndGVuYW50LWFiYy0xMjMnLCBlbnZpcm9ubWVudDogJ0hhbGlnaHQgRW52JywgZWRpdGFibGU6IGZhbHNlIH0sXG5dO1xuIl19
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/** Mock data for Variable Library (no API). Replace with API call when integrating. */
|
|
2
|
+
export const MOCK_PARAMETERS = [
|
|
3
|
+
{ id: '1', name: 'user_email', value: 'test@example.com', scope: 'Local' },
|
|
4
|
+
{ id: '2', name: 'API_BASE_URL', value: 'https://api.example.com', scope: 'Global' },
|
|
5
|
+
{ id: '3', name: 'auth_token', value: 'eyJhbGciOiJIUzI1...', scope: 'Global' },
|
|
6
|
+
{ id: '4', name: 'session_id', value: 'abc123xvz456...', scope: 'Local' },
|
|
7
|
+
];
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1kYXRhLW1vZGFsLXBhcmFtZXRlci5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvdGVzdC1jYXNlLWRldGFpbHMvdGVzdC1kYXRhLW1vZGFsL3Rlc3QtZGF0YS1tb2RhbC1wYXJhbWV0ZXIubW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBVUEsdUZBQXVGO0FBQ3ZGLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBb0I7SUFDOUMsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLGtCQUFrQixFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUU7SUFDMUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLHlCQUF5QixFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUU7SUFDcEYsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLHFCQUFxQixFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUU7SUFDOUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLGlCQUFpQixFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUU7Q0FDMUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBTY29wZSBvZiBhIHZhcmlhYmxlL3BhcmFtZXRlciBpbiB0aGUgbGlicmFyeS4gKi9cbmV4cG9ydCB0eXBlIFBhcmFtZXRlclNjb3BlID0gJ0dsb2JhbCcgfCAnTG9jYWwnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBhcmFtZXRlckl0ZW0ge1xuICBpZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIHZhbHVlOiBzdHJpbmc7XG4gIHNjb3BlOiBQYXJhbWV0ZXJTY29wZTtcbn1cblxuLyoqIE1vY2sgZGF0YSBmb3IgVmFyaWFibGUgTGlicmFyeSAobm8gQVBJKS4gUmVwbGFjZSB3aXRoIEFQSSBjYWxsIHdoZW4gaW50ZWdyYXRpbmcuICovXG5leHBvcnQgY29uc3QgTU9DS19QQVJBTUVURVJTOiBQYXJhbWV0ZXJJdGVtW10gPSBbXG4gIHsgaWQ6ICcxJywgbmFtZTogJ3VzZXJfZW1haWwnLCB2YWx1ZTogJ3Rlc3RAZXhhbXBsZS5jb20nLCBzY29wZTogJ0xvY2FsJyB9LFxuICB7IGlkOiAnMicsIG5hbWU6ICdBUElfQkFTRV9VUkwnLCB2YWx1ZTogJ2h0dHBzOi8vYXBpLmV4YW1wbGUuY29tJywgc2NvcGU6ICdHbG9iYWwnIH0sXG4gIHsgaWQ6ICczJywgbmFtZTogJ2F1dGhfdG9rZW4nLCB2YWx1ZTogJ2V5SmhiR2NpT2lKSVV6STEuLi4nLCBzY29wZTogJ0dsb2JhbCcgfSxcbiAgeyBpZDogJzQnLCBuYW1lOiAnc2Vzc2lvbl9pZCcsIHZhbHVlOiAnYWJjMTIzeHZ6NDU2Li4uJywgc2NvcGU6ICdMb2NhbCcgfSxcbl07XG5cbmV4cG9ydCB0eXBlIFBhcmFtZXRlclNjb3BlRmlsdGVyID0gJ2FsbCcgfCAnZ2xvYmFsJyB8ICdsb2NhbCc7XG4iXX0=
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { InjectionToken } from '@angular/core';
|
|
2
|
+
import { Subject } from 'rxjs';
|
|
3
|
+
export class TestDataModalRef {
|
|
4
|
+
constructor(overlayRef) {
|
|
5
|
+
this.overlayRef = overlayRef;
|
|
6
|
+
this.closed$ = new Subject();
|
|
7
|
+
this.isClosed = false;
|
|
8
|
+
this.overlayRef.detachments().subscribe(() => {
|
|
9
|
+
this.finishClose(undefined);
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
close(result) {
|
|
13
|
+
if (this.isClosed) {
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
this.finishClose(result);
|
|
17
|
+
this.overlayRef.dispose();
|
|
18
|
+
}
|
|
19
|
+
afterClosed() {
|
|
20
|
+
return this.closed$.asObservable();
|
|
21
|
+
}
|
|
22
|
+
finishClose(result) {
|
|
23
|
+
if (this.isClosed) {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
this.isClosed = true;
|
|
27
|
+
this.closed$.next(result);
|
|
28
|
+
this.closed$.complete();
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
export const TEST_DATA_MODAL_REF = new InjectionToken('TEST_DATA_MODAL_REF');
|
|
32
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1kYXRhLW1vZGFsLXJlZi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvdGVzdC1jYXNlLWRldGFpbHMvdGVzdC1kYXRhLW1vZGFsL3Rlc3QtZGF0YS1tb2RhbC1yZWYudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUvQyxPQUFPLEVBQWMsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRTNDLE1BQU0sT0FBTyxnQkFBZ0I7SUFJM0IsWUFBNkIsVUFBc0I7UUFBdEIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUhsQyxZQUFPLEdBQUcsSUFBSSxPQUFPLEVBQXVCLENBQUM7UUFDdEQsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUd2QixJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDM0MsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM5QixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxLQUFLLENBQUMsTUFBZ0I7UUFDcEIsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2pCLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDekIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRUQsV0FBVztRQUNULE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUNyQyxDQUFDO0lBRU8sV0FBVyxDQUFDLE1BQTJCO1FBQzdDLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNqQixPQUFPO1NBQ1I7UUFDRCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztRQUNyQixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzFCLENBQUM7Q0FDRjtBQUVELE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLElBQUksY0FBYyxDQUNuRCxxQkFBcUIsQ0FDdEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGlvblRva2VuIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPdmVybGF5UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuXG5leHBvcnQgY2xhc3MgVGVzdERhdGFNb2RhbFJlZjxUUmVzdWx0ID0gc3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2xvc2VkJCA9IG5ldyBTdWJqZWN0PFRSZXN1bHQgfCB1bmRlZmluZWQ+KCk7XG4gIHByaXZhdGUgaXNDbG9zZWQgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IG92ZXJsYXlSZWY6IE92ZXJsYXlSZWYpIHtcbiAgICB0aGlzLm92ZXJsYXlSZWYuZGV0YWNobWVudHMoKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5maW5pc2hDbG9zZSh1bmRlZmluZWQpO1xuICAgIH0pO1xuICB9XG5cbiAgY2xvc2UocmVzdWx0PzogVFJlc3VsdCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzQ2xvc2VkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZmluaXNoQ2xvc2UocmVzdWx0KTtcbiAgICB0aGlzLm92ZXJsYXlSZWYuZGlzcG9zZSgpO1xuICB9XG5cbiAgYWZ0ZXJDbG9zZWQoKTogT2JzZXJ2YWJsZTxUUmVzdWx0IHwgdW5kZWZpbmVkPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xvc2VkJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgZmluaXNoQ2xvc2UocmVzdWx0OiBUUmVzdWx0IHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNDbG9zZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5pc0Nsb3NlZCA9IHRydWU7XG4gICAgdGhpcy5jbG9zZWQkLm5leHQocmVzdWx0KTtcbiAgICB0aGlzLmNsb3NlZCQuY29tcGxldGUoKTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgVEVTVF9EQVRBX01PREFMX1JFRiA9IG5ldyBJbmplY3Rpb25Ub2tlbjxUZXN0RGF0YU1vZGFsUmVmPihcbiAgJ1RFU1RfREFUQV9NT0RBTF9SRUYnXG4pO1xuIl19
|
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, EventEmitter, Inject, Optional, Output, } from '@angular/core';
|
|
2
|
+
import { TEST_DATA_MODAL_DATA, TEST_DATA_MODAL_EDIT_IN_DEPTH, } from './test-data-modal-data';
|
|
3
|
+
import { TEST_DATA_MODAL_REF } from './test-data-modal-ref';
|
|
4
|
+
import { MOCK_ENVIRONMENT_ITEMS, } from './test-data-modal-environment.model';
|
|
5
|
+
import { MOCK_PARAMETERS, } from './test-data-modal-parameter.model';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
import * as i1 from "@angular/forms";
|
|
8
|
+
import * as i2 from "@angular/material/icon";
|
|
9
|
+
import * as i3 from "../../segment-control/segment-control.component";
|
|
10
|
+
import * as i4 from "../../custom-input/custom-input.component";
|
|
11
|
+
import * as i5 from "../../item-list/item-list.component";
|
|
12
|
+
import * as i6 from "../../button/button.component";
|
|
13
|
+
import * as i7 from "@angular/common";
|
|
14
|
+
import * as i8 from "./test-data-modal-ref";
|
|
15
|
+
const TAB_SEGMENTS = [
|
|
16
|
+
{ label: 'Plain Text', value: 'plain-text' },
|
|
17
|
+
{ label: 'Parameter', value: 'parameter' },
|
|
18
|
+
{ label: 'Environment', value: 'environment' },
|
|
19
|
+
{ label: 'Runtime', value: 'runtime' },
|
|
20
|
+
];
|
|
21
|
+
const PARAMETER_FILTER_TABS = [
|
|
22
|
+
{ label: 'All', value: 'all' },
|
|
23
|
+
{ label: 'Global', value: 'global' },
|
|
24
|
+
{ label: 'Local', value: 'local' },
|
|
25
|
+
];
|
|
26
|
+
/** Mock runtime variable suggestions (replace with API when integrating). */
|
|
27
|
+
const RUNTIME_SUGGESTED_VALUES = [
|
|
28
|
+
'{{runtime.MaxWaitTime}}',
|
|
29
|
+
'{{runtime.session_id}}',
|
|
30
|
+
'{{runtime.auth_token}}',
|
|
31
|
+
'{{runtime.step_index}}',
|
|
32
|
+
'{{runtime.timestamp}}',
|
|
33
|
+
'{{runtime.test_name}}',
|
|
34
|
+
];
|
|
35
|
+
export class TestDataModalComponent {
|
|
36
|
+
constructor(fb, cdr, ref, data) {
|
|
37
|
+
this.fb = fb;
|
|
38
|
+
this.cdr = cdr;
|
|
39
|
+
this.ref = ref;
|
|
40
|
+
this.apply = new EventEmitter();
|
|
41
|
+
this.cancel = new EventEmitter();
|
|
42
|
+
this.editInDepth = new EventEmitter();
|
|
43
|
+
this.tabSegments = TAB_SEGMENTS;
|
|
44
|
+
this.parameterFilterTabs = PARAMETER_FILTER_TABS;
|
|
45
|
+
/** Mock parameter list (replace with API when integrating). */
|
|
46
|
+
this.parameters = MOCK_PARAMETERS;
|
|
47
|
+
/** Mock environment list (replace with API when integrating). */
|
|
48
|
+
this.environmentItems = MOCK_ENVIRONMENT_ITEMS;
|
|
49
|
+
/** Runtime tab: suggested variable chips. */
|
|
50
|
+
this.runtimeSuggestedValues = RUNTIME_SUGGESTED_VALUES;
|
|
51
|
+
/** Local copy of form value for Cancel revert (same pattern as Loop Step editSnapshot). */
|
|
52
|
+
this.editSnapshot = {};
|
|
53
|
+
/** State derived from config/editForm for template and getters (mirrors Loop Step inputs). */
|
|
54
|
+
this.activeTab = 'plain-text';
|
|
55
|
+
this.value = '';
|
|
56
|
+
this.helpUrl = '';
|
|
57
|
+
this.helpTooltipText = 'Not sure what to do? Click to go to our detailed step creation documentation';
|
|
58
|
+
this.showHelpTooltip = false;
|
|
59
|
+
this.parameterScopeFilter = 'all';
|
|
60
|
+
this.parameterSearchQuery = '';
|
|
61
|
+
this.selectedParameterId = null;
|
|
62
|
+
this.environmentSearchQuery = '';
|
|
63
|
+
this.selectedEnvironmentId = null;
|
|
64
|
+
this.runtimeValue = '';
|
|
65
|
+
if (data) {
|
|
66
|
+
this.value = data.value ?? '';
|
|
67
|
+
this.helpUrl = data.helpUrl ?? '';
|
|
68
|
+
this.activeTab = (data.activeTab ?? 'plain-text');
|
|
69
|
+
this.parameterScopeFilter = data.parameterScopeFilter ?? 'all';
|
|
70
|
+
this.parameterSearchQuery = data.parameterSearchQuery ?? '';
|
|
71
|
+
this.selectedParameterId = data.selectedParameterId ?? null;
|
|
72
|
+
this.environmentSearchQuery = data.environmentSearchQuery ?? '';
|
|
73
|
+
this.selectedEnvironmentId = data.selectedEnvironmentId ?? null;
|
|
74
|
+
this.runtimeValue = data.runtimeValue ?? '';
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
ngOnInit() {
|
|
78
|
+
this.buildEditForm();
|
|
79
|
+
this.buildSelectConfigs();
|
|
80
|
+
this.editSnapshot = { ...this.editForm.value };
|
|
81
|
+
this.cdr.markForCheck();
|
|
82
|
+
}
|
|
83
|
+
/** Build form with all control values (same pattern as Loop Step buildEditForm). */
|
|
84
|
+
buildEditForm() {
|
|
85
|
+
this.editForm = this.fb.group({
|
|
86
|
+
value: [this.value ?? ''],
|
|
87
|
+
activeTab: [this.activeTab ?? 'plain-text'],
|
|
88
|
+
parameterScopeFilter: [this.parameterScopeFilter ?? 'all'],
|
|
89
|
+
parameterSearchQuery: [this.parameterSearchQuery ?? ''],
|
|
90
|
+
selectedParameterId: [this.selectedParameterId ?? null],
|
|
91
|
+
environmentSearchQuery: [this.environmentSearchQuery ?? ''],
|
|
92
|
+
selectedEnvironmentId: [this.selectedEnvironmentId ?? null],
|
|
93
|
+
runtimeValue: [this.runtimeValue ?? ''],
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
/** Build select configs once (same pattern as Loop Step buildSelectConfigs). */
|
|
97
|
+
buildSelectConfigs() {
|
|
98
|
+
const tabOptions = TAB_SEGMENTS.map((s) => ({
|
|
99
|
+
id: s.value,
|
|
100
|
+
value: s.value,
|
|
101
|
+
name: s.label,
|
|
102
|
+
label: s.label,
|
|
103
|
+
}));
|
|
104
|
+
const filterOptions = PARAMETER_FILTER_TABS.map((s) => ({
|
|
105
|
+
id: s.value,
|
|
106
|
+
value: s.value,
|
|
107
|
+
name: s.label,
|
|
108
|
+
label: s.label,
|
|
109
|
+
}));
|
|
110
|
+
this.activeTabSelectConfig = {
|
|
111
|
+
key: 'activeTab',
|
|
112
|
+
placeholder: 'Tab',
|
|
113
|
+
searchable: false,
|
|
114
|
+
options: tabOptions,
|
|
115
|
+
};
|
|
116
|
+
this.parameterScopeFilterSelectConfig = {
|
|
117
|
+
key: 'parameterScopeFilter',
|
|
118
|
+
placeholder: 'Scope',
|
|
119
|
+
searchable: false,
|
|
120
|
+
options: filterOptions,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
/** Update form control and sync component state (same pattern as Loop Step onEditFormFieldChange). */
|
|
124
|
+
onEditFormFieldChange(controlName, value) {
|
|
125
|
+
this.editForm.get(controlName)?.setValue(value);
|
|
126
|
+
this.syncStateFromForm();
|
|
127
|
+
this.cdr.markForCheck();
|
|
128
|
+
}
|
|
129
|
+
/** Sync component state from editForm so getters (e.g. filteredParameters) stay correct. */
|
|
130
|
+
syncStateFromForm() {
|
|
131
|
+
const v = this.editForm.value;
|
|
132
|
+
this.value = v.value ?? '';
|
|
133
|
+
this.activeTab = (v.activeTab ?? 'plain-text');
|
|
134
|
+
this.parameterScopeFilter = (v.parameterScopeFilter ?? 'all');
|
|
135
|
+
this.parameterSearchQuery = v.parameterSearchQuery ?? '';
|
|
136
|
+
this.selectedParameterId = v.selectedParameterId ?? null;
|
|
137
|
+
this.environmentSearchQuery = v.environmentSearchQuery ?? '';
|
|
138
|
+
this.selectedEnvironmentId = v.selectedEnvironmentId ?? null;
|
|
139
|
+
this.runtimeValue = v.runtimeValue ?? '';
|
|
140
|
+
}
|
|
141
|
+
/** Filtered parameters by scope and search (Parameter tab). */
|
|
142
|
+
get filteredParameters() {
|
|
143
|
+
let list = this.parameters;
|
|
144
|
+
if (this.parameterScopeFilter === 'global') {
|
|
145
|
+
list = list.filter((p) => p.scope === 'Global');
|
|
146
|
+
}
|
|
147
|
+
else if (this.parameterScopeFilter === 'local') {
|
|
148
|
+
list = list.filter((p) => p.scope === 'Local');
|
|
149
|
+
}
|
|
150
|
+
const q = this.parameterSearchQuery.trim().toLowerCase();
|
|
151
|
+
if (q) {
|
|
152
|
+
list = list.filter((p) => p.name.toLowerCase().includes(q));
|
|
153
|
+
}
|
|
154
|
+
return list;
|
|
155
|
+
}
|
|
156
|
+
/** Filtered environment items by search (Environment tab). */
|
|
157
|
+
get filteredEnvironments() {
|
|
158
|
+
const q = this.environmentSearchQuery.trim().toLowerCase();
|
|
159
|
+
if (!q) {
|
|
160
|
+
return this.environmentItems;
|
|
161
|
+
}
|
|
162
|
+
return this.environmentItems.filter((e) => e.name.toLowerCase().includes(q) || e.value.toLowerCase().includes(q));
|
|
163
|
+
}
|
|
164
|
+
/** Parameter tab: list config for cqa-item-list (search-friendly: bind filtered list). */
|
|
165
|
+
get parameterListConfig() {
|
|
166
|
+
return this.filteredParameters.map((p) => ({
|
|
167
|
+
id: p.id,
|
|
168
|
+
title: p.name,
|
|
169
|
+
subtitle: p.value,
|
|
170
|
+
badge: p.scope,
|
|
171
|
+
showEdit: this.selectedParameterId === p.id,
|
|
172
|
+
}));
|
|
173
|
+
}
|
|
174
|
+
/** Environment tab: list config for cqa-item-list. */
|
|
175
|
+
get environmentListConfig() {
|
|
176
|
+
return this.filteredEnvironments.map((e) => ({
|
|
177
|
+
id: e.id,
|
|
178
|
+
title: e.name,
|
|
179
|
+
subtitle: `Value: ${e.value}`,
|
|
180
|
+
badge: e.environment,
|
|
181
|
+
showEdit: this.selectedEnvironmentId === e.id && (e.editable ?? true),
|
|
182
|
+
}));
|
|
183
|
+
}
|
|
184
|
+
onTabChange(tabValue) {
|
|
185
|
+
this.onEditFormFieldChange('activeTab', tabValue);
|
|
186
|
+
}
|
|
187
|
+
onParameterScopeFilterChange(filter) {
|
|
188
|
+
this.onEditFormFieldChange('parameterScopeFilter', filter);
|
|
189
|
+
}
|
|
190
|
+
onParameterSearchInput(value) {
|
|
191
|
+
this.onEditFormFieldChange('parameterSearchQuery', value);
|
|
192
|
+
}
|
|
193
|
+
onParameterSelect(paramId) {
|
|
194
|
+
const param = this.parameters.find((p) => p.id === paramId);
|
|
195
|
+
if (param) {
|
|
196
|
+
this.selectedParameterId = this.selectedParameterId === param.id ? null : param.id;
|
|
197
|
+
this.onEditFormFieldChange('selectedParameterId', this.selectedParameterId);
|
|
198
|
+
this.onEditFormFieldChange('value', param.name);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
onParameterEdit(_paramId) {
|
|
202
|
+
// Placeholder for future edit action (e.g. open edit drawer).
|
|
203
|
+
}
|
|
204
|
+
onCreateNewVariable(event) {
|
|
205
|
+
event.preventDefault();
|
|
206
|
+
// Placeholder for future "Create New" action (no API yet).
|
|
207
|
+
}
|
|
208
|
+
onEnvironmentSearchInput(value) {
|
|
209
|
+
this.onEditFormFieldChange('environmentSearchQuery', value);
|
|
210
|
+
}
|
|
211
|
+
onEnvironmentSelect(itemId) {
|
|
212
|
+
const item = this.environmentItems.find((e) => e.id === itemId);
|
|
213
|
+
if (item) {
|
|
214
|
+
this.selectedEnvironmentId =
|
|
215
|
+
this.selectedEnvironmentId === item.id ? null : item.id;
|
|
216
|
+
this.onEditFormFieldChange('selectedEnvironmentId', this.selectedEnvironmentId);
|
|
217
|
+
this.onEditFormFieldChange('value', item.name);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
onEnvironmentEdit(_itemId) {
|
|
221
|
+
// Placeholder for future edit action (e.g. open edit drawer).
|
|
222
|
+
}
|
|
223
|
+
onCreateNewEnvironment(event) {
|
|
224
|
+
event.preventDefault();
|
|
225
|
+
// Placeholder for future "Create New" action (no API yet).
|
|
226
|
+
}
|
|
227
|
+
/** Runtime tab: insert suggested value into the runtime input field. */
|
|
228
|
+
onRuntimeChipInsert(snippet) {
|
|
229
|
+
const next = this.editForm.get('runtimeValue')?.value
|
|
230
|
+
? this.editForm.get('runtimeValue')?.value + ' ' + snippet
|
|
231
|
+
: snippet;
|
|
232
|
+
this.onEditFormFieldChange('runtimeValue', next);
|
|
233
|
+
}
|
|
234
|
+
onApply() {
|
|
235
|
+
this.syncStateFromForm();
|
|
236
|
+
let valueToApply = this.activeTab === 'runtime' ? this.runtimeValue : this.value;
|
|
237
|
+
if (this.activeTab === 'parameter') {
|
|
238
|
+
valueToApply = this.selectedParameterId ? this.parameters.find((p) => p.id === this.selectedParameterId)?.name ?? '' : '';
|
|
239
|
+
}
|
|
240
|
+
else if (this.activeTab === 'environment') {
|
|
241
|
+
valueToApply = this.selectedEnvironmentId ? this.environmentItems.find((e) => e.id === this.selectedEnvironmentId)?.name ?? '' : '';
|
|
242
|
+
}
|
|
243
|
+
// Build result with only the active tab's data, clear other tabs' data
|
|
244
|
+
const result = {
|
|
245
|
+
value: valueToApply,
|
|
246
|
+
activeTab: this.activeTab,
|
|
247
|
+
// Only include parameter data if parameter tab is active
|
|
248
|
+
parameterScopeFilter: this.activeTab === 'parameter' ? this.parameterScopeFilter : undefined,
|
|
249
|
+
parameterSearchQuery: this.activeTab === 'parameter' ? this.parameterSearchQuery : undefined,
|
|
250
|
+
selectedParameterId: this.activeTab === 'parameter' ? this.selectedParameterId : undefined,
|
|
251
|
+
// Only include environment data if environment tab is active
|
|
252
|
+
environmentSearchQuery: this.activeTab === 'environment' ? this.environmentSearchQuery : undefined,
|
|
253
|
+
selectedEnvironmentId: this.activeTab === 'environment' ? this.selectedEnvironmentId : undefined,
|
|
254
|
+
// Only include runtime data if runtime tab is active
|
|
255
|
+
runtimeValue: this.activeTab === 'runtime' ? this.runtimeValue : undefined,
|
|
256
|
+
};
|
|
257
|
+
this.apply.emit({ value: valueToApply, activeTab: this.activeTab });
|
|
258
|
+
this.ref.close(result);
|
|
259
|
+
}
|
|
260
|
+
onCancel() {
|
|
261
|
+
this.editForm.patchValue(this.editSnapshot);
|
|
262
|
+
this.syncStateFromForm();
|
|
263
|
+
this.cancel.emit();
|
|
264
|
+
this.ref.close(undefined);
|
|
265
|
+
}
|
|
266
|
+
onClose() {
|
|
267
|
+
this.onCancel();
|
|
268
|
+
}
|
|
269
|
+
onEditInDepth(event) {
|
|
270
|
+
event.preventDefault();
|
|
271
|
+
this.editInDepth.emit();
|
|
272
|
+
this.ref.close(TEST_DATA_MODAL_EDIT_IN_DEPTH);
|
|
273
|
+
}
|
|
274
|
+
onHelp(event) {
|
|
275
|
+
if (this.helpUrl) {
|
|
276
|
+
event.preventDefault();
|
|
277
|
+
window.open(this.helpUrl, '_blank');
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
TestDataModalComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TestDataModalComponent, deps: [{ token: i1.FormBuilder }, { token: i0.ChangeDetectorRef }, { token: TEST_DATA_MODAL_REF }, { token: TEST_DATA_MODAL_DATA, optional: true }], target: i0.ɵɵFactoryTarget.Component });
|
|
282
|
+
TestDataModalComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: TestDataModalComponent, selector: "cqa-test-data-modal", outputs: { apply: "apply", cancel: "cancel", editInDepth: "editInDepth" }, host: { classAttribute: "cqa-ui-root" }, ngImport: i0, template: "<div\n class=\"cqa-bg-white cqa-rounded-[12px] cqa-shadow-lg cqa-border cqa-border-solid cqa-border-[#E5E7EB] cqa-w-[500px] cqa-flex cqa-flex-col cqa-gap-[12px] cqa-p-2 cqa-box-border cqa-min-h-0\">\n <!-- Header: title left; Need help? + close icon right -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-gap-2 cqa-px-4\">\n <h2 class=\"cqa-text-[16px] cqa-leading-[24px] cqa-font-bold cqa-text-[#111827] cqa-m-0 cqa-font-[600]\">\n Test Data\n </h2>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-min-h-[28px]\">\n <!-- Need help? with custom tooltip (works inside overlay) -->\n <div class=\"cqa-relative cqa-inline-flex cqa-items-center\"\n (mouseenter)=\"showHelpTooltip = true\" (mouseleave)=\"showHelpTooltip = false\">\n <a *ngIf=\"helpUrl\" href=\"#\" (click)=\"onHelp($event)\"\n class=\"cqa-flex cqa-items-center cqa-gap-1 cqa-text-[#3F43EE] cqa-text-[12px] cqa-leading-[21px] cqa-no-underline hover:cqa-underline cqa-cursor-pointer\">\n <svg width=\"17\" height=\"16\" viewBox=\"0 0 17 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" class=\"cqa-flex-shrink-0\" aria-hidden=\"true\">\n <g clip-path=\"url(#test-data-help-clip)\">\n <path d=\"M8.50033 14.6663C12.4123 14.6663 15.5837 11.6816 15.5837 7.99967C15.5837 4.31778 12.4123 1.33301 8.50033 1.33301C4.58831 1.33301 1.41699 4.31778 1.41699 7.99967C1.41699 11.6816 4.58831 14.6663 8.50033 14.6663Z\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M6.43848 6.00038C6.60501 5.55483 6.93371 5.17912 7.36636 4.9398C7.79901 4.70049 8.30769 4.61301 8.80231 4.69285C9.29693 4.7727 9.74556 5.01473 10.0687 5.37607C10.3919 5.7374 10.5688 6.19473 10.5681 6.66705C10.5681 8.00038 8.44306 8.66705 8.44306 8.66705\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8.5 11.333H8.50966\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </g>\n <defs>\n <clipPath id=\"test-data-help-clip\">\n <rect width=\"17\" height=\"16\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n Need help ?\n </a>\n <span *ngIf=\"!helpUrl\" class=\"cqa-flex cqa-items-center cqa-gap-1.5 cqa-font-[500] cqa-text-[10px] cqa-cursor-default\">\n <svg width=\"17\" height=\"16\" viewBox=\"0 0 17 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" class=\"cqa-flex-shrink-0 cqa-text-[#3F43EE]\" aria-hidden=\"true\">\n <g clip-path=\"url(#test-data-help-clip-nolink)\">\n <path d=\"M8.50033 14.6663C12.4123 14.6663 15.5837 11.6816 15.5837 7.99967C15.5837 4.31778 12.4123 1.33301 8.50033 1.33301C4.58831 1.33301 1.41699 4.31778 1.41699 7.99967C1.41699 11.6816 4.58831 14.6663 8.50033 14.6663Z\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M6.43848 6.00038C6.60501 5.55483 6.93371 5.17912 7.36636 4.9398C7.79901 4.70049 8.30769 4.61301 8.80231 4.69285C9.29693 4.7727 9.74556 5.01473 10.0687 5.37607C10.3919 5.7374 10.5688 6.19473 10.5681 6.66705C10.5681 8.00038 8.44306 8.66705 8.44306 8.66705\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8.5 11.333H8.50966\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </g>\n <defs>\n <clipPath id=\"test-data-help-clip-nolink\">\n <rect width=\"17\" height=\"16\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n Need help ?\n </span>\n <!-- Custom tooltip (exact spec: 306\u00D720 content, 6px radius, #0A0A0A, no arrow) -->\n <div *ngIf=\"showHelpTooltip\"\n class=\"cqa-absolute cqa-pointer-events-none cqa-z-[100] cqa-top-[-24px] cqa-left-[-125px]\"\n role=\"tooltip\">\n <div\n class=\"cqa-text-white cqa-text-center cqa-whitespace-nowrap cqa-w-[306px] cqa-min-h-[20px] cqa-rounded-[6px] cqa-py-1 cqa-px-2 cqa-bg-[#0A0A0A] cqa-leading-[20px] cqa-text-[8px]\">\n {{ helpTooltipText }}\n </div>\n </div>\n </div>\n <button type=\"button\" (click)=\"onClose()\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-min-h-[28px] cqa-min-w-[28px] cqa-rounded cqa-text-[#6B7280] hover:cqa-bg-[#F3F4F6] cqa-p-0\"\n title=\"Close\" aria-label=\"Close\">\n <mat-icon class=\"!cqa-w-5 !cqa-h-5 !cqa-text-[20px] !cqa-block !cqa-leading-none\">close</mat-icon>\n </button>\n </div>\n </div>\n\n <!-- Line below header (full width of modal, no side margin) -->\n <div class=\"cqa--mx-2 cqa-w-[calc(100%+1rem)] cqa-flex-shrink-0\">\n <div class=\"cqa-h-px cqa-w-full cqa-bg-[#E5E7EB]\" role=\"presentation\"></div>\n </div>\n\n <!-- Tabs: Plain Text, Parameter, Environment, Runtime (bound to editForm like Loop Step) -->\n <div class=\"cqa-w-full cqa-test-data-modal-tabs\">\n <cqa-segment-control\n [segments]=\"tabSegments\"\n [value]=\"editForm.get('activeTab')?.value ?? activeTab\"\n (valueChange)=\"onTabChange($event)\">\n </cqa-segment-control>\n </div>\n\n <!-- Content per tab: flex-1 min-h-0 so Parameter/Environment/Runtime content can scroll -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-h-0\"\n [class.cqa-flex-1]=\"activeTab === 'parameter' || activeTab === 'environment' || activeTab === 'runtime'\">\n <!-- Plain Text tab (form-bound like Loop Step editForm + onEditFormFieldChange) -->\n <ng-container *ngIf=\"activeTab === 'plain-text'\">\n <cqa-custom-input\n label=\"Value\"\n [value]=\"editForm.get('value')?.value ?? ''\"\n (valueChange)=\"onEditFormFieldChange('value', $event)\"\n placeholder=\"https://example.com/dashboard\"\n [fullWidth]=\"true\"\n size=\"md\">\n </cqa-custom-input>\n <p class=\"cqa-text-[12px] cqa-leading-[18px] cqa-text-[#0A0A0A] cqa-m-0\">\n Enter a static text value that won't change during execution.\n </p>\n </ng-container>\n\n <!-- Parameter tab: Variable Library -->\n <ng-container *ngIf=\"activeTab === 'parameter'\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2 cqa-min-h-0 cqa-flex-1 cqa-min-h-[18rem]\">\n <!-- Variable Library header -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-flex-shrink-0\">\n <h3 class=\"cqa-text-[12px] cqa-leading-[20px] cqa-font-semibold cqa-text-[#111827] cqa-m-0\">\n Variable Library\n </h3>\n <a href=\"#\" (click)=\"onCreateNewVariable($event)\"\n class=\"cqa-text-[#3F43EE] cqa-text-[12px] cqa-leading-[18px] cqa-font-medium cqa-no-underline hover:cqa-opacity-90 cqa-cursor-pointer\">\n Create New +\n </a>\n </div>\n <!-- Filter tabs: All, Global, Local (blue underline under active label only) -->\n <div class=\"cqa-flex cqa-w-full cqa-flex-shrink-0\">\n <button *ngFor=\"let tab of parameterFilterTabs\" type=\"button\"\n (click)=\"onParameterScopeFilterChange(tab.value)\"\n class=\"cqa-flex-1 cqa-py-0 cqa-px-3 cqa-text-[12px] cqa-leading-[18px] cqa-font-medium cqa-bg-transparent cqa-cursor-pointer cqa-transition-colors cqa-flex cqa-justify-center cqa-items-center\"\n [class.cqa-text-[#6B7280]]=\"parameterScopeFilter !== tab.value\">\n <span class=\"cqa-test-data-param-filter-label cqa-inline-block cqa-pb-0.5\"\n [class.cqa-test-data-param-filter-active]=\"parameterScopeFilter === tab.value\">\n {{ tab.label }}\n </span>\n </button>\n </div>\n <!-- Search: bound to editForm (same pattern as Loop Step control binding) -->\n <div class=\"cqa-flex-shrink-0 cqa-relative cqa-flex cqa-items-center\">\n <span class=\"cqa-absolute cqa-left-4 cqa-top-0 cqa-bottom-0 cqa-flex cqa-items-center cqa-justify-center cqa-pointer-events-none cqa-text-[#6B7280] cqa-leading-none\" aria-hidden=\"true\">\n <mat-icon class=\"!cqa-w-4 !cqa-h-4 !cqa-text-[16px]\">search</mat-icon>\n </span>\n <input\n type=\"text\"\n [value]=\"editForm.get('parameterSearchQuery')?.value ?? ''\"\n (input)=\"onParameterSearchInput($any($event.target).value)\"\n placeholder=\"Search library\"\n class=\"cqa-test-data-search-input cqa-w-full cqa-pl-10 cqa-pr-4 cqa-py-2.5 cqa-text-sm cqa-leading-5 cqa-text-[#0A0A0A] placeholder:cqa-text-[#9CA3AF] focus:cqa-outline-none focus:cqa-border-[#3B82F6] focus:cqa-ring-1 focus:cqa-ring-[#3B82F6]\"\n aria-label=\"Search library\"\n />\n </div>\n <!-- Parameter list (scrollable, search-integrated via filtered list binding) -->\n <div class=\"cqa-min-h-[200px] cqa-flex-1 cqa-flex cqa-flex-col\">\n <cqa-item-list\n [items]=\"parameterListConfig\"\n [selectedId]=\"selectedParameterId\"\n emptyMessage=\"No parameters match your search.\"\n [scrollable]=\"true\"\n (itemSelect)=\"onParameterSelect($event)\"\n (itemEdit)=\"onParameterEdit($event)\">\n </cqa-item-list>\n </div>\n </div>\n </ng-container>\n\n <!-- Environment tab: Variable library by environment -->\n <ng-container *ngIf=\"activeTab === 'environment'\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2 cqa-min-h-0 cqa-flex-1 cqa-min-h-[18rem]\">\n <!-- Section header -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-flex-shrink-0\">\n <h3 class=\"cqa-text-[12px] cqa-leading-[20px] cqa-font-semibold cqa-text-[#111827] cqa-m-0\">\n Environment\n </h3>\n <a href=\"#\" (click)=\"onCreateNewEnvironment($event)\"\n class=\"cqa-text-[#3F43EE] cqa-text-[12px] cqa-leading-[18px] cqa-font-medium cqa-no-underline hover:cqa-opacity-90 cqa-cursor-pointer\">\n Create New +\n </a>\n </div>\n <!-- Search: bound to editForm (same pattern as Loop Step control binding) -->\n <div class=\"cqa-flex-shrink-0 cqa-relative cqa-flex cqa-items-center\">\n <span class=\"cqa-absolute cqa-left-4 cqa-top-0 cqa-bottom-0 cqa-flex cqa-items-center cqa-justify-center cqa-pointer-events-none cqa-text-[#6B7280] cqa-leading-none\" aria-hidden=\"true\">\n <mat-icon class=\"!cqa-w-4 !cqa-h-4 !cqa-text-[16px]\">search</mat-icon>\n </span>\n <input\n type=\"text\"\n [value]=\"editForm.get('environmentSearchQuery')?.value ?? ''\"\n (input)=\"onEnvironmentSearchInput($any($event.target).value)\"\n placeholder=\"Search Environment\"\n class=\"cqa-test-data-search-input cqa-w-full cqa-pl-10 cqa-pr-4 cqa-py-2.5 cqa-text-sm cqa-leading-5 cqa-text-[#0A0A0A] placeholder:cqa-text-[#9CA3AF] focus:cqa-outline-none focus:cqa-border-[#3B82F6] focus:cqa-ring-1 focus:cqa-ring-[#3B82F6]\"\n aria-label=\"Search Environment\"\n />\n </div>\n <!-- Environment list (scrollable, search-integrated via filtered list binding) -->\n <div class=\"cqa-min-h-[220px] cqa-flex-1 cqa-flex cqa-flex-col\">\n <cqa-item-list\n [items]=\"environmentListConfig\"\n [selectedId]=\"selectedEnvironmentId\"\n emptyMessage=\"No environment variables match your search.\"\n [scrollable]=\"true\"\n (itemSelect)=\"onEnvironmentSelect($event)\"\n (itemEdit)=\"onEnvironmentEdit($event)\">\n </cqa-item-list>\n </div>\n </div>\n </ng-container>\n\n <!-- Runtime tab: dynamic value injector -->\n <ng-container *ngIf=\"activeTab === 'runtime'\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-min-h-0 cqa-h-full cqa-overflow-y-auto\">\n <h3 class=\"cqa-text-[12px] cqa-leading-[20px] cqa-font-semibold cqa-text-[#111827] cqa-m-0 cqa-flex-shrink-0\">\n Runtime\n </h3>\n <div class=\"cqa-flex-shrink-0\">\n <cqa-custom-input\n [value]=\"editForm.get('runtimeValue')?.value ?? ''\"\n (valueChange)=\"onEditFormFieldChange('runtimeValue', $event)\"\n placeholder=\"input text\"\n [fullWidth]=\"true\"\n size=\"md\">\n </cqa-custom-input>\n <p class=\"cqa-text-[12px] cqa-leading-[18px] cqa-text-[#6B7280] cqa-mt-1.5 cqa-mb-0\">\n Values resolved during test execution based on session and step state.\n </p>\n </div>\n <!-- Recommended: suggestion chips -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2 cqa-flex-shrink-0\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-1.5\">\n <mat-icon class=\"!cqa-w-4 !cqa-h-4 !cqa-text-[16px] cqa-text-[#9CA3AF]\" aria-hidden=\"true\">schedule</mat-icon>\n <span class=\"cqa-text-[12px] cqa-leading-[18px] cqa-font-medium cqa-text-[#374151]\">Recommended</span>\n </div>\n <div class=\"cqa-test-data-runtime-chips-scroll cqa-flex cqa-gap-2 cqa-overflow-x-auto cqa-min-w-0 cqa-pb-1\">\n <button\n *ngFor=\"let snippet of runtimeSuggestedValues\"\n type=\"button\"\n (click)=\"onRuntimeChipInsert(snippet)\"\n class=\"cqa-flex-shrink-0 cqa-px-3 cqa-py-1.5 cqa-text-[12px] cqa-leading-[18px] cqa-font-medium cqa-text-[#374151] cqa-bg-[#F3F4F6] cqa-rounded-full hover:cqa-bg-[#E5E7EB] focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#3F43EE] cqa-transition-colors cqa-whitespace-nowrap\">\n {{ snippet }}\n </button>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n\n <!-- Line below content (full width of modal, no side margin) -->\n <div class=\"cqa--mx-2 cqa-w-[calc(100%+1rem)] cqa-flex-shrink-0\">\n <div class=\"cqa-h-px cqa-w-full cqa-bg-[#E5E7EB]\" role=\"presentation\"></div>\n </div>\n\n <!-- Footer: Cancel, Apply (full width in one row) -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-3\">\n <div class=\"cqa-flex cqa-items-stretch cqa-gap-2 cqa-w-full\">\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <cqa-button variant=\"outlined\" btnSize=\"lg\" [text]=\"'Cancel'\" [fullWidth]=\"true\" (clicked)=\"onCancel()\"\n [customClass]=\"'cqa-text-[12px] cqa-py-[9px] cqa-border-[#414146]'\"></cqa-button>\n </div>\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <cqa-button variant=\"filled\" btnSize=\"lg\" [text]=\"'Apply'\" [fullWidth]=\"true\" (clicked)=\"onApply()\"\n [customClass]=\"'cqa-text-[12px] cqa-py-[9px] cqa-border-[#3F43EE]'\"></cqa-button>\n </div>\n </div>\n <a href=\"#\" (click)=\"onEditInDepth($event)\"\n class=\"cqa-text-[#3F43EE] cqa-text-[12px] cqa-leading-[18px] cqa-font-medium cqa-flex cqa-items-center cqa-gap-1.5 cqa-no-underline hover:cqa-no-underline cqa-self-center\">\n <mat-icon class=\"!cqa-w-4 !cqa-h-4 !cqa-text-[16px]\">open_in_new</mat-icon>\n Edit in depth (open detailed right panel)\n </a>\n </div>\n</div>\n", components: [{ type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i3.SegmentControlComponent, selector: "cqa-segment-control", inputs: ["segments", "value", "disabled", "containerBgColor"], outputs: ["valueChange"] }, { type: i4.CustomInputComponent, selector: "cqa-custom-input", inputs: ["label", "type", "placeholder", "value", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "inputInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused", "enterPressed"] }, { type: i5.ItemListComponent, selector: "cqa-item-list", inputs: ["items", "selectedId", "emptyMessage", "scrollable"], outputs: ["itemSelect", "itemEdit"] }, { type: i6.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }], directives: [{ type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
283
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: TestDataModalComponent, decorators: [{
|
|
284
|
+
type: Component,
|
|
285
|
+
args: [{ selector: 'cqa-test-data-modal', host: { class: 'cqa-ui-root' }, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n class=\"cqa-bg-white cqa-rounded-[12px] cqa-shadow-lg cqa-border cqa-border-solid cqa-border-[#E5E7EB] cqa-w-[500px] cqa-flex cqa-flex-col cqa-gap-[12px] cqa-p-2 cqa-box-border cqa-min-h-0\">\n <!-- Header: title left; Need help? + close icon right -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-gap-2 cqa-px-4\">\n <h2 class=\"cqa-text-[16px] cqa-leading-[24px] cqa-font-bold cqa-text-[#111827] cqa-m-0 cqa-font-[600]\">\n Test Data\n </h2>\n <div class=\"cqa-flex cqa-items-center cqa-gap-2 cqa-min-h-[28px]\">\n <!-- Need help? with custom tooltip (works inside overlay) -->\n <div class=\"cqa-relative cqa-inline-flex cqa-items-center\"\n (mouseenter)=\"showHelpTooltip = true\" (mouseleave)=\"showHelpTooltip = false\">\n <a *ngIf=\"helpUrl\" href=\"#\" (click)=\"onHelp($event)\"\n class=\"cqa-flex cqa-items-center cqa-gap-1 cqa-text-[#3F43EE] cqa-text-[12px] cqa-leading-[21px] cqa-no-underline hover:cqa-underline cqa-cursor-pointer\">\n <svg width=\"17\" height=\"16\" viewBox=\"0 0 17 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" class=\"cqa-flex-shrink-0\" aria-hidden=\"true\">\n <g clip-path=\"url(#test-data-help-clip)\">\n <path d=\"M8.50033 14.6663C12.4123 14.6663 15.5837 11.6816 15.5837 7.99967C15.5837 4.31778 12.4123 1.33301 8.50033 1.33301C4.58831 1.33301 1.41699 4.31778 1.41699 7.99967C1.41699 11.6816 4.58831 14.6663 8.50033 14.6663Z\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M6.43848 6.00038C6.60501 5.55483 6.93371 5.17912 7.36636 4.9398C7.79901 4.70049 8.30769 4.61301 8.80231 4.69285C9.29693 4.7727 9.74556 5.01473 10.0687 5.37607C10.3919 5.7374 10.5688 6.19473 10.5681 6.66705C10.5681 8.00038 8.44306 8.66705 8.44306 8.66705\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8.5 11.333H8.50966\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </g>\n <defs>\n <clipPath id=\"test-data-help-clip\">\n <rect width=\"17\" height=\"16\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n Need help ?\n </a>\n <span *ngIf=\"!helpUrl\" class=\"cqa-flex cqa-items-center cqa-gap-1.5 cqa-font-[500] cqa-text-[10px] cqa-cursor-default\">\n <svg width=\"17\" height=\"16\" viewBox=\"0 0 17 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" class=\"cqa-flex-shrink-0 cqa-text-[#3F43EE]\" aria-hidden=\"true\">\n <g clip-path=\"url(#test-data-help-clip-nolink)\">\n <path d=\"M8.50033 14.6663C12.4123 14.6663 15.5837 11.6816 15.5837 7.99967C15.5837 4.31778 12.4123 1.33301 8.50033 1.33301C4.58831 1.33301 1.41699 4.31778 1.41699 7.99967C1.41699 11.6816 4.58831 14.6663 8.50033 14.6663Z\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M6.43848 6.00038C6.60501 5.55483 6.93371 5.17912 7.36636 4.9398C7.79901 4.70049 8.30769 4.61301 8.80231 4.69285C9.29693 4.7727 9.74556 5.01473 10.0687 5.37607C10.3919 5.7374 10.5688 6.19473 10.5681 6.66705C10.5681 8.00038 8.44306 8.66705 8.44306 8.66705\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <path d=\"M8.5 11.333H8.50966\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n </g>\n <defs>\n <clipPath id=\"test-data-help-clip-nolink\">\n <rect width=\"17\" height=\"16\" fill=\"white\"/>\n </clipPath>\n </defs>\n </svg>\n Need help ?\n </span>\n <!-- Custom tooltip (exact spec: 306\u00D720 content, 6px radius, #0A0A0A, no arrow) -->\n <div *ngIf=\"showHelpTooltip\"\n class=\"cqa-absolute cqa-pointer-events-none cqa-z-[100] cqa-top-[-24px] cqa-left-[-125px]\"\n role=\"tooltip\">\n <div\n class=\"cqa-text-white cqa-text-center cqa-whitespace-nowrap cqa-w-[306px] cqa-min-h-[20px] cqa-rounded-[6px] cqa-py-1 cqa-px-2 cqa-bg-[#0A0A0A] cqa-leading-[20px] cqa-text-[8px]\">\n {{ helpTooltipText }}\n </div>\n </div>\n </div>\n <button type=\"button\" (click)=\"onClose()\"\n class=\"cqa-flex cqa-items-center cqa-justify-center cqa-min-h-[28px] cqa-min-w-[28px] cqa-rounded cqa-text-[#6B7280] hover:cqa-bg-[#F3F4F6] cqa-p-0\"\n title=\"Close\" aria-label=\"Close\">\n <mat-icon class=\"!cqa-w-5 !cqa-h-5 !cqa-text-[20px] !cqa-block !cqa-leading-none\">close</mat-icon>\n </button>\n </div>\n </div>\n\n <!-- Line below header (full width of modal, no side margin) -->\n <div class=\"cqa--mx-2 cqa-w-[calc(100%+1rem)] cqa-flex-shrink-0\">\n <div class=\"cqa-h-px cqa-w-full cqa-bg-[#E5E7EB]\" role=\"presentation\"></div>\n </div>\n\n <!-- Tabs: Plain Text, Parameter, Environment, Runtime (bound to editForm like Loop Step) -->\n <div class=\"cqa-w-full cqa-test-data-modal-tabs\">\n <cqa-segment-control\n [segments]=\"tabSegments\"\n [value]=\"editForm.get('activeTab')?.value ?? activeTab\"\n (valueChange)=\"onTabChange($event)\">\n </cqa-segment-control>\n </div>\n\n <!-- Content per tab: flex-1 min-h-0 so Parameter/Environment/Runtime content can scroll -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-1.5 cqa-min-h-0\"\n [class.cqa-flex-1]=\"activeTab === 'parameter' || activeTab === 'environment' || activeTab === 'runtime'\">\n <!-- Plain Text tab (form-bound like Loop Step editForm + onEditFormFieldChange) -->\n <ng-container *ngIf=\"activeTab === 'plain-text'\">\n <cqa-custom-input\n label=\"Value\"\n [value]=\"editForm.get('value')?.value ?? ''\"\n (valueChange)=\"onEditFormFieldChange('value', $event)\"\n placeholder=\"https://example.com/dashboard\"\n [fullWidth]=\"true\"\n size=\"md\">\n </cqa-custom-input>\n <p class=\"cqa-text-[12px] cqa-leading-[18px] cqa-text-[#0A0A0A] cqa-m-0\">\n Enter a static text value that won't change during execution.\n </p>\n </ng-container>\n\n <!-- Parameter tab: Variable Library -->\n <ng-container *ngIf=\"activeTab === 'parameter'\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2 cqa-min-h-0 cqa-flex-1 cqa-min-h-[18rem]\">\n <!-- Variable Library header -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-flex-shrink-0\">\n <h3 class=\"cqa-text-[12px] cqa-leading-[20px] cqa-font-semibold cqa-text-[#111827] cqa-m-0\">\n Variable Library\n </h3>\n <a href=\"#\" (click)=\"onCreateNewVariable($event)\"\n class=\"cqa-text-[#3F43EE] cqa-text-[12px] cqa-leading-[18px] cqa-font-medium cqa-no-underline hover:cqa-opacity-90 cqa-cursor-pointer\">\n Create New +\n </a>\n </div>\n <!-- Filter tabs: All, Global, Local (blue underline under active label only) -->\n <div class=\"cqa-flex cqa-w-full cqa-flex-shrink-0\">\n <button *ngFor=\"let tab of parameterFilterTabs\" type=\"button\"\n (click)=\"onParameterScopeFilterChange(tab.value)\"\n class=\"cqa-flex-1 cqa-py-0 cqa-px-3 cqa-text-[12px] cqa-leading-[18px] cqa-font-medium cqa-bg-transparent cqa-cursor-pointer cqa-transition-colors cqa-flex cqa-justify-center cqa-items-center\"\n [class.cqa-text-[#6B7280]]=\"parameterScopeFilter !== tab.value\">\n <span class=\"cqa-test-data-param-filter-label cqa-inline-block cqa-pb-0.5\"\n [class.cqa-test-data-param-filter-active]=\"parameterScopeFilter === tab.value\">\n {{ tab.label }}\n </span>\n </button>\n </div>\n <!-- Search: bound to editForm (same pattern as Loop Step control binding) -->\n <div class=\"cqa-flex-shrink-0 cqa-relative cqa-flex cqa-items-center\">\n <span class=\"cqa-absolute cqa-left-4 cqa-top-0 cqa-bottom-0 cqa-flex cqa-items-center cqa-justify-center cqa-pointer-events-none cqa-text-[#6B7280] cqa-leading-none\" aria-hidden=\"true\">\n <mat-icon class=\"!cqa-w-4 !cqa-h-4 !cqa-text-[16px]\">search</mat-icon>\n </span>\n <input\n type=\"text\"\n [value]=\"editForm.get('parameterSearchQuery')?.value ?? ''\"\n (input)=\"onParameterSearchInput($any($event.target).value)\"\n placeholder=\"Search library\"\n class=\"cqa-test-data-search-input cqa-w-full cqa-pl-10 cqa-pr-4 cqa-py-2.5 cqa-text-sm cqa-leading-5 cqa-text-[#0A0A0A] placeholder:cqa-text-[#9CA3AF] focus:cqa-outline-none focus:cqa-border-[#3B82F6] focus:cqa-ring-1 focus:cqa-ring-[#3B82F6]\"\n aria-label=\"Search library\"\n />\n </div>\n <!-- Parameter list (scrollable, search-integrated via filtered list binding) -->\n <div class=\"cqa-min-h-[200px] cqa-flex-1 cqa-flex cqa-flex-col\">\n <cqa-item-list\n [items]=\"parameterListConfig\"\n [selectedId]=\"selectedParameterId\"\n emptyMessage=\"No parameters match your search.\"\n [scrollable]=\"true\"\n (itemSelect)=\"onParameterSelect($event)\"\n (itemEdit)=\"onParameterEdit($event)\">\n </cqa-item-list>\n </div>\n </div>\n </ng-container>\n\n <!-- Environment tab: Variable library by environment -->\n <ng-container *ngIf=\"activeTab === 'environment'\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2 cqa-min-h-0 cqa-flex-1 cqa-min-h-[18rem]\">\n <!-- Section header -->\n <div class=\"cqa-flex cqa-items-center cqa-justify-between cqa-flex-shrink-0\">\n <h3 class=\"cqa-text-[12px] cqa-leading-[20px] cqa-font-semibold cqa-text-[#111827] cqa-m-0\">\n Environment\n </h3>\n <a href=\"#\" (click)=\"onCreateNewEnvironment($event)\"\n class=\"cqa-text-[#3F43EE] cqa-text-[12px] cqa-leading-[18px] cqa-font-medium cqa-no-underline hover:cqa-opacity-90 cqa-cursor-pointer\">\n Create New +\n </a>\n </div>\n <!-- Search: bound to editForm (same pattern as Loop Step control binding) -->\n <div class=\"cqa-flex-shrink-0 cqa-relative cqa-flex cqa-items-center\">\n <span class=\"cqa-absolute cqa-left-4 cqa-top-0 cqa-bottom-0 cqa-flex cqa-items-center cqa-justify-center cqa-pointer-events-none cqa-text-[#6B7280] cqa-leading-none\" aria-hidden=\"true\">\n <mat-icon class=\"!cqa-w-4 !cqa-h-4 !cqa-text-[16px]\">search</mat-icon>\n </span>\n <input\n type=\"text\"\n [value]=\"editForm.get('environmentSearchQuery')?.value ?? ''\"\n (input)=\"onEnvironmentSearchInput($any($event.target).value)\"\n placeholder=\"Search Environment\"\n class=\"cqa-test-data-search-input cqa-w-full cqa-pl-10 cqa-pr-4 cqa-py-2.5 cqa-text-sm cqa-leading-5 cqa-text-[#0A0A0A] placeholder:cqa-text-[#9CA3AF] focus:cqa-outline-none focus:cqa-border-[#3B82F6] focus:cqa-ring-1 focus:cqa-ring-[#3B82F6]\"\n aria-label=\"Search Environment\"\n />\n </div>\n <!-- Environment list (scrollable, search-integrated via filtered list binding) -->\n <div class=\"cqa-min-h-[220px] cqa-flex-1 cqa-flex cqa-flex-col\">\n <cqa-item-list\n [items]=\"environmentListConfig\"\n [selectedId]=\"selectedEnvironmentId\"\n emptyMessage=\"No environment variables match your search.\"\n [scrollable]=\"true\"\n (itemSelect)=\"onEnvironmentSelect($event)\"\n (itemEdit)=\"onEnvironmentEdit($event)\">\n </cqa-item-list>\n </div>\n </div>\n </ng-container>\n\n <!-- Runtime tab: dynamic value injector -->\n <ng-container *ngIf=\"activeTab === 'runtime'\">\n <div class=\"cqa-flex cqa-flex-col cqa-gap-3 cqa-min-h-0 cqa-h-full cqa-overflow-y-auto\">\n <h3 class=\"cqa-text-[12px] cqa-leading-[20px] cqa-font-semibold cqa-text-[#111827] cqa-m-0 cqa-flex-shrink-0\">\n Runtime\n </h3>\n <div class=\"cqa-flex-shrink-0\">\n <cqa-custom-input\n [value]=\"editForm.get('runtimeValue')?.value ?? ''\"\n (valueChange)=\"onEditFormFieldChange('runtimeValue', $event)\"\n placeholder=\"input text\"\n [fullWidth]=\"true\"\n size=\"md\">\n </cqa-custom-input>\n <p class=\"cqa-text-[12px] cqa-leading-[18px] cqa-text-[#6B7280] cqa-mt-1.5 cqa-mb-0\">\n Values resolved during test execution based on session and step state.\n </p>\n </div>\n <!-- Recommended: suggestion chips -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-2 cqa-flex-shrink-0\">\n <div class=\"cqa-flex cqa-items-center cqa-gap-1.5\">\n <mat-icon class=\"!cqa-w-4 !cqa-h-4 !cqa-text-[16px] cqa-text-[#9CA3AF]\" aria-hidden=\"true\">schedule</mat-icon>\n <span class=\"cqa-text-[12px] cqa-leading-[18px] cqa-font-medium cqa-text-[#374151]\">Recommended</span>\n </div>\n <div class=\"cqa-test-data-runtime-chips-scroll cqa-flex cqa-gap-2 cqa-overflow-x-auto cqa-min-w-0 cqa-pb-1\">\n <button\n *ngFor=\"let snippet of runtimeSuggestedValues\"\n type=\"button\"\n (click)=\"onRuntimeChipInsert(snippet)\"\n class=\"cqa-flex-shrink-0 cqa-px-3 cqa-py-1.5 cqa-text-[12px] cqa-leading-[18px] cqa-font-medium cqa-text-[#374151] cqa-bg-[#F3F4F6] cqa-rounded-full hover:cqa-bg-[#E5E7EB] focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#3F43EE] cqa-transition-colors cqa-whitespace-nowrap\">\n {{ snippet }}\n </button>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n\n <!-- Line below content (full width of modal, no side margin) -->\n <div class=\"cqa--mx-2 cqa-w-[calc(100%+1rem)] cqa-flex-shrink-0\">\n <div class=\"cqa-h-px cqa-w-full cqa-bg-[#E5E7EB]\" role=\"presentation\"></div>\n </div>\n\n <!-- Footer: Cancel, Apply (full width in one row) -->\n <div class=\"cqa-flex cqa-flex-col cqa-gap-3\">\n <div class=\"cqa-flex cqa-items-stretch cqa-gap-2 cqa-w-full\">\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <cqa-button variant=\"outlined\" btnSize=\"lg\" [text]=\"'Cancel'\" [fullWidth]=\"true\" (clicked)=\"onCancel()\"\n [customClass]=\"'cqa-text-[12px] cqa-py-[9px] cqa-border-[#414146]'\"></cqa-button>\n </div>\n <div class=\"cqa-flex-1 cqa-min-w-0\">\n <cqa-button variant=\"filled\" btnSize=\"lg\" [text]=\"'Apply'\" [fullWidth]=\"true\" (clicked)=\"onApply()\"\n [customClass]=\"'cqa-text-[12px] cqa-py-[9px] cqa-border-[#3F43EE]'\"></cqa-button>\n </div>\n </div>\n <a href=\"#\" (click)=\"onEditInDepth($event)\"\n class=\"cqa-text-[#3F43EE] cqa-text-[12px] cqa-leading-[18px] cqa-font-medium cqa-flex cqa-items-center cqa-gap-1.5 cqa-no-underline hover:cqa-no-underline cqa-self-center\">\n <mat-icon class=\"!cqa-w-4 !cqa-h-4 !cqa-text-[16px]\">open_in_new</mat-icon>\n Edit in depth (open detailed right panel)\n </a>\n </div>\n</div>\n" }]
|
|
286
|
+
}], ctorParameters: function () { return [{ type: i1.FormBuilder }, { type: i0.ChangeDetectorRef }, { type: i8.TestDataModalRef, decorators: [{
|
|
287
|
+
type: Inject,
|
|
288
|
+
args: [TEST_DATA_MODAL_REF]
|
|
289
|
+
}] }, { type: undefined, decorators: [{
|
|
290
|
+
type: Optional
|
|
291
|
+
}, {
|
|
292
|
+
type: Inject,
|
|
293
|
+
args: [TEST_DATA_MODAL_DATA]
|
|
294
|
+
}] }]; }, propDecorators: { apply: [{
|
|
295
|
+
type: Output
|
|
296
|
+
}], cancel: [{
|
|
297
|
+
type: Output
|
|
298
|
+
}], editInDepth: [{
|
|
299
|
+
type: Output
|
|
300
|
+
}] } });
|
|
301
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC1kYXRhLW1vZGFsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvdGVzdC1jYXNlLWRldGFpbHMvdGVzdC1kYXRhLW1vZGFsL3Rlc3QtZGF0YS1tb2RhbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3Rlc3QtY2FzZS1kZXRhaWxzL3Rlc3QtZGF0YS1tb2RhbC90ZXN0LWRhdGEtbW9kYWwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUV2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLE1BQU0sRUFFTixRQUFRLEVBQ1IsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBR3ZCLE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsNkJBQTZCLEdBRzlCLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUFFLG1CQUFtQixFQUFvQixNQUFNLHVCQUF1QixDQUFDO0FBRTlFLE9BQU8sRUFDTCxzQkFBc0IsR0FFdkIsTUFBTSxxQ0FBcUMsQ0FBQztBQUM3QyxPQUFPLEVBQ0wsZUFBZSxHQUdoQixNQUFNLG1DQUFtQyxDQUFDOzs7Ozs7Ozs7O0FBRzNDLE1BQU0sWUFBWSxHQUFHO0lBQ25CLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsWUFBWSxFQUFFO0lBQzVDLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFO0lBQzFDLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFO0lBQzlDLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFO0NBQ3ZDLENBQUM7QUFFRixNQUFNLHFCQUFxQixHQUFxRDtJQUM5RSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRTtJQUM5QixF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QUN2QixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLDZCQUFvQyxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVELE1BQU0sQ0FBQyxLQUFZO1FBQ2pCLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNoQixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdkIsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1NBQ3JDO0lBQ0gsQ0FBQzs7bUhBalNVLHNCQUFzQiw4RUEyQ3ZCLG1CQUFtQixhQUNQLG9CQUFvQjt1R0E1Qy9CLHNCQUFzQiwrS0M1RG5DLHNpZUF3UEE7MkZENUxhLHNCQUFzQjtrQkFObEMsU0FBUzsrQkFDRSxxQkFBcUIsUUFFekIsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLG1CQUNiLHVCQUF1QixDQUFDLE1BQU07OzBCQTZDNUMsTUFBTTsyQkFBQyxtQkFBbUI7OzBCQUMxQixRQUFROzswQkFBSSxNQUFNOzJCQUFDLG9CQUFvQjs0Q0EzQ2hDLEtBQUs7c0JBQWQsTUFBTTtnQkFDRyxNQUFNO3NCQUFmLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIEluamVjdCxcbiAgT25Jbml0LFxuICBPcHRpb25hbCxcbiAgT3V0cHV0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBEeW5hbWljU2VsZWN0RmllbGRDb25maWcsIFNlbGVjdE9wdGlvbiB9IGZyb20gJy4uLy4uL2R5bmFtaWMtc2VsZWN0L2R5bmFtaWMtc2VsZWN0LWZpZWxkLmNvbXBvbmVudCc7XG5pbXBvcnQge1xuICBURVNUX0RBVEFfTU9EQUxfREFUQSxcbiAgVEVTVF9EQVRBX01PREFMX0VESVRfSU5fREVQVEgsXG4gIFRlc3REYXRhTW9kYWxEYXRhLFxuICBUZXN0RGF0YU1vZGFsVGFiLFxufSBmcm9tICcuL3Rlc3QtZGF0YS1tb2RhbC1kYXRhJztcbmltcG9ydCB7IFRFU1RfREFUQV9NT0RBTF9SRUYsIFRlc3REYXRhTW9kYWxSZWYgfSBmcm9tICcuL3Rlc3QtZGF0YS1tb2RhbC1yZWYnO1xuaW1wb3J0IHsgVGVzdERhdGFNb2RhbFJlc3VsdCB9IGZyb20gJy4vdGVzdC1kYXRhLW1vZGFsLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgTU9DS19FTlZJUk9OTUVOVF9JVEVNUyxcbiAgRW52aXJvbm1lbnRJdGVtLFxufSBmcm9tICcuL3Rlc3QtZGF0YS1tb2RhbC1lbnZpcm9ubWVudC5tb2RlbCc7XG5pbXBvcnQge1xuICBNT0NLX1BBUkFNRVRFUlMsXG4gIFBhcmFtZXRlckl0ZW0sXG4gIFBhcmFtZXRlclNjb3BlRmlsdGVyLFxufSBmcm9tICcuL3Rlc3QtZGF0YS1tb2RhbC1wYXJhbWV0ZXIubW9kZWwnO1xuaW1wb3J0IHsgQ3FhTGlzdEl0ZW1Db25maWcgfSBmcm9tICcuLi8uLi9pdGVtLWxpc3QvaXRlbS1saXN0Lm1vZGVsJztcblxuY29uc3QgVEFCX1NFR01FTlRTID0gW1xuICB7IGxhYmVsOiAnUGxhaW4gVGV4dCcsIHZhbHVlOiAncGxhaW4tdGV4dCcgfSxcbiAgeyBsYWJlbDogJ1BhcmFtZXRlcicsIHZhbHVlOiAncGFyYW1ldGVyJyB9LFxuICB7IGxhYmVsOiAnRW52aXJvbm1lbnQnLCB2YWx1ZTogJ2Vudmlyb25tZW50JyB9LFxuICB7IGxhYmVsOiAnUnVudGltZScsIHZhbHVlOiAncnVudGltZScgfSxcbl07XG5cbmNvbnN0IFBBUkFNRVRFUl9GSUxURVJfVEFCUzogeyBsYWJlbDogc3RyaW5nOyB2YWx1ZTogUGFyYW1ldGVyU2NvcGVGaWx0ZXIgfVtdID0gW1xuICB7IGxhYmVsOiAnQWxsJywgdmFsdWU6ICdhbGwnIH0sXG4gIHsgbGFiZWw6ICdHbG9iYWwnLCB2YWx1ZTogJ2dsb2JhbCcgfSxcbiAgeyBsYWJlbDogJ0xvY2FsJywgdmFsdWU6ICdsb2NhbCcgfSxcbl07XG5cbi8qKiBNb2NrIHJ1bnRpbWUgdmFyaWFibGUgc3VnZ2VzdGlvbnMgKHJlcGxhY2Ugd2l0aCBBUEkgd2hlbiBpbnRlZ3JhdGluZykuICovXG5jb25zdCBSVU5USU1FX1NVR0dFU1RFRF9WQUxVRVMgPSBbXG4gICd7e3J1bnRpbWUuTWF4V2FpdFRpbWV9fScsXG4gICd7e3J1bnRpbWUuc2Vzc2lvbl9pZH19JyxcbiAgJ3t7cnVudGltZS5hdXRoX3Rva2VufX0nLFxuICAne3tydW50aW1lLnN0ZXBfaW5kZXh9fScsXG4gICd7e3J1bnRpbWUudGltZXN0YW1wfX0nLFxuICAne3tydW50aW1lLnRlc3RfbmFtZX19Jyxcbl07XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NxYS10ZXN0LWRhdGEtbW9kYWwnLFxuICB0ZW1wbGF0ZVVybDogJy4vdGVzdC1kYXRhLW1vZGFsLmNvbXBvbmVudC5odG1sJyxcbiAgaG9zdDogeyBjbGFzczogJ2NxYS11aS1yb290JyB9LFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgVGVzdERhdGFNb2RhbENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBPdXRwdXQoKSBhcHBseSA9IG5ldyBFdmVudEVtaXR0ZXI8e3ZhbHVlOiBzdHJpbmcsIGFjdGl2ZVRhYjogVGVzdERhdGFNb2RhbFRhYn0+KCk7XG4gIEBPdXRwdXQoKSBjYW5jZWwgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBlZGl0SW5EZXB0aCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICByZWFkb25seSB0YWJTZWdtZW50cyA9IFRBQl9TRUdNRU5UUztcbiAgcmVhZG9ubHkgcGFyYW1ldGVyRmlsdGVyVGFicyA9IFBBUkFNRVRFUl9GSUxURVJfVEFCUztcbiAgLyoqIE1vY2sgcGFyYW1ldGVyIGxpc3QgKHJlcGxhY2Ugd2l0aCBBUEkgd2hlbiBpbnRlZ3JhdGluZykuICovXG4gIHJlYWRvbmx5IHBhcmFtZXRlcnM6IFBhcmFtZXRlckl0ZW1bXSA9IE1PQ0tfUEFSQU1FVEVSUztcbiAgLyoqIE1vY2sgZW52aXJvbm1lbnQgbGlzdCAocmVwbGFjZSB3aXRoIEFQSSB3aGVuIGludGVncmF0aW5nKS4gKi9cbiAgcmVhZG9ubHkgZW52aXJvbm1lbnRJdGVtczogRW52aXJvbm1lbnRJdGVtW10gPSBNT0NLX0VOVklST05NRU5UX0lURU1TO1xuICAvKiogUnVudGltZSB0YWI6IHN1Z2dlc3RlZCB2YXJpYWJsZSBjaGlwcy4gKi9cbiAgcmVhZG9ubHkgcnVudGltZVN1Z2dlc3RlZFZhbHVlczogcmVhZG9ubHkgc3RyaW5nW10gPSBSVU5USU1FX1NVR0dFU1RFRF9WQUxVRVM7XG5cbiAgLyoqIEZvcm0gZm9yIGFsbCBtb2RhbCBjb250cm9scyAoc2FtZSBwYXR0ZXJuIGFzIExvb3AgU3RlcCBlZGl0Rm9ybSkuICovXG4gIGVkaXRGb3JtITogRm9ybUdyb3VwO1xuXG4gIC8qKiBDYWNoZWQgc2VsZWN0IGNvbmZpZ3MgKHN0YWJsZSByZWZzLCBzYW1lIG5hbWluZyBhcyBMb29wIFN0ZXA6IHh4eFNlbGVjdENvbmZpZykuICovXG4gIGFjdGl2ZVRhYlNlbGVjdENvbmZpZyE6IER5bmFtaWNTZWxlY3RGaWVsZENvbmZpZztcbiAgcGFyYW1ldGVyU2NvcGVGaWx0ZXJTZWxlY3RDb25maWchOiBEeW5hbWljU2VsZWN0RmllbGRDb25maWc7XG5cbiAgLyoqIExvY2FsIGNvcHkgb2YgZm9ybSB2YWx1ZSBmb3IgQ2FuY2VsIHJldmVydCAoc2FtZSBwYXR0ZXJuIGFzIExvb3AgU3RlcCBlZGl0U25hcHNob3QpLiAqL1xuICBwcml2YXRlIGVkaXRTbmFwc2hvdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICAvKiogU3RhdGUgZGVyaXZlZCBmcm9tIGNvbmZpZy9lZGl0Rm9ybSBmb3IgdGVtcGxhdGUgYW5kIGdldHRlcnMgKG1pcnJvcnMgTG9vcCBTdGVwIGlucHV0cykuICovXG4gIGFjdGl2ZVRhYjogVGVzdERhdGFNb2RhbFRhYiA9ICdwbGFpbi10ZXh0JztcbiAgdmFsdWUgPSAnJztcbiAgaGVscFVybCA9ICcnO1xuICBoZWxwVG9vbHRpcFRleHQgPSAnTm90IHN1cmUgd2hhdCB0byBkbz8gQ2xpY2sgdG8gZ28gdG8gb3VyIGRldGFpbGVkIHN0ZXAgY3JlYXRpb24gZG9jdW1lbnRhdGlvbic7XG4gIHNob3dIZWxwVG9vbHRpcCA9IGZhbHNlO1xuXG4gIHBhcmFtZXRlclNjb3BlRmlsdGVyOiBQYXJhbWV0ZXJTY29wZUZpbHRlciA9ICdhbGwnO1xuICBwYXJhbWV0ZXJTZWFyY2hRdWVyeSA9ICcnO1xuICBzZWxlY3RlZFBhcmFtZXRlcklkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICBlbnZpcm9ubWVudFNlYXJjaFF1ZXJ5ID0gJyc7XG4gIHNlbGVjdGVkRW52aXJvbm1lbnRJZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgcnVudGltZVZhbHVlID0gJyc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBmYjogRm9ybUJ1aWxkZXIsXG4gICAgcHJpdmF0ZSByZWFkb25seSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIEBJbmplY3QoVEVTVF9EQVRBX01PREFMX1JFRikgcHJpdmF0ZSByZWY6IFRlc3REYXRhTW9kYWxSZWY8VGVzdERhdGFNb2RhbFJlc3VsdD4sXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChURVNUX0RBVEFfTU9EQUxfREFUQSkgZGF0YT86IFRlc3REYXRhTW9kYWxEYXRhXG4gICkge1xuICAgIGlmIChkYXRhKSB7XG4gICAgICB0aGlzLnZhbHVlID0gZGF0YS52YWx1ZSA/PyAnJztcbiAgICAgIHRoaXMuaGVscFVybCA9IGRhdGEuaGVscFVybCA/PyAnJztcbiAgICAgIHRoaXMuYWN0aXZlVGFiID0gKGRhdGEuYWN0aXZlVGFiID8/ICdwbGFpbi10ZXh0JykgYXMgVGVzdERhdGFNb2RhbFRhYjtcbiAgICAgIHRoaXMucGFyYW1ldGVyU2NvcGVGaWx0ZXIgPSBkYXRhLnBhcmFtZXRlclNjb3BlRmlsdGVyID8/ICdhbGwnO1xuICAgICAgdGhpcy5wYXJhbWV0ZXJTZWFyY2hRdWVyeSA9IGRhdGEucGFyYW1ldGVyU2VhcmNoUXVlcnkgPz8gJyc7XG4gICAgICB0aGlzLnNlbGVjdGVkUGFyYW1ldGVySWQgPSBkYXRhLnNlbGVjdGVkUGFyYW1ldGVySWQgPz8gbnVsbDtcbiAgICAgIHRoaXMuZW52aXJvbm1lbnRTZWFyY2hRdWVyeSA9IGRhdGEuZW52aXJvbm1lbnRTZWFyY2hRdWVyeSA/PyAnJztcbiAgICAgIHRoaXMuc2VsZWN0ZWRFbnZpcm9ubWVudElkID0gZGF0YS5zZWxlY3RlZEVudmlyb25tZW50SWQgPz8gbnVsbDtcbiAgICAgIHRoaXMucnVudGltZVZhbHVlID0gZGF0YS5ydW50aW1lVmFsdWUgPz8gJyc7XG4gICAgfVxuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5idWlsZEVkaXRGb3JtKCk7XG4gICAgdGhpcy5idWlsZFNlbGVjdENvbmZpZ3MoKTtcbiAgICB0aGlzLmVkaXRTbmFwc2hvdCA9IHsgLi4udGhpcy5lZGl0Rm9ybS52YWx1ZSB9O1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgLyoqIEJ1aWxkIGZvcm0gd2l0aCBhbGwgY29udHJvbCB2YWx1ZXMgKHNhbWUgcGF0dGVybiBhcyBMb29wIFN0ZXAgYnVpbGRFZGl0Rm9ybSkuICovXG4gIHByaXZhdGUgYnVpbGRFZGl0Rm9ybSgpOiB2b2lkIHtcbiAgICB0aGlzLmVkaXRGb3JtID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICB2YWx1ZTogW3RoaXMudmFsdWUgPz8gJyddLFxuICAgICAgYWN0aXZlVGFiOiBbdGhpcy5hY3RpdmVUYWIgPz8gJ3BsYWluLXRleHQnXSxcbiAgICAgIHBhcmFtZXRlclNjb3BlRmlsdGVyOiBbdGhpcy5wYXJhbWV0ZXJTY29wZUZpbHRlciA/PyAnYWxsJ10sXG4gICAgICBwYXJhbWV0ZXJTZWFyY2hRdWVyeTogW3RoaXMucGFyYW1ldGVyU2VhcmNoUXVlcnkgPz8gJyddLFxuICAgICAgc2VsZWN0ZWRQYXJhbWV0ZXJJZDogW3RoaXMuc2VsZWN0ZWRQYXJhbWV0ZXJJZCA/PyBudWxsXSxcbiAgICAgIGVudmlyb25tZW50U2VhcmNoUXVlcnk6IFt0aGlzLmVudmlyb25tZW50U2VhcmNoUXVlcnkgPz8gJyddLFxuICAgICAgc2VsZWN0ZWRFbnZpcm9ubWVudElkOiBbdGhpcy5zZWxlY3RlZEVudmlyb25tZW50SWQgPz8gbnVsbF0sXG4gICAgICBydW50aW1lVmFsdWU6IFt0aGlzLnJ1bnRpbWVWYWx1ZSA/PyAnJ10sXG4gICAgfSk7XG4gIH1cblxuICAvKiogQnVpbGQgc2VsZWN0IGNvbmZpZ3Mgb25jZSAoc2FtZSBwYXR0ZXJuIGFzIExvb3AgU3RlcCBidWlsZFNlbGVjdENvbmZpZ3MpLiAqL1xuICBwcml2YXRlIGJ1aWxkU2VsZWN0Q29uZmlncygpOiB2b2lkIHtcbiAgICBjb25zdCB0YWJPcHRpb25zOiBTZWxlY3RPcHRpb25bXSA9IFRBQl9TRUdNRU5UUy5tYXAoKHMpID0+ICh7XG4gICAgICBpZDogcy52YWx1ZSxcbiAgICAgIHZhbHVlOiBzLnZhbHVlLFxuICAgICAgbmFtZTogcy5sYWJlbCxcbiAgICAgIGxhYmVsOiBzLmxhYmVsLFxuICAgIH0pKTtcbiAgICBjb25zdCBmaWx0ZXJPcHRpb25zOiBTZWxlY3RPcHRpb25bXSA9IFBBUkFNRVRFUl9GSUxURVJfVEFCUy5tYXAoKHMpID0+ICh7XG4gICAgICBpZDogcy52YWx1ZSxcbiAgICAgIHZhbHVlOiBzLnZhbHVlLFxuICAgICAgbmFtZTogcy5sYWJlbCxcbiAgICAgIGxhYmVsOiBzLmxhYmVsLFxuICAgIH0pKTtcbiAgICB0aGlzLmFjdGl2ZVRhYlNlbGVjdENvbmZpZyA9IHtcbiAgICAgIGtleTogJ2FjdGl2ZVRhYicsXG4gICAgICBwbGFjZWhvbGRlcjogJ1RhYicsXG4gICAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICAgIG9wdGlvbnM6IHRhYk9wdGlvbnMsXG4gICAgfTtcbiAgICB0aGlzLnBhcmFtZXRlclNjb3BlRmlsdGVyU2VsZWN0Q29uZmlnID0ge1xuICAgICAga2V5OiAncGFyYW1ldGVyU2NvcGVGaWx0ZXInLFxuICAgICAgcGxhY2Vob2xkZXI6ICdTY29wZScsXG4gICAgICBzZWFyY2hhYmxlOiBmYWxzZSxcbiAgICAgIG9wdGlvbnM6IGZpbHRlck9wdGlvbnMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBVcGRhdGUgZm9ybSBjb250cm9sIGFuZCBzeW5jIGNvbXBvbmVudCBzdGF0ZSAoc2FtZSBwYXR0ZXJuIGFzIExvb3AgU3RlcCBvbkVkaXRGb3JtRmllbGRDaGFuZ2UpLiAqL1xuICBvbkVkaXRGb3JtRmllbGRDaGFuZ2UoY29udHJvbE5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyB8IG51bWJlciB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLmVkaXRGb3JtLmdldChjb250cm9sTmFtZSk/LnNldFZhbHVlKHZhbHVlKTtcbiAgICB0aGlzLnN5bmNTdGF0ZUZyb21Gb3JtKCk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvKiogU3luYyBjb21wb25lbnQgc3RhdGUgZnJvbSBlZGl0Rm9ybSBzbyBnZXR0ZXJzIChlLmcuIGZpbHRlcmVkUGFyYW1ldGVycykgc3RheSBjb3JyZWN0LiAqL1xuICBwcml2YXRlIHN5bmNTdGF0ZUZyb21Gb3JtKCk6IHZvaWQge1xuICAgIGNvbnN0IHYgPSB0aGlzLmVkaXRGb3JtLnZhbHVlO1xuICAgIHRoaXMudmFsdWUgPSB2LnZhbHVlID8/ICcnO1xuICAgIHRoaXMuYWN0aXZlVGFiID0gKHYuYWN0aXZlVGFiID8/ICdwbGFpbi10ZXh0JykgYXMgVGVzdERhdGFNb2RhbFRhYjtcbiAgICB0aGlzLnBhcmFtZXRlclNjb3BlRmlsdGVyID0gKHYucGFyYW1ldGVyU2NvcGVGaWx0ZXIgPz8gJ2FsbCcpIGFzIFBhcmFtZXRlclNjb3BlRmlsdGVyO1xuICAgIHRoaXMucGFyYW1ldGVyU2VhcmNoUXVlcnkgPSB2LnBhcmFtZXRlclNlYXJjaFF1ZXJ5ID8/ICcnO1xuICAgIHRoaXMuc2VsZWN0ZWRQYXJhbWV0ZXJJZCA9IHYuc2VsZWN0ZWRQYXJhbWV0ZXJJZCA/PyBudWxsO1xuICAgIHRoaXMuZW52aXJvbm1lbnRTZWFyY2hRdWVyeSA9IHYuZW52aXJvbm1lbnRTZWFyY2hRdWVyeSA/PyAnJztcbiAgICB0aGlzLnNlbGVjdGVkRW52aXJvbm1lbnRJZCA9IHYuc2VsZWN0ZWRFbnZpcm9ubWVudElkID8/IG51bGw7XG4gICAgdGhpcy5ydW50aW1lVmFsdWUgPSB2LnJ1bnRpbWVWYWx1ZSA/PyAnJztcbiAgfVxuXG4gIC8qKiBGaWx0ZXJlZCBwYXJhbWV0ZXJzIGJ5IHNjb3BlIGFuZCBzZWFyY2ggKFBhcmFtZXRlciB0YWIpLiAqL1xuICBnZXQgZmlsdGVyZWRQYXJhbWV0ZXJzKCk6IFBhcmFtZXRlckl0ZW1bXSB7XG4gICAgbGV0IGxpc3QgPSB0aGlzLnBhcmFtZXRlcnM7XG4gICAgaWYgKHRoaXMucGFyYW1ldGVyU2NvcGVGaWx0ZXIgPT09ICdnbG9iYWwnKSB7XG4gICAgICBsaXN0ID0gbGlzdC5maWx0ZXIoKHApID0+IHAuc2NvcGUgPT09ICdHbG9iYWwnKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMucGFyYW1ldGVyU2NvcGVGaWx0ZXIgPT09ICdsb2NhbCcpIHtcbiAgICAgIGxpc3QgPSBsaXN0LmZpbHRlcigocCkgPT4gcC5zY29wZSA9PT0gJ0xvY2FsJyk7XG4gICAgfVxuICAgIGNvbnN0IHEgPSB0aGlzLnBhcmFtZXRlclNlYXJjaFF1ZXJ5LnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChxKSB7XG4gICAgICBsaXN0ID0gbGlzdC5maWx0ZXIoKHApID0+IHAubmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHEpKTtcbiAgICB9XG4gICAgcmV0dXJuIGxpc3Q7XG4gIH1cblxuICAvKiogRmlsdGVyZWQgZW52aXJvbm1lbnQgaXRlbXMgYnkgc2VhcmNoIChFbnZpcm9ubWVudCB0YWIpLiAqL1xuICBnZXQgZmlsdGVyZWRFbnZpcm9ubWVudHMoKTogRW52aXJvbm1lbnRJdGVtW10ge1xuICAgIGNvbnN0IHEgPSB0aGlzLmVudmlyb25tZW50U2VhcmNoUXVlcnkudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKCFxKSB7XG4gICAgICByZXR1cm4gdGhpcy5lbnZpcm9ubWVudEl0ZW1zO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5lbnZpcm9ubWVudEl0ZW1zLmZpbHRlcihcbiAgICAgIChlKSA9PlxuICAgICAgICBlLm5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxKSB8fCBlLnZhbHVlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocSlcbiAgICApO1xuICB9XG5cbiAgLyoqIFBhcmFtZXRlciB0YWI6IGxpc3QgY29uZmlnIGZvciBjcWEtaXRlbS1saXN0IChzZWFyY2gtZnJpZW5kbHk6IGJpbmQgZmlsdGVyZWQgbGlzdCkuICovXG4gIGdldCBwYXJhbWV0ZXJMaXN0Q29uZmlnKCk6IENxYUxpc3RJdGVtQ29uZmlnW10ge1xuICAgIHJldHVybiB0aGlzLmZpbHRlcmVkUGFyYW1ldGVycy5tYXAoKHApID0+ICh7XG4gICAgICBpZDogcC5pZCxcbiAgICAgIHRpdGxlOiBwLm5hbWUsXG4gICAgICBzdWJ0aXRsZTogcC52YWx1ZSxcbiAgICAgIGJhZGdlOiBwLnNjb3BlLFxuICAgICAgc2hvd0VkaXQ6IHRoaXMuc2VsZWN0ZWRQYXJhbWV0ZXJJZCA9PT0gcC5pZCxcbiAgICB9KSk7XG4gIH1cblxuICAvKiogRW52aXJvbm1lbnQgdGFiOiBsaXN0IGNvbmZpZyBmb3IgY3FhLWl0ZW0tbGlzdC4gKi9cbiAgZ2V0IGVudmlyb25tZW50TGlzdENvbmZpZygpOiBDcWFMaXN0SXRlbUNvbmZpZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJlZEVudmlyb25tZW50cy5tYXAoKGUpID0+ICh7XG4gICAgICBpZDogZS5pZCxcbiAgICAgIHRpdGxlOiBlLm5hbWUsXG4gICAgICBzdWJ0aXRsZTogYFZhbHVlOiAke2UudmFsdWV9YCxcbiAgICAgIGJhZGdlOiBlLmVudmlyb25tZW50LFxuICAgICAgc2hvd0VkaXQ6IHRoaXMuc2VsZWN0ZWRFbnZpcm9ubWVudElkID09PSBlLmlkICYmIChlLmVkaXRhYmxlID8/IHRydWUpLFxuICAgIH0pKTtcbiAgfVxuXG4gIG9uVGFiQ2hhbmdlKHRhYlZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm9uRWRpdEZvcm1GaWVsZENoYW5nZSgnYWN0aXZlVGFiJywgdGFiVmFsdWUpO1xuICB9XG5cbiAgb25QYXJhbWV0ZXJTY29wZUZpbHRlckNoYW5nZShmaWx0ZXI6IFBhcmFtZXRlclNjb3BlRmlsdGVyKTogdm9pZCB7XG4gICAgdGhpcy5vbkVkaXRGb3JtRmllbGRDaGFuZ2UoJ3BhcmFtZXRlclNjb3BlRmlsdGVyJywgZmlsdGVyKTtcbiAgfVxuXG4gIG9uUGFyYW1ldGVyU2VhcmNoSW5wdXQodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMub25FZGl0Rm9ybUZpZWxkQ2hhbmdlKCdwYXJhbWV0ZXJTZWFyY2hRdWVyeScsIHZhbHVlKTtcbiAgfVxuXG4gIG9uUGFyYW1ldGVyU2VsZWN0KHBhcmFtSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHBhcmFtID0gdGhpcy5wYXJhbWV0ZXJzLmZpbmQoKHApID0+IHAuaWQgPT09IHBhcmFtSWQpO1xuICAgIGlmIChwYXJhbSkge1xuICAgICAgdGhpcy5zZWxlY3RlZFBhcmFtZXRlcklkID0gdGhpcy5zZWxlY3RlZFBhcmFtZXRlcklkID09PSBwYXJhbS5pZCA/IG51bGwgOiBwYXJhbS5pZDtcbiAgICAgIHRoaXMub25FZGl0Rm9ybUZpZWxkQ2hhbmdlKCdzZWxlY3RlZFBhcmFtZXRlcklkJywgdGhpcy5zZWxlY3RlZFBhcmFtZXRlcklkKTtcbiAgICAgIHRoaXMub25FZGl0Rm9ybUZpZWxkQ2hhbmdlKCd2YWx1ZScsIHBhcmFtLm5hbWUpO1xuICAgIH1cbiAgfVxuXG4gIG9uUGFyYW1ldGVyRWRpdChfcGFyYW1JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgLy8gUGxhY2Vob2xkZXIgZm9yIGZ1dHVyZSBlZGl0IGFjdGlvbiAoZS5nLiBvcGVuIGVkaXQgZHJhd2VyKS5cbiAgfVxuXG4gIG9uQ3JlYXRlTmV3VmFyaWFibGUoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAvLyBQbGFjZWhvbGRlciBmb3IgZnV0dXJlIFwiQ3JlYXRlIE5ld1wiIGFjdGlvbiAobm8gQVBJIHlldCkuXG4gIH1cblxuICBvbkVudmlyb25tZW50U2VhcmNoSW5wdXQodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMub25FZGl0Rm9ybUZpZWxkQ2hhbmdlKCdlbnZpcm9ubWVudFNlYXJjaFF1ZXJ5JywgdmFsdWUpO1xuICB9XG5cbiAgb25FbnZpcm9ubWVudFNlbGVjdChpdGVtSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmVudmlyb25tZW50SXRlbXMuZmluZCgoZSkgPT4gZS5pZCA9PT0gaXRlbUlkKTtcbiAgICBpZiAoaXRlbSkge1xuICAgICAgdGhpcy5zZWxlY3RlZEVudmlyb25tZW50SWQgPVxuICAgICAgICB0aGlzLnNlbGVjdGVkRW52aXJvbm1lbnRJZCA9PT0gaXRlbS5pZCA/IG51bGwgOiBpdGVtLmlkO1xuICAgICAgdGhpcy5vbkVkaXRGb3JtRmllbGRDaGFuZ2UoJ3NlbGVjdGVkRW52aXJvbm1lbnRJZCcsIHRoaXMuc2VsZWN0ZWRFbnZpcm9ubWVudElkKTtcbiAgICAgIHRoaXMub25FZGl0Rm9ybUZpZWxkQ2hhbmdlKCd2YWx1ZScsIGl0ZW0ubmFtZSk7XG4gICAgfVxuICB9XG5cbiAgb25FbnZpcm9ubWVudEVkaXQoX2l0ZW1JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgLy8gUGxhY2Vob2xkZXIgZm9yIGZ1dHVyZSBlZGl0IGFjdGlvbiAoZS5nLiBvcGVuIGVkaXQgZHJhd2VyKS5cbiAgfVxuXG4gIG9uQ3JlYXRlTmV3RW52aXJvbm1lbnQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAvLyBQbGFjZWhvbGRlciBmb3IgZnV0dXJlIFwiQ3JlYXRlIE5ld1wiIGFjdGlvbiAobm8gQVBJIHlldCkuXG4gIH1cblxuICAvKiogUnVudGltZSB0YWI6IGluc2VydCBzdWdnZXN0ZWQgdmFsdWUgaW50byB0aGUgcnVudGltZSBpbnB1dCBmaWVsZC4gKi9cbiAgb25SdW50aW1lQ2hpcEluc2VydChzbmlwcGV0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBuZXh0ID0gdGhpcy5lZGl0Rm9ybS5nZXQoJ3J1bnRpbWVWYWx1ZScpPy52YWx1ZVxuICAgICAgPyB0aGlzLmVkaXRGb3JtLmdldCgncnVudGltZVZhbHVlJyk/LnZhbHVlICsgJyAnICsgc25pcHBldFxuICAgICAgOiBzbmlwcGV0O1xuICAgIHRoaXMub25FZGl0Rm9ybUZpZWxkQ2hhbmdlKCdydW50aW1lVmFsdWUnLCBuZXh0KTtcbiAgfVxuXG4gIG9uQXBwbHkoKTogdm9pZCB7XG4gICAgdGhpcy5zeW5jU3RhdGVGcm9tRm9ybSgpO1xuICAgIGxldCB2YWx1ZVRvQXBwbHkgPSB0aGlzLmFjdGl2ZVRhYiA9PT0gJ3J1bnRpbWUnID8gdGhpcy5ydW50aW1lVmFsdWUgOiB0aGlzLnZhbHVlO1xuXG4gICAgaWYgKHRoaXMuYWN0aXZlVGFiID09PSAncGFyYW1ldGVyJykge1xuICAgICAgdmFsdWVUb0FwcGx5ID0gdGhpcy5zZWxlY3RlZFBhcmFtZXRlcklkID8gdGhpcy5wYXJhbWV0ZXJzLmZpbmQoKHApID0+IHAuaWQgPT09IHRoaXMuc2VsZWN0ZWRQYXJhbWV0ZXJJZCk/Lm5hbWUgPz8gJycgOiAnJztcbiAgICB9IGVsc2UgaWYgKHRoaXMuYWN0aXZlVGFiID09PSAnZW52aXJvbm1lbnQnKSB7XG4gICAgICB2YWx1ZVRvQXBwbHkgPSB0aGlzLnNlbGVjdGVkRW52aXJvbm1lbnRJZCA/IHRoaXMuZW52aXJvbm1lbnRJdGVtcy5maW5kKChlKSA9PiBlLmlkID09PSB0aGlzLnNlbGVjdGVkRW52aXJvbm1lbnRJZCk/Lm5hbWUgPz8gJycgOiAnJztcbiAgICB9XG5cbiAgICAvLyBCdWlsZCByZXN1bHQgd2l0aCBvbmx5IHRoZSBhY3RpdmUgdGFiJ3MgZGF0YSwgY2xlYXIgb3RoZXIgdGFicycgZGF0YVxuICAgIGNvbnN0IHJlc3VsdDogVGVzdERhdGFNb2RhbERhdGEgPSB7XG4gICAgICB2YWx1ZTogdmFsdWVUb0FwcGx5LFxuICAgICAgYWN0aXZlVGFiOiB0aGlzLmFjdGl2ZVRhYixcbiAgICAgIC8vIE9ubHkgaW5jbHVkZSBwYXJhbWV0ZXIgZGF0YSBpZiBwYXJhbWV0ZXIgdGFiIGlzIGFjdGl2ZVxuICAgICAgcGFyYW1ldGVyU2NvcGVGaWx0ZXI6IHRoaXMuYWN0aXZlVGFiID09PSAncGFyYW1ldGVyJyA/IHRoaXMucGFyYW1ldGVyU2NvcGVGaWx0ZXIgOiB1bmRlZmluZWQsXG4gICAgICBwYXJhbWV0ZXJTZWFyY2hRdWVyeTogdGhpcy5hY3RpdmVUYWIgPT09ICdwYXJhbWV0ZXInID8gdGhpcy5wYXJhbWV0ZXJTZWFyY2hRdWVyeSA6IHVuZGVmaW5lZCxcbiAgICAgIHNlbGVjdGVkUGFyYW1ldGVySWQ6IHRoaXMuYWN0aXZlVGFiID09PSAncGFyYW1ldGVyJyA/IHRoaXMuc2VsZWN0ZWRQYXJhbWV0ZXJJZCA6IHVuZGVmaW5lZCxcbiAgICAgIC8vIE9ubHkgaW5jbHVkZSBlbnZpcm9ubWVudCBkYXRhIGlmIGVudmlyb25tZW50IHRhYiBpcyBhY3RpdmVcbiAgICAgIGVudmlyb25tZW50U2VhcmNoUXVlcnk6IHRoaXMuYWN0aXZlVGFiID09PSAnZW52aXJvbm1lbnQnID8gdGhpcy5lbnZpcm9ubWVudFNlYXJjaFF1ZXJ5IDogdW5kZWZpbmVkLFxuICAgICAgc2VsZWN0ZWRFbnZpcm9ubWVudElkOiB0aGlzLmFjdGl2ZVRhYiA9PT0gJ2Vudmlyb25tZW50JyA/IHRoaXMuc2VsZWN0ZWRFbnZpcm9ubWVudElkIDogdW5kZWZpbmVkLFxuICAgICAgLy8gT25seSBpbmNsdWRlIHJ1bnRpbWUgZGF0YSBpZiBydW50aW1lIHRhYiBpcyBhY3RpdmVcbiAgICAgIHJ1bnRpbWVWYWx1ZTogdGhpcy5hY3RpdmVUYWIgPT09ICdydW50aW1lJyA/IHRoaXMucnVudGltZVZhbHVlIDogdW5kZWZpbmVkLFxuICAgIH07XG5cbiAgICB0aGlzLmFwcGx5LmVtaXQoe3ZhbHVlOiB2YWx1ZVRvQXBwbHksIGFjdGl2ZVRhYjogdGhpcy5hY3RpdmVUYWIgYXMgVGVzdERhdGFNb2RhbFRhYn0pO1xuICAgIHRoaXMucmVmLmNsb3NlKHJlc3VsdCk7XG4gIH1cblxuICBvbkNhbmNlbCgpOiB2b2lkIHtcbiAgICB0aGlzLmVkaXRGb3JtLnBhdGNoVmFsdWUodGhpcy5lZGl0U25hcHNob3QpO1xuICAgIHRoaXMuc3luY1N0YXRlRnJvbUZvcm0oKTtcbiAgICB0aGlzLmNhbmNlbC5lbWl0KCk7XG4gICAgdGhpcy5yZWYuY2xvc2UodW5kZWZpbmVkKTtcbiAgfVxuXG4gIG9uQ2xvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5vbkNhbmNlbCgpO1xuICB9XG5cbiAgb25FZGl0SW5EZXB0aChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMuZWRpdEluRGVwdGguZW1pdCgpO1xuICAgIHRoaXMucmVmLmNsb3NlKFRFU1RfREFUQV9NT0RBTF9FRElUX0lOX0RFUFRIIGFzIGFueSk7XG4gIH1cblxuICBvbkhlbHAoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaGVscFVybCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHdpbmRvdy5vcGVuKHRoaXMuaGVscFVybCwgJ19ibGFuaycpO1xuICAgIH1cbiAgfVxufVxuIiwiPGRpdlxuICBjbGFzcz1cImNxYS1iZy13aGl0ZSBjcWEtcm91bmRlZC1bMTJweF0gY3FhLXNoYWRvdy1sZyBjcWEtYm9yZGVyIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1bI0U1RTdFQl0gY3FhLXctWzUwMHB4XSBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC1bMTJweF0gY3FhLXAtMiBjcWEtYm94LWJvcmRlciBjcWEtbWluLWgtMFwiPlxuICA8IS0tIEhlYWRlcjogdGl0bGUgbGVmdDsgTmVlZCBoZWxwPyArIGNsb3NlIGljb24gcmlnaHQgLS0+XG4gIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWJldHdlZW4gY3FhLWdhcC0yIGNxYS1weC00XCI+XG4gICAgPGgyIGNsYXNzPVwiY3FhLXRleHQtWzE2cHhdIGNxYS1sZWFkaW5nLVsyNHB4XSBjcWEtZm9udC1ib2xkIGNxYS10ZXh0LVsjMTExODI3XSBjcWEtbS0wIGNxYS1mb250LVs2MDBdXCI+XG4gICAgICBUZXN0IERhdGFcbiAgICA8L2gyPlxuICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMiBjcWEtbWluLWgtWzI4cHhdXCI+XG4gICAgICA8IS0tIE5lZWQgaGVscD8gd2l0aCBjdXN0b20gdG9vbHRpcCAod29ya3MgaW5zaWRlIG92ZXJsYXkpIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1yZWxhdGl2ZSBjcWEtaW5saW5lLWZsZXggY3FhLWl0ZW1zLWNlbnRlclwiXG4gICAgICAgIChtb3VzZWVudGVyKT1cInNob3dIZWxwVG9vbHRpcCA9IHRydWVcIiAobW91c2VsZWF2ZSk9XCJzaG93SGVscFRvb2x0aXAgPSBmYWxzZVwiPlxuICAgICAgICA8YSAqbmdJZj1cImhlbHBVcmxcIiBocmVmPVwiI1wiIChjbGljayk9XCJvbkhlbHAoJGV2ZW50KVwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMSBjcWEtdGV4dC1bIzNGNDNFRV0gY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLVsyMXB4XSBjcWEtbm8tdW5kZXJsaW5lIGhvdmVyOmNxYS11bmRlcmxpbmUgY3FhLWN1cnNvci1wb2ludGVyXCI+XG4gICAgICAgICAgPHN2ZyB3aWR0aD1cIjE3XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE3IDE2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgY2xhc3M9XCJjcWEtZmxleC1zaHJpbmstMFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgPGcgY2xpcC1wYXRoPVwidXJsKCN0ZXN0LWRhdGEtaGVscC1jbGlwKVwiPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTguNTAwMzMgMTQuNjY2M0MxMi40MTIzIDE0LjY2NjMgMTUuNTgzNyAxMS42ODE2IDE1LjU4MzcgNy45OTk2N0MxNS41ODM3IDQuMzE3NzggMTIuNDEyMyAxLjMzMzAxIDguNTAwMzMgMS4zMzMwMUM0LjU4ODMxIDEuMzMzMDEgMS40MTY5OSA0LjMxNzc4IDEuNDE2OTkgNy45OTk2N0MxLjQxNjk5IDExLjY4MTYgNC41ODgzMSAxNC42NjYzIDguNTAwMzMgMTQuNjY2M1pcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNi40Mzg0OCA2LjAwMDM4QzYuNjA1MDEgNS41NTQ4MyA2LjkzMzcxIDUuMTc5MTIgNy4zNjYzNiA0LjkzOThDNy43OTkwMSA0LjcwMDQ5IDguMzA3NjkgNC42MTMwMSA4LjgwMjMxIDQuNjkyODVDOS4yOTY5MyA0Ljc3MjcgOS43NDU1NiA1LjAxNDczIDEwLjA2ODcgNS4zNzYwN0MxMC4zOTE5IDUuNzM3NCAxMC41Njg4IDYuMTk0NzMgMTAuNTY4MSA2LjY2NzA1QzEwLjU2ODEgOC4wMDAzOCA4LjQ0MzA2IDguNjY3MDUgOC40NDMwNiA4LjY2NzA1XCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTguNSAxMS4zMzNIOC41MDk2NlwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgIDwvZz5cbiAgICAgICAgICAgIDxkZWZzPlxuICAgICAgICAgICAgICA8Y2xpcFBhdGggaWQ9XCJ0ZXN0LWRhdGEtaGVscC1jbGlwXCI+XG4gICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIxN1wiIGhlaWdodD1cIjE2XCIgZmlsbD1cIndoaXRlXCIvPlxuICAgICAgICAgICAgICA8L2NsaXBQYXRoPlxuICAgICAgICAgICAgPC9kZWZzPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIE5lZWQgaGVscCA/XG4gICAgICAgIDwvYT5cbiAgICAgICAgPHNwYW4gKm5nSWY9XCIhaGVscFVybFwiIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTEuNSBjcWEtZm9udC1bNTAwXSBjcWEtdGV4dC1bMTBweF0gY3FhLWN1cnNvci1kZWZhdWx0XCI+XG4gICAgICAgICAgPHN2ZyB3aWR0aD1cIjE3XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE3IDE2XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgY2xhc3M9XCJjcWEtZmxleC1zaHJpbmstMCBjcWEtdGV4dC1bIzNGNDNFRV1cIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgIDxnIGNsaXAtcGF0aD1cInVybCgjdGVzdC1kYXRhLWhlbHAtY2xpcC1ub2xpbmspXCI+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOC41MDAzMyAxNC42NjYzQzEyLjQxMjMgMTQuNjY2MyAxNS41ODM3IDExLjY4MTYgMTUuNTgzNyA3Ljk5OTY3QzE1LjU4MzcgNC4zMTc3OCAxMi40MTIzIDEuMzMzMDEgOC41MDAzMyAxLjMzMzAxQzQuNTg4MzEgMS4zMzMwMSAxLjQxNjk5IDQuMzE3NzggMS40MTY5OSA3Ljk5OTY3QzEuNDE2OTkgMTEuNjgxNiA0LjU4ODMxIDE0LjY2NjMgOC41MDAzMyAxNC42NjYzWlwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiLz5cbiAgICAgICAgICAgICAgPHBhdGggZD1cIk02LjQzODQ4IDYuMDAwMzhDNi42MDUwMSA1LjU1NDgzIDYuOTMzNzEgNS4xNzkxMiA3LjM2NjM2IDQuOTM5OEM3Ljc5OTAxIDQuNzAwNDkgOC4zMDc2OSA0LjYxMzAxIDguODAyMzEgNC42OTI4NUM5LjI5NjkzIDQuNzcyNyA5Ljc0NTU2IDUuMDE0NzMgMTAuMDY4NyA1LjM3NjA3QzEwLjM5MTkgNS43Mzc0IDEwLjU2ODggNi4xOTQ3MyAxMC41NjgxIDYuNjY3MDVDMTAuNTY4MSA4LjAwMDM4IDguNDQzMDYgOC42NjcwNSA4LjQ0MzA2IDguNjY3MDVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOC41IDExLjMzM0g4LjUwOTY2XCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgPC9nPlxuICAgICAgICAgICAgPGRlZnM+XG4gICAgICAgICAgICAgIDxjbGlwUGF0aCBpZD1cInRlc3QtZGF0YS1oZWxwLWNsaXAtbm9saW5rXCI+XG4gICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIxN1wiIGhlaWdodD1cIjE2XCIgZmlsbD1cIndoaXRlXCIvPlxuICAgICAgICAgICAgICA8L2NsaXBQYXRoPlxuICAgICAgICAgICAgPC9kZWZzPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIE5lZWQgaGVscCA/XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPCEtLSBDdXN0b20gdG9vbHRpcCAoZXhhY3Qgc3BlYzogMzA2w5cyMCBjb250ZW50LCA2cHggcmFkaXVzLCAjMEEwQTBBLCBubyBhcnJvdykgLS0+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJzaG93SGVscFRvb2x0aXBcIlxuICAgICAgICAgIGNsYXNzPVwiY3FhLWFic29sdXRlIGNxYS1wb2ludGVyLWV2ZW50cy1ub25lIGNxYS16LVsxMDBdIGNxYS10b3AtWy0yNHB4XSBjcWEtbGVmdC1bLTEyNXB4XVwiXG4gICAgICAgICAgcm9sZT1cInRvb2x0aXBcIj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cImNxYS10ZXh0LXdoaXRlIGNxYS10ZXh0LWNlbnRlciBjcWEtd2hpdGVzcGFjZS1ub3dyYXAgY3FhLXctWzMwNnB4XSBjcWEtbWluLWgtWzIwcHhdIGNxYS1yb3VuZGVkLVs2cHhdIGNxYS1weS0xIGNxYS1weC0yIGNxYS1iZy1bIzBBMEEwQV0gY3FhLWxlYWRpbmctWzIwcHhdIGNxYS10ZXh0LVs4cHhdXCI+XG4gICAgICAgICAgICB7eyBoZWxwVG9vbHRpcFRleHQgfX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJvbkNsb3NlKClcIlxuICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1taW4taC1bMjhweF0gY3FhLW1pbi13LVsyOHB4XSBjcWEtcm91bmRlZCBjcWEtdGV4dC1bIzZCNzI4MF0gaG92ZXI6Y3FhLWJnLVsjRjNGNEY2XSBjcWEtcC0wXCJcbiAgICAgICAgdGl0bGU9XCJDbG9zZVwiIGFyaWEtbGFiZWw9XCJDbG9zZVwiPlxuICAgICAgICA8bWF0LWljb24gY2xhc3M9XCIhY3FhLXctNSAhY3FhLWgtNSAhY3FhLXRleHQtWzIwcHhdICFjcWEtYmxvY2sgIWNxYS1sZWFkaW5nLW5vbmVcIj5jbG9zZTwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBMaW5lIGJlbG93IGhlYWRlciAoZnVsbCB3aWR0aCBvZiBtb2RhbCwgbm8gc2lkZSBtYXJnaW4pIC0tPlxuICA8ZGl2IGNsYXNzPVwiY3FhLS1teC0yIGNxYS13LVtjYWxjKDEwMCUrMXJlbSldIGNxYS1mbGV4LXNocmluay0wXCI+XG4gICAgPGRpdiBjbGFzcz1cImNxYS1oLXB4IGNxYS13LWZ1bGwgY3FhLWJnLVsjRTVFN0VCXVwiIHJvbGU9XCJwcmVzZW50YXRpb25cIj48L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBUYWJzOiBQbGFpbiBUZXh0LCBQYXJhbWV0ZXIsIEVudmlyb25tZW50LCBSdW50aW1lIChib3VuZCB0byBlZGl0Rm9ybSBsaWtlIExvb3AgU3RlcCkgLS0+XG4gIDxkaXYgY2xhc3M9XCJjcWEtdy1mdWxsIGNxYS10ZXN0LWRhdGEtbW9kYWwtdGFic1wiPlxuICAgIDxjcWEtc2VnbWVudC1jb250cm9sXG4gICAgICBbc2VnbWVudHNdPVwidGFiU2VnbWVudHNcIlxuICAgICAgW3ZhbHVlXT1cImVkaXRGb3JtLmdldCgnYWN0aXZlVGFiJyk/LnZhbHVlID8/IGFjdGl2ZVRhYlwiXG4gICAgICAodmFsdWVDaGFuZ2UpPVwib25UYWJDaGFuZ2UoJGV2ZW50KVwiPlxuICAgIDwvY3FhLXNlZ21lbnQtY29udHJvbD5cbiAgPC9kaXY+XG5cbiAgPCEtLSBDb250ZW50IHBlciB0YWI6IGZsZXgtMSBtaW4taC0wIHNvIFBhcmFtZXRlci9FbnZpcm9ubWVudC9SdW50aW1lIGNvbnRlbnQgY2FuIHNjcm9sbCAtLT5cbiAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTEuNSBjcWEtbWluLWgtMFwiXG4gICAgW2NsYXNzLmNxYS1mbGV4LTFdPVwiYWN0aXZlVGFiID09PSAncGFyYW1ldGVyJyB8fCBhY3RpdmVUYWIgPT09ICdlbnZpcm9ubWVudCcgfHwgYWN0aXZlVGFiID09PSAncnVudGltZSdcIj5cbiAgICA8IS0tIFBsYWluIFRleHQgdGFiIChmb3JtLWJvdW5kIGxpa2UgTG9vcCBTdGVwIGVkaXRGb3JtICsgb25FZGl0Rm9ybUZpZWxkQ2hhbmdlKSAtLT5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYWN0aXZlVGFiID09PSAncGxhaW4tdGV4dCdcIj5cbiAgICAgIDxjcWEtY3VzdG9tLWlucHV0XG4gICAgICAgIGxhYmVsPVwiVmFsdWVcIlxuICAgICAgICBbdmFsdWVdPVwiZWRpdEZvcm0uZ2V0KCd2YWx1ZScpPy52YWx1ZSA/PyAnJ1wiXG4gICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvbkVkaXRGb3JtRmllbGRDaGFuZ2UoJ3ZhbHVlJywgJGV2ZW50KVwiXG4gICAgICAgIHBsYWNlaG9sZGVyPVwiaHR0cHM6Ly9leGFtcGxlLmNvbS9kYXNoYm9hcmRcIlxuICAgICAgICBbZnVsbFdpZHRoXT1cInRydWVcIlxuICAgICAgICBzaXplPVwibWRcIj5cbiAgICAgIDwvY3FhLWN1c3RvbS1pbnB1dD5cbiAgICAgIDxwIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLVsxOHB4XSBjcWEtdGV4dC1bIzBBMEEwQV0gY3FhLW0tMFwiPlxuICAgICAgICBFbnRlciBhIHN0YXRpYyB0ZXh0IHZhbHVlIHRoYXQgd29uJ3QgY2hhbmdlIGR1cmluZyBleGVjdXRpb24uXG4gICAgICA8L3A+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8IS0tIFBhcmFtZXRlciB0YWI6IFZhcmlhYmxlIExpYnJhcnkgLS0+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImFjdGl2ZVRhYiA9PT0gJ3BhcmFtZXRlcidcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0yIGNxYS1taW4taC0wIGNxYS1mbGV4LTEgY3FhLW1pbi1oLVsxOHJlbV1cIj5cbiAgICAgICAgPCEtLSBWYXJpYWJsZSBMaWJyYXJ5IGhlYWRlciAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtZmxleC1zaHJpbmstMFwiPlxuICAgICAgICAgIDxoMyBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMjBweF0gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtWyMxMTE4MjddIGNxYS1tLTBcIj5cbiAgICAgICAgICAgIFZhcmlhYmxlIExpYnJhcnlcbiAgICAgICAgICA8L2gzPlxuICAgICAgICAgIDxhIGhyZWY9XCIjXCIgKGNsaWNrKT1cIm9uQ3JlYXRlTmV3VmFyaWFibGUoJGV2ZW50KVwiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS10ZXh0LVsjM0Y0M0VFXSBjcWEtdGV4dC1bMTJweF0gY3FhLWxlYWRpbmctWzE4cHhdIGNxYS1mb250LW1lZGl1bSBjcWEtbm8tdW5kZXJsaW5lIGhvdmVyOmNxYS1vcGFjaXR5LTkwIGNxYS1jdXJzb3ItcG9pbnRlclwiPlxuICAgICAgICAgICAgQ3JlYXRlIE5ldyArXG4gICAgICAgICAgPC9hPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPCEtLSBGaWx0ZXIgdGFiczogQWxsLCBHbG9iYWwsIExvY2FsIChibHVlIHVuZGVybGluZSB1bmRlciBhY3RpdmUgbGFiZWwgb25seSkgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtdy1mdWxsIGNxYS1mbGV4LXNocmluay0wXCI+XG4gICAgICAgICAgPGJ1dHRvbiAqbmdGb3I9XCJsZXQgdGFiIG9mIHBhcmFtZXRlckZpbHRlclRhYnNcIiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIChjbGljayk9XCJvblBhcmFtZXRlclNjb3BlRmlsdGVyQ2hhbmdlKHRhYi52YWx1ZSlcIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1weS0wIGNxYS1weC0zIGNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMThweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS1iZy10cmFuc3BhcmVudCBjcWEtY3Vyc29yLXBvaW50ZXIgY3FhLXRyYW5zaXRpb24tY29sb3JzIGNxYS1mbGV4IGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtaXRlbXMtY2VudGVyXCJcbiAgICAgICAgICAgIFtjbGFzcy5jcWEtdGV4dC1bIzZCNzI4MF1dPVwicGFyYW1ldGVyU2NvcGVGaWx0ZXIgIT09IHRhYi52YWx1ZVwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGVzdC1kYXRhLXBhcmFtLWZpbHRlci1sYWJlbCBjcWEtaW5saW5lLWJsb2NrIGNxYS1wYi0wLjVcIlxuICAgICAgICAgICAgICBbY2xhc3MuY3FhLXRlc3QtZGF0YS1wYXJhbS1maWx0ZXItYWN0aXZlXT1cInBhcmFtZXRlclNjb3BlRmlsdGVyID09PSB0YWIudmFsdWVcIj5cbiAgICAgICAgICAgICAge3sgdGFiLmxhYmVsIH19XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8IS0tIFNlYXJjaDogYm91bmQgdG8gZWRpdEZvcm0gKHNhbWUgcGF0dGVybiBhcyBMb29wIFN0ZXAgY29udHJvbCBiaW5kaW5nKSAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4LXNocmluay0wIGNxYS1yZWxhdGl2ZSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtYWJzb2x1dGUgY3FhLWxlZnQtNCBjcWEtdG9wLTAgY3FhLWJvdHRvbS0wIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1wb2ludGVyLWV2ZW50cy1ub25lIGNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtbGVhZGluZy1ub25lXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCIhY3FhLXctNCAhY3FhLWgtNCAhY3FhLXRleHQtWzE2cHhdXCI+c2VhcmNoPC9tYXQtaWNvbj5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICBbdmFsdWVdPVwiZWRpdEZvcm0uZ2V0KCdwYXJhbWV0ZXJTZWFyY2hRdWVyeScpPy52YWx1ZSA/PyAnJ1wiXG4gICAgICAgICAgICAoaW5wdXQpPVwib25QYXJhbWV0ZXJTZWFyY2hJbnB1dCgkYW55KCRldmVudC50YXJnZXQpLnZhbHVlKVwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaCBsaWJyYXJ5XCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLXRlc3QtZGF0YS1zZWFyY2gtaW5wdXQgY3FhLXctZnVsbCBjcWEtcGwtMTAgY3FhLXByLTQgY3FhLXB5LTIuNSBjcWEtdGV4dC1zbSBjcWEtbGVhZGluZy01IGNxYS10ZXh0LVsjMEEwQTBBXSBwbGFjZWhvbGRlcjpjcWEtdGV4dC1bIzlDQTNBRl0gZm9jdXM6Y3FhLW91dGxpbmUtbm9uZSBmb2N1czpjcWEtYm9yZGVyLVsjM0I4MkY2XSBmb2N1czpjcWEtcmluZy0xIGZvY3VzOmNxYS1yaW5nLVsjM0I4MkY2XVwiXG4gICAgICAgICAgICBhcmlhLWxhYmVsPVwiU2VhcmNoIGxpYnJhcnlcIlxuICAgICAgICAgIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8IS0tIFBhcmFtZXRlciBsaXN0IChzY3JvbGxhYmxlLCBzZWFyY2gtaW50ZWdyYXRlZCB2aWEgZmlsdGVyZWQgbGlzdCBiaW5kaW5nKSAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1taW4taC1bMjAwcHhdIGNxYS1mbGV4LTEgY3FhLWZsZXggY3FhLWZsZXgtY29sXCI+XG4gICAgICAgICAgPGNxYS1pdGVtLWxpc3RcbiAgICAgICAgICAgIFtpdGVtc109XCJwYXJhbWV0ZXJMaXN0Q29uZmlnXCJcbiAgICAgICAgICAgIFtzZWxlY3RlZElkXT1cInNlbGVjdGVkUGFyYW1ldGVySWRcIlxuICAgICAgICAgICAgZW1wdHlNZXNzYWdlPVwiTm8gcGFyYW1ldGVycyBtYXRjaCB5b3VyIHNlYXJjaC5cIlxuICAgICAgICAgICAgW3Njcm9sbGFibGVdPVwidHJ1ZVwiXG4gICAgICAgICAgICAoaXRlbVNlbGVjdCk9XCJvblBhcmFtZXRlclNlbGVjdCgkZXZlbnQpXCJcbiAgICAgICAgICAgIChpdGVtRWRpdCk9XCJvblBhcmFtZXRlckVkaXQoJGV2ZW50KVwiPlxuICAgICAgICAgIDwvY3FhLWl0ZW0tbGlzdD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDwhLS0gRW52aXJvbm1lbnQgdGFiOiBWYXJpYWJsZSBsaWJyYXJ5IGJ5IGVudmlyb25tZW50IC0tPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhY3RpdmVUYWIgPT09ICdlbnZpcm9ubWVudCdcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0yIGNxYS1taW4taC0wIGNxYS1mbGV4LTEgY3FhLW1pbi1oLVsxOHJlbV1cIj5cbiAgICAgICAgPCEtLSBTZWN0aW9uIGhlYWRlciAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtZmxleC1zaHJpbmstMFwiPlxuICAgICAgICAgIDxoMyBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMjBweF0gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtWyMxMTE4MjddIGNxYS1tLTBcIj5cbiAgICAgICAgICAgIEVudmlyb25tZW50XG4gICAgICAgICAgPC9oMz5cbiAgICAgICAgICA8YSBocmVmPVwiI1wiIChjbGljayk9XCJvbkNyZWF0ZU5ld0Vudmlyb25tZW50KCRldmVudClcIlxuICAgICAgICAgICAgY2xhc3M9XCJjcWEtdGV4dC1bIzNGNDNFRV0gY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLVsxOHB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLW5vLXVuZGVybGluZSBob3ZlcjpjcWEtb3BhY2l0eS05MCBjcWEtY3Vyc29yLXBvaW50ZXJcIj5cbiAgICAgICAgICAgIENyZWF0ZSBOZXcgK1xuICAgICAgICAgIDwvYT5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDwhLS0gU2VhcmNoOiBib3VuZCB0byBlZGl0Rm9ybSAoc2FtZSBwYXR0ZXJuIGFzIExvb3AgU3RlcCBjb250cm9sIGJpbmRpbmcpIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXgtc2hyaW5rLTAgY3FhLXJlbGF0aXZlIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1hYnNvbHV0ZSBjcWEtbGVmdC00IGNxYS10b3AtMCBjcWEtYm90dG9tLTAgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtanVzdGlmeS1jZW50ZXIgY3FhLXBvaW50ZXItZXZlbnRzLW5vbmUgY3FhLXRleHQtWyM2QjcyODBdIGNxYS1sZWFkaW5nLW5vbmVcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIiFjcWEtdy00ICFjcWEtaC00ICFjcWEtdGV4dC1bMTZweF1cIj5zZWFyY2g8L21hdC1pY29uPlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgIFt2YWx1ZV09XCJlZGl0Rm9ybS5nZXQoJ2Vudmlyb25tZW50U2VhcmNoUXVlcnknKT8udmFsdWUgPz8gJydcIlxuICAgICAgICAgICAgKGlucHV0KT1cIm9uRW52aXJvbm1lbnRTZWFyY2hJbnB1dCgkYW55KCRldmVudC50YXJnZXQpLnZhbHVlKVwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaCBFbnZpcm9ubWVudFwiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS10ZXN0LWRhdGEtc2VhcmNoLWlucHV0IGNxYS13LWZ1bGwgY3FhLXBsLTEwIGNxYS1wci00IGNxYS1weS0yLjUgY3FhLXRleHQtc20gY3FhLWxlYWRpbmctNSBjcWEtdGV4dC1bIzBBMEEwQV0gcGxhY2Vob2xkZXI6Y3FhLXRleHQtWyM5Q0EzQUZdIGZvY3VzOmNxYS1vdXRsaW5lLW5vbmUgZm9jdXM6Y3FhLWJvcmRlci1bIzNCODJGNl0gZm9jdXM6Y3FhLXJpbmctMSBmb2N1czpjcWEtcmluZy1bIzNCODJGNl1cIlxuICAgICAgICAgICAgYXJpYS1sYWJlbD1cIlNlYXJjaCBFbnZpcm9ubWVudFwiXG4gICAgICAgICAgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDwhLS0gRW52aXJvbm1lbnQgbGlzdCAoc2Nyb2xsYWJsZSwgc2VhcmNoLWludGVncmF0ZWQgdmlhIGZpbHRlcmVkIGxpc3QgYmluZGluZykgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtbWluLWgtWzIyMHB4XSBjcWEtZmxleC0xIGNxYS1mbGV4IGNxYS1mbGV4LWNvbFwiPlxuICAgICAgICAgIDxjcWEtaXRlbS1saXN0XG4gICAgICAgICAgICBbaXRlbXNdPVwiZW52aXJvbm1lbnRMaXN0Q29uZmlnXCJcbiAgICAgICAgICAgIFtzZWxlY3RlZElkXT1cInNlbGVjdGVkRW52aXJvbm1lbnRJZFwiXG4gICAgICAgICAgICBlbXB0eU1lc3NhZ2U9XCJObyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgbWF0Y2ggeW91ciBzZWFyY2guXCJcbiAgICAgICAgICAgIFtzY3JvbGxhYmxlXT1cInRydWVcIlxuICAgICAgICAgICAgKGl0ZW1TZWxlY3QpPVwib25FbnZpcm9ubWVudFNlbGVjdCgkZXZlbnQpXCJcbiAgICAgICAgICAgIChpdGVtRWRpdCk9XCJvbkVudmlyb25tZW50RWRpdCgkZXZlbnQpXCI+XG4gICAgICAgICAgPC9jcWEtaXRlbS1saXN0PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPCEtLSBSdW50aW1lIHRhYjogZHluYW1pYyB2YWx1ZSBpbmplY3RvciAtLT5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYWN0aXZlVGFiID09PSAncnVudGltZSdcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0zIGNxYS1taW4taC0wIGNxYS1oLWZ1bGwgY3FhLW92ZXJmbG93LXktYXV0b1wiPlxuICAgICAgICA8aDMgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWxlYWRpbmctWzIwcHhdIGNxYS1mb250LXNlbWlib2xkIGNxYS10ZXh0LVsjMTExODI3XSBjcWEtbS0wIGNxYS1mbGV4LXNocmluay0wXCI+XG4gICAgICAgICAgUnVudGltZVxuICAgICAgICA8L2gzPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXgtc2hyaW5rLTBcIj5cbiAgICAgICAgICA8Y3FhLWN1c3RvbS1pbnB1dFxuICAgICAgICAgICAgW3ZhbHVlXT1cImVkaXRGb3JtLmdldCgncnVudGltZVZhbHVlJyk/LnZhbHVlID8/ICcnXCJcbiAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvbkVkaXRGb3JtRmllbGRDaGFuZ2UoJ3J1bnRpbWVWYWx1ZScsICRldmVudClcIlxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJpbnB1dCB0ZXh0XCJcbiAgICAgICAgICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgICAgICAgICBzaXplPVwibWRcIj5cbiAgICAgICAgICA8L2NxYS1jdXN0b20taW5wdXQ+XG4gICAgICAgICAgPHAgY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLWxlYWRpbmctWzE4cHhdIGNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtbXQtMS41IGNxYS1tYi0wXCI+XG4gICAgICAgICAgICBWYWx1ZXMgcmVzb2x2ZWQgZHVyaW5nIHRlc3QgZXhlY3V0aW9uIGJhc2VkIG9uIHNlc3Npb24gYW5kIHN0ZXAgc3RhdGUuXG4gICAgICAgICAgPC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPCEtLSBSZWNvbW1lbmRlZDogc3VnZ2VzdGlvbiBjaGlwcyAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTIgY3FhLWZsZXgtc2hyaW5rLTBcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTEuNVwiPlxuICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiIWNxYS13LTQgIWNxYS1oLTQgIWNxYS10ZXh0LVsxNnB4XSBjcWEtdGV4dC1bIzlDQTNBRl1cIiBhcmlhLWhpZGRlbj1cInRydWVcIj5zY2hlZHVsZTwvbWF0LWljb24+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtbGVhZGluZy1bMThweF0gY3FhLWZvbnQtbWVkaXVtIGNxYS10ZXh0LVsjMzc0MTUxXVwiPlJlY29tbWVuZGVkPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtdGVzdC1kYXRhLXJ1bnRpbWUtY2hpcHMtc2Nyb2xsIGNxYS1mbGV4IGNxYS1nYXAtMiBjcWEtb3ZlcmZsb3cteC1hdXRvIGNxYS1taW4tdy0wIGNxYS1wYi0xXCI+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBzbmlwcGV0IG9mIHJ1bnRpbWVTdWdnZXN0ZWRWYWx1ZXNcIlxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uUnVudGltZUNoaXBJbnNlcnQoc25pcHBldClcIlxuICAgICAgICAgICAgICBjbGFzcz1cImNxYS1mbGV4LXNocmluay0wIGNxYS1weC0zIGNxYS1weS0xLjUgY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLVsxOHB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyMzNzQxNTFdIGNxYS1iZy1bI0YzRjRGNl0gY3FhLXJvdW5kZWQtZnVsbCBob3ZlcjpjcWEtYmctWyNFNUU3RUJdIGZvY3VzOmNxYS1vdXRsaW5lLW5vbmUgZm9jdXMtdmlzaWJsZTpjcWEtcmluZy0yIGZvY3VzLXZpc2libGU6Y3FhLXJpbmctWyMzRjQzRUVdIGNxYS10cmFuc2l0aW9uLWNvbG9ycyBjcWEtd2hpdGVzcGFjZS1ub3dyYXBcIj5cbiAgICAgICAgICAgICAge3sgc25pcHBldCB9fVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuXG4gIDwhLS0gTGluZSBiZWxvdyBjb250ZW50IChmdWxsIHdpZHRoIG9mIG1vZGFsLCBubyBzaWRlIG1hcmdpbikgLS0+XG4gIDxkaXYgY2xhc3M9XCJjcWEtLW14LTIgY3FhLXctW2NhbGMoMTAwJSsxcmVtKV0gY3FhLWZsZXgtc2hyaW5rLTBcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWgtcHggY3FhLXctZnVsbCBjcWEtYmctWyNFNUU3RUJdXCIgcm9sZT1cInByZXNlbnRhdGlvblwiPjwvZGl2PlxuICA8L2Rpdj5cblxuICA8IS0tIEZvb3RlcjogQ2FuY2VsLCBBcHBseSAoZnVsbCB3aWR0aCBpbiBvbmUgcm93KSAtLT5cbiAgPGRpdiBjbGFzcz1cImNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTNcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLXN0cmV0Y2ggY3FhLWdhcC0yIGNxYS13LWZ1bGxcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZmxleC0xIGNxYS1taW4tdy0wXCI+XG4gICAgICAgIDxjcWEtYnV0dG9uIHZhcmlhbnQ9XCJvdXRsaW5lZFwiIGJ0blNpemU9XCJsZ1wiIFt0ZXh0XT1cIidDYW5jZWwnXCIgW2Z1bGxXaWR0aF09XCJ0cnVlXCIgKGNsaWNrZWQpPVwib25DYW5jZWwoKVwiXG4gICAgICAgICAgW2N1c3RvbUNsYXNzXT1cIidjcWEtdGV4dC1bMTJweF0gY3FhLXB5LVs5cHhdIGNxYS1ib3JkZXItWyM0MTQxNDZdJ1wiPjwvY3FhLWJ1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1mbGV4LTEgY3FhLW1pbi13LTBcIj5cbiAgICAgICAgPGNxYS1idXR0b24gdmFyaWFudD1cImZpbGxlZFwiIGJ0blNpemU9XCJsZ1wiIFt0ZXh0XT1cIidBcHBseSdcIiBbZnVsbFdpZHRoXT1cInRydWVcIiAoY2xpY2tlZCk9XCJvbkFwcGx5KClcIlxuICAgICAgICAgIFtjdXN0b21DbGFzc109XCInY3FhLXRleHQtWzEycHhdIGNxYS1weS1bOXB4XSBjcWEtYm9yZGVyLVsjM0Y0M0VFXSdcIj48L2NxYS1idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8YSBocmVmPVwiI1wiIChjbGljayk9XCJvbkVkaXRJbkRlcHRoKCRldmVudClcIlxuICAgICAgY2xhc3M9XCJjcWEtdGV4dC1bIzNGNDNFRV0gY3FhLXRleHQtWzEycHhdIGNxYS1sZWFkaW5nLVsxOHB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTEuNSBjcWEtbm8tdW5kZXJsaW5lIGhvdmVyOmNxYS1uby11bmRlcmxpbmUgY3FhLXNlbGYtY2VudGVyXCI+XG4gICAgICA8bWF0LWljb24gY2xhc3M9XCIhY3FhLXctNCAhY3FhLWgtNCAhY3FhLXRleHQtWzE2cHhdXCI+b3Blbl9pbl9uZXc8L21hdC1pY29uPlxuICAgICAgRWRpdCBpbiBkZXB0aCAob3BlbiBkZXRhaWxlZCByaWdodCBwYW5lbClcbiAgICA8L2E+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
|