http-request-manager 19.0.0 → 19.2.5
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/README.md +585 -300
- package/fesm2022/http-request-manager.mjs +9434 -3133
- package/fesm2022/http-request-manager.mjs.map +1 -1
- package/package.json +7 -9
- package/types/http-request-manager.d.ts +3546 -0
- package/esm2022/http-request-manager.mjs +0 -5
- package/esm2022/lib/http-request-manager.module.mjs +0 -186
- package/esm2022/lib/http-request-services-demo/database-data-demo/database-data-demo.component.mjs +0 -71
- package/esm2022/lib/http-request-services-demo/http-request-services-demo.component.mjs +0 -45
- package/esm2022/lib/http-request-services-demo/local-storage-demo/local-storage-demo.component.mjs +0 -173
- package/esm2022/lib/http-request-services-demo/local-storage-signals-demo/local-storage-signals-demo.component.mjs +0 -184
- package/esm2022/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.mjs +0 -80
- package/esm2022/lib/http-request-services-demo/request-manager-demo/file-downloader/file-download.module.mjs +0 -42
- package/esm2022/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.mjs +0 -88
- package/esm2022/lib/http-request-services-demo/request-manager-demo/file-downloader/models/download-labels-model.mjs +0 -11
- package/esm2022/lib/http-request-services-demo/request-manager-demo/file-downloader/spinner/spinner.component.mjs +0 -29
- package/esm2022/lib/http-request-services-demo/request-manager-demo/models/sample-ai-prompt.mjs +0 -9
- package/esm2022/lib/http-request-services-demo/request-manager-demo/models/sample-client-info.mjs +0 -12
- package/esm2022/lib/http-request-services-demo/request-manager-demo/models/sample-mapper-client-info.mjs +0 -14
- package/esm2022/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.mjs +0 -315
- package/esm2022/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.mjs +0 -270
- package/esm2022/lib/http-request-services-demo/request-manager-state-demo/services/state-manager-demo.service.mjs +0 -67
- package/esm2022/lib/http-request-services-demo/request-signals-manager-demo/models/sample-ai-prompt.mjs +0 -9
- package/esm2022/lib/http-request-services-demo/request-signals-manager-demo/models/sample-client-info.mjs +0 -12
- package/esm2022/lib/http-request-services-demo/request-signals-manager-demo/models/sample-mapper-client-info.mjs +0 -14
- package/esm2022/lib/http-request-services-demo/request-signals-manager-demo/request-signals-manager-demo.component.mjs +0 -336
- package/esm2022/lib/index.mjs +0 -4
- package/esm2022/lib/interceptors/credentials.interceptor.mjs +0 -14
- package/esm2022/lib/interceptors/index.mjs +0 -5
- package/esm2022/lib/interceptors/models/error-settings.model.mjs +0 -10
- package/esm2022/lib/interceptors/proxy-debugger.interceptor.mjs +0 -47
- package/esm2022/lib/interceptors/request-error.interceptor.mjs +0 -49
- package/esm2022/lib/interceptors/request-header.interceptor.mjs +0 -41
- package/esm2022/lib/models/config-http-options.model.mjs +0 -18
- package/esm2022/lib/models/config-local-storage-options.model.mjs +0 -12
- package/esm2022/lib/models/config-options.model.mjs +0 -12
- package/esm2022/lib/models/config-token.model.mjs +0 -8
- package/esm2022/lib/models/data-type.enum.mjs +0 -7
- package/esm2022/lib/models/database-storage.model.mjs +0 -10
- package/esm2022/lib/models/index.mjs +0 -7
- package/esm2022/lib/models/retry-options.model.mjs +0 -10
- package/esm2022/lib/services/database-manager-services/database.manager.service.mjs +0 -119
- package/esm2022/lib/services/database-manager-services/db.storage.service.mjs +0 -143
- package/esm2022/lib/services/database-manager-services/index.mjs +0 -4
- package/esm2022/lib/services/database-manager-services/models/table-schema.mjs +0 -20
- package/esm2022/lib/services/index.mjs +0 -6
- package/esm2022/lib/services/local-storage-manager-service/index.mjs +0 -4
- package/esm2022/lib/services/local-storage-manager-service/local-storage-manager.service.mjs +0 -302
- package/esm2022/lib/services/local-storage-manager-service/local-storage-signals-manager.service.mjs +0 -277
- package/esm2022/lib/services/local-storage-manager-service/models/global-store-options.model.mjs +0 -13
- package/esm2022/lib/services/local-storage-manager-service/models/index.mjs +0 -6
- package/esm2022/lib/services/local-storage-manager-service/models/setting-options.model.mjs +0 -17
- package/esm2022/lib/services/local-storage-manager-service/models/storage-data.model.mjs +0 -10
- package/esm2022/lib/services/local-storage-manager-service/models/storage-option.model.mjs +0 -12
- package/esm2022/lib/services/local-storage-manager-service/models/storage-type.enum.mjs +0 -7
- package/esm2022/lib/services/request-manager-services/http-manager-signals.service.mjs +0 -199
- package/esm2022/lib/services/request-manager-services/http-manager.service.mjs +0 -207
- package/esm2022/lib/services/request-manager-services/index.mjs +0 -6
- package/esm2022/lib/services/request-manager-services/request-signals.service.mjs +0 -170
- package/esm2022/lib/services/request-manager-services/request.service.mjs +0 -191
- package/esm2022/lib/services/request-manager-services/rxjs-operators/countdown.mjs +0 -9
- package/esm2022/lib/services/request-manager-services/rxjs-operators/delay-retry.mjs +0 -10
- package/esm2022/lib/services/request-manager-services/rxjs-operators/index.mjs +0 -5
- package/esm2022/lib/services/request-manager-services/rxjs-operators/request-polling.mjs +0 -33
- package/esm2022/lib/services/request-manager-services/rxjs-operators/request-streaming.mjs +0 -19
- package/esm2022/lib/services/request-manager-state-service/http-manager-state.store.mjs +0 -360
- package/esm2022/lib/services/request-manager-state-service/index.mjs +0 -3
- package/esm2022/lib/services/request-manager-state-service/models/api-request.model.mjs +0 -21
- package/esm2022/lib/services/request-manager-state-service/models/index.mjs +0 -3
- package/esm2022/lib/services/request-manager-state-service/models/request-options.model.mjs +0 -10
- package/esm2022/lib/services/request-manager-state-service/models/ws-options.model.mjs +0 -12
- package/esm2022/lib/services/utils/app.service.mjs +0 -26
- package/esm2022/lib/services/utils/encryption/asymmetrical-encryption.service.mjs +0 -186
- package/esm2022/lib/services/utils/encryption/encryption-test.service.mjs +0 -35
- package/esm2022/lib/services/utils/encryption/index.mjs +0 -4
- package/esm2022/lib/services/utils/encryption/random.mjs +0 -52
- package/esm2022/lib/services/utils/encryption/symmetrical-encryption.service.mjs +0 -77
- package/esm2022/lib/services/utils/headers.service.mjs +0 -21
- package/esm2022/lib/services/utils/index.mjs +0 -6
- package/esm2022/lib/services/utils/object-merger.service.mjs +0 -70
- package/esm2022/lib/services/utils/path-query.service.mjs +0 -54
- package/esm2022/lib/services/utils/utils.service.mjs +0 -155
- package/esm2022/lib/services/ws-manager-service/models/assortment-data.model.mjs +0 -10
- package/esm2022/lib/services/ws-manager-service/websocket.service.mjs +0 -133
- package/esm2022/public-api.mjs +0 -11
- package/http-request-manager-19.0.0.tgz +0 -0
- package/index.d.ts +0 -5
- package/lib/http-request-manager.module.d.ts +0 -35
- package/lib/http-request-services-demo/database-data-demo/database-data-demo.component.d.ts +0 -19
- package/lib/http-request-services-demo/http-request-services-demo.component.d.ts +0 -32
- package/lib/http-request-services-demo/local-storage-demo/local-storage-demo.component.d.ts +0 -56
- package/lib/http-request-services-demo/local-storage-signals-demo/local-storage-signals-demo.component.d.ts +0 -55
- package/lib/http-request-services-demo/request-manager-demo/file-downloader/download-file/download-file.component.d.ts +0 -26
- package/lib/http-request-services-demo/request-manager-demo/file-downloader/file-download.module.d.ts +0 -13
- package/lib/http-request-services-demo/request-manager-demo/file-downloader/file-downloader.component.d.ts +0 -27
- package/lib/http-request-services-demo/request-manager-demo/file-downloader/models/download-labels-model.d.ts +0 -12
- package/lib/http-request-services-demo/request-manager-demo/file-downloader/spinner/spinner.component.d.ts +0 -16
- package/lib/http-request-services-demo/request-manager-demo/models/sample-ai-prompt.d.ts +0 -8
- package/lib/http-request-services-demo/request-manager-demo/models/sample-client-info.d.ts +0 -14
- package/lib/http-request-services-demo/request-manager-demo/models/sample-mapper-client-info.d.ts +0 -14
- package/lib/http-request-services-demo/request-manager-demo/request-manager-demo.component.d.ts +0 -107
- package/lib/http-request-services-demo/request-manager-state-demo/request-manager-state-demo.component.d.ts +0 -122
- package/lib/http-request-services-demo/request-manager-state-demo/services/state-manager-demo.service.d.ts +0 -15
- package/lib/http-request-services-demo/request-signals-manager-demo/models/sample-ai-prompt.d.ts +0 -8
- package/lib/http-request-services-demo/request-signals-manager-demo/models/sample-client-info.d.ts +0 -14
- package/lib/http-request-services-demo/request-signals-manager-demo/models/sample-mapper-client-info.d.ts +0 -14
- package/lib/http-request-services-demo/request-signals-manager-demo/request-signals-manager-demo.component.d.ts +0 -106
- package/lib/index.d.ts +0 -3
- package/lib/interceptors/credentials.interceptor.d.ts +0 -8
- package/lib/interceptors/index.d.ts +0 -4
- package/lib/interceptors/models/error-settings.model.d.ts +0 -10
- package/lib/interceptors/proxy-debugger.interceptor.d.ts +0 -12
- package/lib/interceptors/request-error.interceptor.d.ts +0 -10
- package/lib/interceptors/request-header.interceptor.d.ts +0 -15
- package/lib/models/config-http-options.model.d.ts +0 -21
- package/lib/models/config-local-storage-options.model.d.ts +0 -13
- package/lib/models/config-options.model.d.ts +0 -12
- package/lib/models/config-token.model.d.ts +0 -8
- package/lib/models/data-type.enum.d.ts +0 -5
- package/lib/models/database-storage.model.d.ts +0 -10
- package/lib/models/index.d.ts +0 -6
- package/lib/models/retry-options.model.d.ts +0 -10
- package/lib/services/database-manager-services/database.manager.service.d.ts +0 -31
- package/lib/services/database-manager-services/db.storage.service.d.ts +0 -26
- package/lib/services/database-manager-services/index.d.ts +0 -3
- package/lib/services/database-manager-services/models/table-schema.d.ts +0 -11
- package/lib/services/index.d.ts +0 -4
- package/lib/services/local-storage-manager-service/index.d.ts +0 -3
- package/lib/services/local-storage-manager-service/local-storage-manager.service.d.ts +0 -86
- package/lib/services/local-storage-manager-service/local-storage-signals-manager.service.d.ts +0 -64
- package/lib/services/local-storage-manager-service/models/global-store-options.model.d.ts +0 -15
- package/lib/services/local-storage-manager-service/models/index.d.ts +0 -5
- package/lib/services/local-storage-manager-service/models/setting-options.model.d.ts +0 -15
- package/lib/services/local-storage-manager-service/models/storage-data.model.d.ts +0 -10
- package/lib/services/local-storage-manager-service/models/storage-option.model.d.ts +0 -13
- package/lib/services/local-storage-manager-service/models/storage-type.enum.d.ts +0 -5
- package/lib/services/request-manager-services/http-manager-signals.service.d.ts +0 -38
- package/lib/services/request-manager-services/http-manager.service.d.ts +0 -41
- package/lib/services/request-manager-services/index.d.ts +0 -4
- package/lib/services/request-manager-services/request-signals.service.d.ts +0 -26
- package/lib/services/request-manager-services/request.service.d.ts +0 -28
- package/lib/services/request-manager-services/rxjs-operators/countdown.d.ts +0 -2
- package/lib/services/request-manager-services/rxjs-operators/delay-retry.d.ts +0 -2
- package/lib/services/request-manager-services/rxjs-operators/index.d.ts +0 -4
- package/lib/services/request-manager-services/rxjs-operators/request-polling.d.ts +0 -2
- package/lib/services/request-manager-services/rxjs-operators/request-streaming.d.ts +0 -2
- package/lib/services/request-manager-state-service/http-manager-state.store.d.ts +0 -64
- package/lib/services/request-manager-state-service/index.d.ts +0 -2
- package/lib/services/request-manager-state-service/models/api-request.model.d.ts +0 -30
- package/lib/services/request-manager-state-service/models/index.d.ts +0 -2
- package/lib/services/request-manager-state-service/models/request-options.model.d.ts +0 -10
- package/lib/services/request-manager-state-service/models/ws-options.model.d.ts +0 -14
- package/lib/services/utils/app.service.d.ts +0 -8
- package/lib/services/utils/encryption/asymmetrical-encryption.service.d.ts +0 -17
- package/lib/services/utils/encryption/encryption-test.service.d.ts +0 -10
- package/lib/services/utils/encryption/index.d.ts +0 -3
- package/lib/services/utils/encryption/random.d.ts +0 -7
- package/lib/services/utils/encryption/symmetrical-encryption.service.d.ts +0 -14
- package/lib/services/utils/headers.service.d.ts +0 -10
- package/lib/services/utils/index.d.ts +0 -5
- package/lib/services/utils/object-merger.service.d.ts +0 -14
- package/lib/services/utils/path-query.service.d.ts +0 -11
- package/lib/services/utils/utils.service.d.ts +0 -24
- package/lib/services/ws-manager-service/models/assortment-data.model.d.ts +0 -10
- package/lib/services/ws-manager-service/websocket.service.d.ts +0 -21
- package/public-api.d.ts +0 -7
|
@@ -1,270 +0,0 @@
|
|
|
1
|
-
import { Component, ViewChild, inject } from '@angular/core';
|
|
2
|
-
import { StateManagerDemoService } from './services/state-manager-demo.service';
|
|
3
|
-
import { FormBuilder, Validators } from '@angular/forms';
|
|
4
|
-
import { BehaviorSubject, EMPTY, map, tap, catchError, throwError } from 'rxjs';
|
|
5
|
-
import { ClientInfo } from '../request-manager-demo/models/sample-client-info';
|
|
6
|
-
import { ClientInfoMapper } from '../request-manager-demo/models/sample-mapper-client-info';
|
|
7
|
-
import { AIPrompt } from '../request-manager-demo/models/sample-ai-prompt';
|
|
8
|
-
import { DataType } from '../../models';
|
|
9
|
-
import { DatabaseStorage } from '../../models/database-storage.model';
|
|
10
|
-
import { HTTPManagerService, ApiRequest } from '../../services';
|
|
11
|
-
import * as i0 from "@angular/core";
|
|
12
|
-
import * as i1 from "@angular/common";
|
|
13
|
-
import * as i2 from "@angular/forms";
|
|
14
|
-
import * as i3 from "@angular/material/button";
|
|
15
|
-
import * as i4 from "@angular/material/form-field";
|
|
16
|
-
import * as i5 from "@angular/material/select";
|
|
17
|
-
import * as i6 from "@angular/material/core";
|
|
18
|
-
import * as i7 from "@angular/material/icon";
|
|
19
|
-
import * as i8 from "@angular/material/table";
|
|
20
|
-
import * as i9 from "@angular/material/progress-bar";
|
|
21
|
-
import * as i10 from "@angular/material/slide-toggle";
|
|
22
|
-
import * as i11 from "@angular/material/divider";
|
|
23
|
-
import * as i12 from "@angular/material/input";
|
|
24
|
-
export class RequestManagerStateDemoComponent {
|
|
25
|
-
get dataObservable$() {
|
|
26
|
-
switch (this.requestType) {
|
|
27
|
-
case 'GET':
|
|
28
|
-
return this.GET$;
|
|
29
|
-
case 'PUT':
|
|
30
|
-
return this.PUT$;
|
|
31
|
-
case 'POST':
|
|
32
|
-
return this.POST$;
|
|
33
|
-
case 'DELETE':
|
|
34
|
-
return this.DELETE$;
|
|
35
|
-
case 'STREAM':
|
|
36
|
-
return this.STREAM;
|
|
37
|
-
case 'STREAM_AI':
|
|
38
|
-
return this.STREAM_AI;
|
|
39
|
-
default:
|
|
40
|
-
return this.GET$;
|
|
41
|
-
break;
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
get hasChanged() {
|
|
45
|
-
return this.requestForm.dirty || this.requestForm.untouched;
|
|
46
|
-
}
|
|
47
|
-
get dataType() {
|
|
48
|
-
return this.requestForm.get("datatype")?.value;
|
|
49
|
-
}
|
|
50
|
-
get database() {
|
|
51
|
-
return this.requestForm.get("database")?.value;
|
|
52
|
-
}
|
|
53
|
-
get retry() {
|
|
54
|
-
return this.requestForm.get("retry")?.value;
|
|
55
|
-
}
|
|
56
|
-
get headers() {
|
|
57
|
-
return this.requestForm.get('headers');
|
|
58
|
-
}
|
|
59
|
-
get isValid() {
|
|
60
|
-
this.requestForm.markAllAsTouched();
|
|
61
|
-
return this.requestForm.valid;
|
|
62
|
-
}
|
|
63
|
-
constructor() {
|
|
64
|
-
this.stateManagerDemoService = inject(StateManagerDemoService);
|
|
65
|
-
this.displayedColumns = ['id', 'name', 'lastName', 'age'];
|
|
66
|
-
this.fb = inject(FormBuilder);
|
|
67
|
-
this.httpManagerService = inject(HTTPManagerService);
|
|
68
|
-
this.isPending$ = this.stateManagerDemoService.isPending$;
|
|
69
|
-
this.error$ = this.stateManagerDemoService.error$;
|
|
70
|
-
this.countdown$ = this.httpManagerService.countdown$;
|
|
71
|
-
this.GET_error$ = new BehaviorSubject('');
|
|
72
|
-
this.POST_error$ = new BehaviorSubject('');
|
|
73
|
-
this.PUT_error$ = new BehaviorSubject('');
|
|
74
|
-
this.DELETE_error$ = new BehaviorSubject('');
|
|
75
|
-
this.STREAM_error$ = new BehaviorSubject('');
|
|
76
|
-
this.STREAM_AI_error$ = new BehaviorSubject('');
|
|
77
|
-
this.GET$ = new BehaviorSubject(null);
|
|
78
|
-
this.POST$ = new BehaviorSubject(null);
|
|
79
|
-
this.PUT$ = new BehaviorSubject(null);
|
|
80
|
-
this.DELETE$ = new BehaviorSubject(null);
|
|
81
|
-
this.STREAM = new BehaviorSubject(null);
|
|
82
|
-
this.STREAM$ = this.STREAM.asObservable();
|
|
83
|
-
this.STREAM_AI = new BehaviorSubject([]);
|
|
84
|
-
this.STREAM_AI$ = this.STREAM_AI.asObservable()
|
|
85
|
-
.pipe(map((items) => (items) ? items.map((item) => item.response) : []), map((items) => items.join('\n').trim()));
|
|
86
|
-
this.questionControl = this.fb.control("", [Validators.required]);
|
|
87
|
-
this.requestType = '';
|
|
88
|
-
this.prompts = [];
|
|
89
|
-
this.AIType = 0;
|
|
90
|
-
this.sampleClientData = {
|
|
91
|
-
id: 0,
|
|
92
|
-
name: "Old School Dates",
|
|
93
|
-
domain: "osd.com",
|
|
94
|
-
service: "osd",
|
|
95
|
-
spiffe: "osd.com/osd",
|
|
96
|
-
secret: "SMOPECXP-OS4P-USOG-X2II-3XMD1FQDR3IJX",
|
|
97
|
-
created: 1693003138,
|
|
98
|
-
modified: 1693003138,
|
|
99
|
-
icon: "",
|
|
100
|
-
imageFile: "",
|
|
101
|
-
};
|
|
102
|
-
this.selectedRecord = this.fb.control(null);
|
|
103
|
-
this.requestForm = this.fb.group({
|
|
104
|
-
datatype: this.fb.control('ARRAY'),
|
|
105
|
-
path: this.fb.control("ai/"),
|
|
106
|
-
headers: this.fb.array([]),
|
|
107
|
-
adapter: [null],
|
|
108
|
-
mapper: [null],
|
|
109
|
-
retry: this.fb.group({
|
|
110
|
-
times: [3],
|
|
111
|
-
delay: [3],
|
|
112
|
-
}),
|
|
113
|
-
polling: [3],
|
|
114
|
-
database: this.fb.group({
|
|
115
|
-
table: [''],
|
|
116
|
-
expiresIn: ['1m'],
|
|
117
|
-
})
|
|
118
|
-
});
|
|
119
|
-
this.sampleAdaptors = [
|
|
120
|
-
{ label: "ClientInfo Basic", value: ClientInfo.adapt },
|
|
121
|
-
{ label: "AI Prompt", value: AIPrompt.adapt },
|
|
122
|
-
];
|
|
123
|
-
this.sampleMappers = [
|
|
124
|
-
{ label: "Mapper Basic", value: ClientInfoMapper.adapt },
|
|
125
|
-
{ label: "AI Prompt", value: AIPrompt.adapt },
|
|
126
|
-
];
|
|
127
|
-
// server = `http://sample-endpoint/as/authorization.oauth2`
|
|
128
|
-
this.arrayObjectsToObjects = (arr) => {
|
|
129
|
-
return Array.isArray(arr) ? arr.reduce((obj, item) => Object.assign(obj, { [item.key]: item.value }), {}) : {};
|
|
130
|
-
};
|
|
131
|
-
this.props = (adapter) => {
|
|
132
|
-
return (adapter) ? adapter() : null;
|
|
133
|
-
};
|
|
134
|
-
}
|
|
135
|
-
ngOnInit() {
|
|
136
|
-
this.stateManagerDemoService.data$.pipe(tap((data) => console.log("API STREAM_AI response", data)));
|
|
137
|
-
this.error$.pipe(tap((data) => {
|
|
138
|
-
debugger;
|
|
139
|
-
console.log("API STREAM response", data);
|
|
140
|
-
}), catchError(error => {
|
|
141
|
-
return throwError(() => this.errorHandling(error, 'STREAM'));
|
|
142
|
-
}));
|
|
143
|
-
this.selectedRecord.valueChanges
|
|
144
|
-
.subscribe((data) => {
|
|
145
|
-
this.selectedRecord$ = (data) ? this.stateManagerDemoService.selectRecord$(data.id) : EMPTY;
|
|
146
|
-
});
|
|
147
|
-
this.stateManagerDemoService.data$
|
|
148
|
-
.pipe(tap((data) => {
|
|
149
|
-
switch (this.requestType) {
|
|
150
|
-
case 'GET':
|
|
151
|
-
this.GET$.next(data);
|
|
152
|
-
break;
|
|
153
|
-
case 'PUT':
|
|
154
|
-
this.PUT$.next(data);
|
|
155
|
-
break;
|
|
156
|
-
case 'POST':
|
|
157
|
-
this.POST$.next(data);
|
|
158
|
-
break;
|
|
159
|
-
case 'DELETE':
|
|
160
|
-
this.DELETE$.next(data);
|
|
161
|
-
break;
|
|
162
|
-
case 'STREAM':
|
|
163
|
-
this.STREAM.next(data);
|
|
164
|
-
break;
|
|
165
|
-
case 'STREAM_AI':
|
|
166
|
-
this.STREAM_AI.next(data);
|
|
167
|
-
break;
|
|
168
|
-
default:
|
|
169
|
-
break;
|
|
170
|
-
}
|
|
171
|
-
})).subscribe();
|
|
172
|
-
}
|
|
173
|
-
addHeader() {
|
|
174
|
-
const header = this.fb.group({
|
|
175
|
-
key: ['', Validators.required],
|
|
176
|
-
value: ['']
|
|
177
|
-
});
|
|
178
|
-
this.headers.push(header);
|
|
179
|
-
}
|
|
180
|
-
removeHeader(index) {
|
|
181
|
-
this.headers.removeAt(index);
|
|
182
|
-
}
|
|
183
|
-
compileRequest() {
|
|
184
|
-
const requestParams = this.requestForm.value;
|
|
185
|
-
requestParams.headers = this.arrayObjectsToObjects(requestParams.headers || []);
|
|
186
|
-
const pathReq = (requestParams.path === "") ? [] : (requestParams.path || "").split("/");
|
|
187
|
-
if (!this.pollingState.checked)
|
|
188
|
-
requestParams.polling = 0;
|
|
189
|
-
if (!this.failedState.checked) {
|
|
190
|
-
requestParams.retry = { times: 0, delay: 0 };
|
|
191
|
-
}
|
|
192
|
-
const currentOptions = ApiRequest.adapt(requestParams);
|
|
193
|
-
currentOptions.path = [];
|
|
194
|
-
const apiOptions = ApiRequest.adapt({ ...currentOptions, path: pathReq });
|
|
195
|
-
return { apiOptions: apiOptions, path: pathReq };
|
|
196
|
-
}
|
|
197
|
-
onSetStateOptions() {
|
|
198
|
-
if (!this.isValid)
|
|
199
|
-
return;
|
|
200
|
-
const reqParams = this.compileRequest();
|
|
201
|
-
const db = DatabaseStorage.adapt(this.database);
|
|
202
|
-
const type = this.dataType === "ARRAY" ? DataType.ARRAY : DataType.OBJECT;
|
|
203
|
-
this.stateManagerDemoService.setAPIOptions(reqParams.apiOptions, type, db);
|
|
204
|
-
this.requestForm.markAsPristine();
|
|
205
|
-
}
|
|
206
|
-
onClearRecords() {
|
|
207
|
-
this.stateManagerDemoService.clearRecords();
|
|
208
|
-
}
|
|
209
|
-
onRefreshRecords() {
|
|
210
|
-
this.stateManagerDemoService.refreshData();
|
|
211
|
-
}
|
|
212
|
-
onGetRequest() {
|
|
213
|
-
this.requestType = 'GET';
|
|
214
|
-
this.stateManagerDemoService.getClients();
|
|
215
|
-
}
|
|
216
|
-
onCreateRequest() {
|
|
217
|
-
this.requestType = 'POST';
|
|
218
|
-
this.stateManagerDemoService.createClient(this.sampleClientData);
|
|
219
|
-
}
|
|
220
|
-
onUpdateRequest() {
|
|
221
|
-
this.requestType = 'PUT';
|
|
222
|
-
this.stateManagerDemoService.updateClient(this.sampleClientData);
|
|
223
|
-
}
|
|
224
|
-
onDeleteRequest() {
|
|
225
|
-
this.requestType = 'DELETE';
|
|
226
|
-
this.stateManagerDemoService.deleteClient(this.sampleClientData);
|
|
227
|
-
}
|
|
228
|
-
onStreamRequest() {
|
|
229
|
-
if (!this.isValid)
|
|
230
|
-
return;
|
|
231
|
-
const reqParams = this.compileRequest();
|
|
232
|
-
reqParams.apiOptions.stream = true;
|
|
233
|
-
this.requestType = 'STREAM';
|
|
234
|
-
this.stateManagerDemoService.streamRequest();
|
|
235
|
-
}
|
|
236
|
-
errorHandling(err, type) {
|
|
237
|
-
console.log(err, type);
|
|
238
|
-
if (type === 'GET')
|
|
239
|
-
this.GET_error$.next(err.message);
|
|
240
|
-
if (type === 'POST')
|
|
241
|
-
this.POST_error$.next(err.message);
|
|
242
|
-
if (type === 'PUT')
|
|
243
|
-
this.PUT_error$.next(err.message);
|
|
244
|
-
if (type === 'DELETE')
|
|
245
|
-
this.DELETE_error$.next(err.message);
|
|
246
|
-
if (type === 'STREAM')
|
|
247
|
-
this.STREAM_error$.next(err.message);
|
|
248
|
-
if (type === 'STREAM_AI')
|
|
249
|
-
this.STREAM_AI_error$.next(err.message);
|
|
250
|
-
}
|
|
251
|
-
onSelectAIType(type) {
|
|
252
|
-
this.AIType = type;
|
|
253
|
-
}
|
|
254
|
-
onClearHistory() {
|
|
255
|
-
this.prompts = [];
|
|
256
|
-
}
|
|
257
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RequestManagerStateDemoComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
258
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: RequestManagerStateDemoComponent, selector: "app-request-manager-state-demo", viewQueries: [{ propertyName: "failedState", first: true, predicate: ["failedState"], descendants: true, static: true }, { propertyName: "pollingState", first: true, predicate: ["pollingState"], descendants: true, static: true }], ngImport: i0, template: "<div style=\"margin: 2rem;\">\n\n <h2>\n HTTP Request State Manager\n </h2>\n\n <div [formGroup]=\"requestForm\" style=\"margin-top: 2rem;\">\n <div style=\"display: flex; gap: .5rem\">\n <mat-form-field appearance=\"outline\">\n <mat-label>State Data Type</mat-label>\n <mat-select formControlName=\"datatype\">\n <mat-option value=\"ARRAY\">Array</mat-option>\n <mat-option value=\"OBJECT\">Object</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <div style=\"display: flex; gap: .5rem\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Adapter (Model)</mat-label>\n <mat-select formControlName=\"adapter\" #adapterSelect>\n <mat-option>None</mat-option>\n <mat-option *ngFor=\"let adapter of sampleAdaptors\" [value]=\"adapter.value\">\n {{adapter.label}}\n </mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Mapper (Model)</mat-label>\n <mat-select formControlName=\"mapper\" #mapperSelect>\n <mat-option>None</mat-option>\n <mat-option *ngFor=\"let mapper of sampleMappers\" [value]=\"mapper.value\">\n {{mapper.label}}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <div style=\"display: flex; margin-bottom: 2rem;\" *ngIf=\"adapterSelect.value || mapperSelect.value\">\n <div style=\"flex:1\" class=\"box\">\n <h3>Adapter (Incoming)</h3>\n <div *ngIf=\"adapterSelect.value; else NO_ADAPTER\">\n {{ props(adapterSelect.value) | json }}\n </div>\n <ng-template #NO_ADAPTER>No Transformation</ng-template>\n </div>\n <div style=\"flex:1\" class=\"box\">\n <h3>Mapper (Outgoing)</h3>\n <div *ngIf=\"mapperSelect.value; else NO_MAPPER\">\n {{ props(mapperSelect.value) | json }}\n </div>\n <ng-template #NO_MAPPER>No Transformation</ng-template>\n </div>\n </div>\n\n <div>\n <mat-form-field appearance=\"outline\">\n <mat-label>RestPath (/ delimited)</mat-label>\n <input matInput placeholder=\"clients/list\" formControlName=\"path\">\n </mat-form-field>\n </div>\n <div>\n <div formArrayName=\"headers\">\n <div *ngFor=\"let task of headers.controls; let i = index\" [formGroupName]=\"i\">\n <div style=\"display: flex; gap: .5rem\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Key</mat-label>\n <input matInput placeholder=\"authentication\" formControlName=\"key\">\n </mat-form-field>\n <mat-form-field appearance=\"outline\" style=\"flex:1\">\n <mat-label>Value</mat-label>\n <input matInput placeholder=\"sample\" formControlName=\"value\">\n </mat-form-field>\n <div style=\"margin-top: .5rem;\">\n <button mat-icon-button (click)=\"removeHeader(i)\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n </div>\n </div>\n </div>\n <button mat-stroked-button (click)=\"addHeader()\">Add Header</button>\n </div>\n <div style=\"margin-top: 2rem; display: flex; flex-direction:column; gap: 1rem;\">\n <div>\n <mat-slide-toggle #failedState>Retry on Failed</mat-slide-toggle>\n <div *ngIf=\"failedState.checked\" style=\"display: flex; gap: .5rem; margin-top: 1rem;\" formGroupName=\"retry\">\n <mat-form-field appearance=\"outline\">\n <mat-label>#of Times</mat-label>\n <input matInput placeholder=\"3\" formControlName=\"times\" value=\"3\">\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Delay Until Next</mat-label>\n <input matInput placeholder=\"3\" formControlName=\"delay\" value=\"3\">\n </mat-form-field>\n </div>\n </div>\n <div>\n <mat-slide-toggle #pollingState>Polling</mat-slide-toggle>\n <div *ngIf=\"pollingState.checked\">\n <mat-form-field appearance=\"outline\" style=\"margin-top: 1rem\">\n <mat-label>#of Seconds</mat-label>\n <input matInput placeholder=\"3\" formControlName=\"polling\" value=\"3\">\n </mat-form-field>\n </div>\n </div>\n <div>\n <mat-slide-toggle #DBState>Database Storage</mat-slide-toggle>\n <div *ngIf=\"DBState.checked\" style=\"display: flex; gap: .5rem; margin-top: 1rem\" formGroupName=\"database\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Table Name</mat-label>\n <input matInput placeholder=\"table\" formControlName=\"table\" value=\"\">\n </mat-form-field>\n <div>\n <mat-form-field appearance=\"outline\">\n <mat-label>Expires In</mat-label>\n <mat-select formControlName=\"expiresIn\">\n <mat-option value=\"1m\">One Minute</mat-option>\n <mat-option value=\"1h\">One Hour</mat-option>\n <mat-option value=\"1d\">One Day</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </div>\n </div>\n <div style=\"margin-top: 1rem; display: flex;\">\n <span style=\"flex:1\"></span>\n <button mat-stroked-button (click)=\"onSetStateOptions()\" [disabled]=\"!hasChanged\">\n Set API Request Options\n </button>\n </div>\n <div>\n <mat-error *ngIf=\"(error$ | async) as error\">\n {{ error }}\n </mat-error>\n </div>\n </div>\n </div>\n\n <div style=\"margin-bottom: 1rem; margin-top: 2rem;\">\n <mat-progress-bar mode=\"indeterminate\"\n *ngIf=\"(isPending$ | async)\"\n ></mat-progress-bar>\n <div *ngIf=\"pollingState.checked\">\n <mat-progress-bar mode=\"determinate\"\n *ngIf=\"!(isPending$ | async) && (this.countdown$ | async) || -1 > 0\"\n [value]=\"(this.countdown$ | async)\"\n ></mat-progress-bar>\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\" *ngIf=\"(GET$ | async) as data\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1;\">CURRENT STATE ({{ dataType }})</h2>\n </div>\n <div *ngIf=\"data.length > 1\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Records</mat-label>\n <mat-select [formControl]=\"selectedRecord\" [disabled]=\"data === null && data?.length === 0\">\n <mat-option [value]=\"\">None</mat-option>\n <mat-option *ngFor=\"let item of data\" [value]=\"item\">\n {{item.name || (item.first_name) | titlecase}}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <div *ngIf=\"(dataObservable$ | async) as dataRecord\">\n <div *ngIf=\"(selectedRecord$ | async) as record; else NO_RECORD\">\n {{ record | json }}\n </div>\n <ng-template #NO_RECORD>No Record Selected from State</ng-template>\n\n </div>\n <div style=\"margin-top: 1rem;\">\n <span *ngIf=\"data !== null && data?.length > 0; else NO_DATA\">\n State contains a Total of {{ data.length }} Records\n </span>\n <ng-template #NO_DATA>No Records</ng-template>\n <div style=\"display: flex; gap: .5rem; text-align: end; justify-content: flex-end;\">\n <button class=\"btn\" mat-stroked-button (click)=\"onClearRecords()\">Clear</button>\n <button class=\"btn\" mat-stroked-button (click)=\"onRefreshRecords()\" [disabled]=\"hasChanged\">Refresh</button>\n </div>\n </div>\n </div>\n\n\n\n\n <div style=\"margin-top: 1rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">GET Request ({{ dataType }})</h2>\n <div>\n <button mat-raised-button (click)=\"onGetRequest()\" [disabled]=\"hasChanged\" class=\"btn\">Request</button>\n </div>\n </div>\n\n <div *ngIf=\"(GET_error$ | async) as get_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ get_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\">\n <!-- <div [innerHTML]=\"(GET$ | async) | jsonv\"></div> -->\n <div *ngIf=\"(GET$ | async) as getData\">{{ getData | json }}</div>\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">POST Request</h2>\n <div>\n <button mat-raised-button (click)=\"onCreateRequest()\" [disabled]=\"hasChanged\" class=\"btn\">Request</button>\n </div>\n </div>\n\n <div *ngIf=\"(POST_error$ | async) as post_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ post_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\">\n <!-- <div [innerHTML]=\"(POST$ | async) | jsonv\"></div> -->\n <div *ngIf=\"(POST$ | async) as postData\">{{ postData | json }}</div>\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">PUT Request</h2>\n <div>\n <button mat-raised-button (click)=\"onUpdateRequest()\" [disabled]=\"hasChanged\" class=\"btn\">Request</button>\n </div>\n </div>\n\n <div *ngIf=\"(PUT_error$ | async) as put_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ put_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\">\n <!-- <div [innerHTML]=\"(PUT$ | async) | jsonv\"></div> -->\n <div *ngIf=\"(PUT$ | async) as putData\">{{ putData | json }}</div>\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">DELETE Request</h2>\n <div>\n <button mat-raised-button (click)=\"onDeleteRequest()\" [disabled]=\"hasChanged\" class=\"btn\">Request</button>\n </div>\n </div>\n\n <div *ngIf=\"(DELETE_error$ | async) as delete_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ delete_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\">\n <!-- <div [innerHTML]=\"(DELETE$ | async) | jsonv\"></div> -->\n <div *ngIf=\"(DELETE$ | async) as deleteData\">{{ deleteData | json }}</div>\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">Streaming GET Request</h2>\n <div>\n <button mat-raised-button (click)=\"onStreamRequest()\" class=\"btn\" [disabled]=\"hasChanged\">Request</button>\n </div>\n </div>\n\n <div *ngIf=\"(STREAM_error$ | async) as stream_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ stream_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\">\n <div *ngIf=\"(STREAM$ | async) as data\" class=\"container\">\n <table mat-table [dataSource]=\"data\">\n <ng-container matColumnDef=\"id\">\n <th mat-header-cell *matHeaderCellDef> ID </th>\n <td mat-cell *matCellDef=\"let element\"> {{element.id}} </td>\n </ng-container>\n\n <ng-container matColumnDef=\"name\">\n <th mat-header-cell *matHeaderCellDef> First Name </th>\n <td mat-cell *matCellDef=\"let element\"> {{element.name}} </td>\n </ng-container>\n\n <ng-container matColumnDef=\"lastName\">\n <th mat-header-cell *matHeaderCellDef> Last Name </th>\n <td mat-cell *matCellDef=\"let element\"> {{element.lastName}} </td>\n </ng-container>\n\n <ng-container matColumnDef=\"age\">\n <th mat-header-cell *matHeaderCellDef> Age </th>\n <td mat-cell *matCellDef=\"let element\"> {{element.age}} </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\n </table>\n </div>\n </div>\n\n </div>\n\n</div>\n", styles: [".btn{min-width:120px}.mat-mdc-row .mat-mdc-cell{border-bottom:1px solid transparent;border-top:1px solid transparent;cursor:pointer}.mat-mdc-row:hover .mat-mdc-cell{border-color:currentColor;background-color:#f5f5f5}.container{height:400px;overflow:auto}.box{padding:10px;border:1px solid #ccc}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i2.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i2.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "component", type: i3.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "component", type: i5.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i6.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i8.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i8.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i8.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i8.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i8.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i8.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i8.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i8.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i8.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i8.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "component", type: i9.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "component", type: i10.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon", "disabledInteractive"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { kind: "component", type: i11.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "directive", type: i12.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.JsonPipe, name: "json" }, { kind: "pipe", type: i1.TitleCasePipe, name: "titlecase" }] }); }
|
|
259
|
-
}
|
|
260
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RequestManagerStateDemoComponent, decorators: [{
|
|
261
|
-
type: Component,
|
|
262
|
-
args: [{ selector: 'app-request-manager-state-demo', template: "<div style=\"margin: 2rem;\">\n\n <h2>\n HTTP Request State Manager\n </h2>\n\n <div [formGroup]=\"requestForm\" style=\"margin-top: 2rem;\">\n <div style=\"display: flex; gap: .5rem\">\n <mat-form-field appearance=\"outline\">\n <mat-label>State Data Type</mat-label>\n <mat-select formControlName=\"datatype\">\n <mat-option value=\"ARRAY\">Array</mat-option>\n <mat-option value=\"OBJECT\">Object</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <div style=\"display: flex; gap: .5rem\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Adapter (Model)</mat-label>\n <mat-select formControlName=\"adapter\" #adapterSelect>\n <mat-option>None</mat-option>\n <mat-option *ngFor=\"let adapter of sampleAdaptors\" [value]=\"adapter.value\">\n {{adapter.label}}\n </mat-option>\n </mat-select>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Mapper (Model)</mat-label>\n <mat-select formControlName=\"mapper\" #mapperSelect>\n <mat-option>None</mat-option>\n <mat-option *ngFor=\"let mapper of sampleMappers\" [value]=\"mapper.value\">\n {{mapper.label}}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n\n <div style=\"display: flex; margin-bottom: 2rem;\" *ngIf=\"adapterSelect.value || mapperSelect.value\">\n <div style=\"flex:1\" class=\"box\">\n <h3>Adapter (Incoming)</h3>\n <div *ngIf=\"adapterSelect.value; else NO_ADAPTER\">\n {{ props(adapterSelect.value) | json }}\n </div>\n <ng-template #NO_ADAPTER>No Transformation</ng-template>\n </div>\n <div style=\"flex:1\" class=\"box\">\n <h3>Mapper (Outgoing)</h3>\n <div *ngIf=\"mapperSelect.value; else NO_MAPPER\">\n {{ props(mapperSelect.value) | json }}\n </div>\n <ng-template #NO_MAPPER>No Transformation</ng-template>\n </div>\n </div>\n\n <div>\n <mat-form-field appearance=\"outline\">\n <mat-label>RestPath (/ delimited)</mat-label>\n <input matInput placeholder=\"clients/list\" formControlName=\"path\">\n </mat-form-field>\n </div>\n <div>\n <div formArrayName=\"headers\">\n <div *ngFor=\"let task of headers.controls; let i = index\" [formGroupName]=\"i\">\n <div style=\"display: flex; gap: .5rem\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Key</mat-label>\n <input matInput placeholder=\"authentication\" formControlName=\"key\">\n </mat-form-field>\n <mat-form-field appearance=\"outline\" style=\"flex:1\">\n <mat-label>Value</mat-label>\n <input matInput placeholder=\"sample\" formControlName=\"value\">\n </mat-form-field>\n <div style=\"margin-top: .5rem;\">\n <button mat-icon-button (click)=\"removeHeader(i)\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n </div>\n </div>\n </div>\n <button mat-stroked-button (click)=\"addHeader()\">Add Header</button>\n </div>\n <div style=\"margin-top: 2rem; display: flex; flex-direction:column; gap: 1rem;\">\n <div>\n <mat-slide-toggle #failedState>Retry on Failed</mat-slide-toggle>\n <div *ngIf=\"failedState.checked\" style=\"display: flex; gap: .5rem; margin-top: 1rem;\" formGroupName=\"retry\">\n <mat-form-field appearance=\"outline\">\n <mat-label>#of Times</mat-label>\n <input matInput placeholder=\"3\" formControlName=\"times\" value=\"3\">\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>Delay Until Next</mat-label>\n <input matInput placeholder=\"3\" formControlName=\"delay\" value=\"3\">\n </mat-form-field>\n </div>\n </div>\n <div>\n <mat-slide-toggle #pollingState>Polling</mat-slide-toggle>\n <div *ngIf=\"pollingState.checked\">\n <mat-form-field appearance=\"outline\" style=\"margin-top: 1rem\">\n <mat-label>#of Seconds</mat-label>\n <input matInput placeholder=\"3\" formControlName=\"polling\" value=\"3\">\n </mat-form-field>\n </div>\n </div>\n <div>\n <mat-slide-toggle #DBState>Database Storage</mat-slide-toggle>\n <div *ngIf=\"DBState.checked\" style=\"display: flex; gap: .5rem; margin-top: 1rem\" formGroupName=\"database\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Table Name</mat-label>\n <input matInput placeholder=\"table\" formControlName=\"table\" value=\"\">\n </mat-form-field>\n <div>\n <mat-form-field appearance=\"outline\">\n <mat-label>Expires In</mat-label>\n <mat-select formControlName=\"expiresIn\">\n <mat-option value=\"1m\">One Minute</mat-option>\n <mat-option value=\"1h\">One Hour</mat-option>\n <mat-option value=\"1d\">One Day</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n </div>\n </div>\n <div style=\"margin-top: 1rem; display: flex;\">\n <span style=\"flex:1\"></span>\n <button mat-stroked-button (click)=\"onSetStateOptions()\" [disabled]=\"!hasChanged\">\n Set API Request Options\n </button>\n </div>\n <div>\n <mat-error *ngIf=\"(error$ | async) as error\">\n {{ error }}\n </mat-error>\n </div>\n </div>\n </div>\n\n <div style=\"margin-bottom: 1rem; margin-top: 2rem;\">\n <mat-progress-bar mode=\"indeterminate\"\n *ngIf=\"(isPending$ | async)\"\n ></mat-progress-bar>\n <div *ngIf=\"pollingState.checked\">\n <mat-progress-bar mode=\"determinate\"\n *ngIf=\"!(isPending$ | async) && (this.countdown$ | async) || -1 > 0\"\n [value]=\"(this.countdown$ | async)\"\n ></mat-progress-bar>\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\" *ngIf=\"(GET$ | async) as data\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1;\">CURRENT STATE ({{ dataType }})</h2>\n </div>\n <div *ngIf=\"data.length > 1\">\n <mat-form-field appearance=\"outline\">\n <mat-label>Records</mat-label>\n <mat-select [formControl]=\"selectedRecord\" [disabled]=\"data === null && data?.length === 0\">\n <mat-option [value]=\"\">None</mat-option>\n <mat-option *ngFor=\"let item of data\" [value]=\"item\">\n {{item.name || (item.first_name) | titlecase}}\n </mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <div *ngIf=\"(dataObservable$ | async) as dataRecord\">\n <div *ngIf=\"(selectedRecord$ | async) as record; else NO_RECORD\">\n {{ record | json }}\n </div>\n <ng-template #NO_RECORD>No Record Selected from State</ng-template>\n\n </div>\n <div style=\"margin-top: 1rem;\">\n <span *ngIf=\"data !== null && data?.length > 0; else NO_DATA\">\n State contains a Total of {{ data.length }} Records\n </span>\n <ng-template #NO_DATA>No Records</ng-template>\n <div style=\"display: flex; gap: .5rem; text-align: end; justify-content: flex-end;\">\n <button class=\"btn\" mat-stroked-button (click)=\"onClearRecords()\">Clear</button>\n <button class=\"btn\" mat-stroked-button (click)=\"onRefreshRecords()\" [disabled]=\"hasChanged\">Refresh</button>\n </div>\n </div>\n </div>\n\n\n\n\n <div style=\"margin-top: 1rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">GET Request ({{ dataType }})</h2>\n <div>\n <button mat-raised-button (click)=\"onGetRequest()\" [disabled]=\"hasChanged\" class=\"btn\">Request</button>\n </div>\n </div>\n\n <div *ngIf=\"(GET_error$ | async) as get_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ get_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\">\n <!-- <div [innerHTML]=\"(GET$ | async) | jsonv\"></div> -->\n <div *ngIf=\"(GET$ | async) as getData\">{{ getData | json }}</div>\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">POST Request</h2>\n <div>\n <button mat-raised-button (click)=\"onCreateRequest()\" [disabled]=\"hasChanged\" class=\"btn\">Request</button>\n </div>\n </div>\n\n <div *ngIf=\"(POST_error$ | async) as post_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ post_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\">\n <!-- <div [innerHTML]=\"(POST$ | async) | jsonv\"></div> -->\n <div *ngIf=\"(POST$ | async) as postData\">{{ postData | json }}</div>\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">PUT Request</h2>\n <div>\n <button mat-raised-button (click)=\"onUpdateRequest()\" [disabled]=\"hasChanged\" class=\"btn\">Request</button>\n </div>\n </div>\n\n <div *ngIf=\"(PUT_error$ | async) as put_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ put_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\">\n <!-- <div [innerHTML]=\"(PUT$ | async) | jsonv\"></div> -->\n <div *ngIf=\"(PUT$ | async) as putData\">{{ putData | json }}</div>\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">DELETE Request</h2>\n <div>\n <button mat-raised-button (click)=\"onDeleteRequest()\" [disabled]=\"hasChanged\" class=\"btn\">Request</button>\n </div>\n </div>\n\n <div *ngIf=\"(DELETE_error$ | async) as delete_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ delete_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\">\n <!-- <div [innerHTML]=\"(DELETE$ | async) | jsonv\"></div> -->\n <div *ngIf=\"(DELETE$ | async) as deleteData\">{{ deleteData | json }}</div>\n </div>\n\n </div>\n\n <div style=\"margin-top: 2rem\">\n <mat-divider></mat-divider>\n </div>\n\n <div style=\"margin-top: 2rem\">\n <div style=\"display: flex;\">\n <h2 style=\"flex:1\">Streaming GET Request</h2>\n <div>\n <button mat-raised-button (click)=\"onStreamRequest()\" class=\"btn\" [disabled]=\"hasChanged\">Request</button>\n </div>\n </div>\n\n <div *ngIf=\"(STREAM_error$ | async) as stream_error\" style=\"margin-top: .5rem;\">\n <mat-error>{{ stream_error }}</mat-error>\n </div>\n\n <div style=\"margin-top: 1rem;\">\n <div *ngIf=\"(STREAM$ | async) as data\" class=\"container\">\n <table mat-table [dataSource]=\"data\">\n <ng-container matColumnDef=\"id\">\n <th mat-header-cell *matHeaderCellDef> ID </th>\n <td mat-cell *matCellDef=\"let element\"> {{element.id}} </td>\n </ng-container>\n\n <ng-container matColumnDef=\"name\">\n <th mat-header-cell *matHeaderCellDef> First Name </th>\n <td mat-cell *matCellDef=\"let element\"> {{element.name}} </td>\n </ng-container>\n\n <ng-container matColumnDef=\"lastName\">\n <th mat-header-cell *matHeaderCellDef> Last Name </th>\n <td mat-cell *matCellDef=\"let element\"> {{element.lastName}} </td>\n </ng-container>\n\n <ng-container matColumnDef=\"age\">\n <th mat-header-cell *matHeaderCellDef> Age </th>\n <td mat-cell *matCellDef=\"let element\"> {{element.age}} </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"></tr>\n </table>\n </div>\n </div>\n\n </div>\n\n</div>\n", styles: [".btn{min-width:120px}.mat-mdc-row .mat-mdc-cell{border-bottom:1px solid transparent;border-top:1px solid transparent;cursor:pointer}.mat-mdc-row:hover .mat-mdc-cell{border-color:currentColor;background-color:#f5f5f5}.container{height:400px;overflow:auto}.box{padding:10px;border:1px solid #ccc}\n"] }]
|
|
263
|
-
}], ctorParameters: () => [], propDecorators: { failedState: [{
|
|
264
|
-
type: ViewChild,
|
|
265
|
-
args: ["failedState", { static: true }]
|
|
266
|
-
}], pollingState: [{
|
|
267
|
-
type: ViewChild,
|
|
268
|
-
args: ["pollingState", { static: true }]
|
|
269
|
-
}] } });
|
|
270
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWVzdC1tYW5hZ2VyLXN0YXRlLWRlbW8uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaHR0cC1yZXF1ZXN0LW1hbmFnZXIvc3JjL2xpYi9odHRwLXJlcXVlc3Qtc2VydmljZXMtZGVtby9yZXF1ZXN0LW1hbmFnZXItc3RhdGUtZGVtby9yZXF1ZXN0LW1hbmFnZXItc3RhdGUtZGVtby5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9odHRwLXJlcXVlc3QtbWFuYWdlci9zcmMvbGliL2h0dHAtcmVxdWVzdC1zZXJ2aWNlcy1kZW1vL3JlcXVlc3QtbWFuYWdlci1zdGF0ZS1kZW1vL3JlcXVlc3QtbWFuYWdlci1zdGF0ZS1kZW1vLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVyRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUNoRixPQUFPLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBYSxNQUFNLGdCQUFnQixDQUFDO0FBRXBFLE9BQU8sRUFBYyxlQUFlLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUU1RixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sbURBQW1ELENBQUM7QUFDL0UsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMERBQTBELENBQUM7QUFDNUYsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlEQUFpRCxDQUFDO0FBRTNFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxr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Q0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQzFELElBQUcsSUFBSSxLQUFLLFFBQVE7WUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDMUQsSUFBRyxJQUFJLEtBQUssV0FBVztZQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQ2xFLENBQUM7SUFFRCxjQUFjLENBQUMsSUFBWTtRQUN6QixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQTtJQUNwQixDQUFDO0lBRUQsY0FBYztRQUNaLElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFBO0lBQ25CLENBQUM7K0dBblVVLGdDQUFnQzttR0FBaEMsZ0NBQWdDLDZTQ3JCN0MscW5ZQXdVQTs7NEZEblRhLGdDQUFnQztrQkFMNUMsU0FBUzsrQkFDRSxnQ0FBZ0M7d0RBNENFLFdBQVc7c0JBQXRELFNBQVM7dUJBQUMsYUFBYSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFDRyxZQUFZO3NCQUF4RCxTQUFTO3VCQUFDLGNBQWMsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgVmlld0NoaWxkLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgU3RhdGVNYW5hZ2VyRGVtb1NlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2VzL3N0YXRlLW1hbmFnZXItZGVtby5zZXJ2aWNlJztcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBWYWxpZGF0b3JzLCBGb3JtQXJyYXkgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7IE9ic2VydmFibGUsIEJlaGF2aW9yU3ViamVjdCwgRU1QVFksIG1hcCwgdGFwLCBjYXRjaEVycm9yLCB0aHJvd0Vycm9yIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IENsaWVudEluZm8gfSBmcm9tICcuLi9yZXF1ZXN0LW1hbmFnZXItZGVtby9tb2RlbHMvc2FtcGxlLWNsaWVudC1pbmZvJztcbmltcG9ydCB7IENsaWVudEluZm9NYXBwZXIgfSBmcm9tICcuLi9yZXF1ZXN0LW1hbmFnZXItZGVtby9tb2RlbHMvc2FtcGxlLW1hcHBlci1jbGllbnQtaW5mbyc7XG5pbXBvcnQgeyBBSVByb21wdCB9IGZyb20gJy4uL3JlcXVlc3QtbWFuYWdlci1kZW1vL21vZGVscy9zYW1wbGUtYWktcHJvbXB0JztcblxuaW1wb3J0IHsgRGF0YVR5cGUgfSBmcm9tICcuLi8uLi9tb2RlbHMnO1xuaW1wb3J0IHsgRGF0YWJhc2VTdG9yYWdlIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2RhdGFiYXNlLXN0b3JhZ2UubW9kZWwnO1xuaW1wb3J0IHsgSFRUUE1hbmFnZXJTZXJ2aWNlLCBBcGlSZXF1ZXN0IH0gZnJvbSAnLi4vLi4vc2VydmljZXMnO1xuXG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1yZXF1ZXN0LW1hbmFnZXItc3RhdGUtZGVtbycsXG4gIHRlbXBsYXRlVXJsOiAnLi9yZXF1ZXN0LW1hbmFnZXItc3RhdGUtZGVtby5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3JlcXVlc3QtbWFuYWdlci1zdGF0ZS1kZW1vLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIFJlcXVlc3RNYW5hZ2VyU3RhdGVEZW1vQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuICBzdGF0ZU1hbmFnZXJEZW1vU2VydmljZSA9IGluamVjdChTdGF0ZU1hbmFnZXJEZW1vU2VydmljZSlcblxuICBkaXNwbGF5ZWRDb2x1bW5zID0gWydpZCcsJ25hbWUnLCAnbGFzdE5hbWUnLCAnYWdlJ11cblxuICBzZWxlY3RlZFJlY29yZCQ/OiBPYnNlcnZhYmxlPENsaWVudEluZm98bnVsbD5cblxuICBmYiA9IGluamVjdChGb3JtQnVpbGRlcilcblxuICBodHRwTWFuYWdlclNlcnZpY2UgPSBpbmplY3QoSFRUUE1hbmFnZXJTZXJ2aWNlKVxuXG4gIGlzUGVuZGluZyQgPSB0aGlzLnN0YXRlTWFuYWdlckRlbW9TZXJ2aWNlLmlzUGVuZGluZyRcbiAgZXJyb3IkID0gdGhpcy5zdGF0ZU1hbmFnZXJEZW1vU2VydmljZS5lcnJvciRcblxuICBjb3VudGRvd24kID0gdGhpcy5odHRwTWFuYWdlclNlcnZpY2UuY291bnRkb3duJFxuXG4gIEdFVF9lcnJvciQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4oJycpXG4gIFBPU1RfZXJyb3IkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KCcnKVxuICBQVVRfZXJyb3IkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KCcnKVxuICBERUxFVEVfZXJyb3IkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxzdHJpbmc+KCcnKVxuXG4gIFNUUkVBTV9lcnJvciQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4oJycpXG4gIFNUUkVBTV9BSV9lcnJvciQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4oJycpXG5cbiAgR0VUJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55PihudWxsKVxuICBQT1NUJCA9IG5ldyBCZWhhdmlvclN1YmplY3QobnVsbClcbiAgUFVUJCA9IG5ldyBCZWhhdmlvclN1YmplY3QobnVsbClcbiAgREVMRVRFJCA9IG5ldyBCZWhhdmlvclN1YmplY3QobnVsbClcblxuICBTVFJFQU0gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KG51bGwpXG4gIFNUUkVBTSQgPSB0aGlzLlNUUkVBTS5hc09ic2VydmFibGUoKVxuXG4gIFNUUkVBTV9BSSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8e3Jlc3BvbnNlOiBzdHJpbmd9W10+KFtdKVxuICBTVFJFQU1fQUkkID0gdGhpcy5TVFJFQU1fQUkuYXNPYnNlcnZhYmxlKClcbiAgLnBpcGUoXG4gICAgbWFwKChpdGVtczogYW55KSA9PiAoaXRlbXMpID8gaXRlbXMubWFwKChpdGVtOiBhbnkpID0+IGl0ZW0ucmVzcG9uc2UpIDogW10pLFxuICAgIG1hcCgoaXRlbXM6IGFueSkgPT4gaXRlbXMuam9pbignXFxuJykudHJpbSgpKSxcbiAgKVxuXG4gIEBWaWV3Q2hpbGQoXCJmYWlsZWRTdGF0ZVwiLCB7IHN0YXRpYzogdHJ1ZSB9KSBmYWlsZWRTdGF0ZTogYW55XG4gIEBWaWV3Q2hpbGQoXCJwb2xsaW5nU3RhdGVcIiwgeyBzdGF0aWM6IHRydWUgfSkgcG9sbGluZ1N0YXRlOiBhbnlcblxuICBxdWVzdGlvbkNvbnRyb2wgPSB0aGlzLmZiLmNvbnRyb2woXCJcIiwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdKVxuXG4gIHJlcXVlc3RUeXBlID0gJydcblxuICBwcm9tcHRzOiBzdHJpbmdbXSA9IFtdXG5cbiAgQUlUeXBlID0gMFxuXG4gIGdldCBkYXRhT2JzZXJ2YWJsZSQoKSB7XG5cbiAgICBzd2l0Y2ggKHRoaXMucmVxdWVzdFR5cGUpIHtcbiAgICAgIGNhc2UgJ0dFVCc6XG4gICAgICAgIHJldHVybiB0aGlzLkdFVCRcblxuICAgICAgY2FzZSAnUFVUJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuUFVUJFxuXG4gICAgICBjYXNlICdQT1NUJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuUE9TVCRcblxuICAgICAgY2FzZSAnREVMRVRFJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuREVMRVRFJFxuXG4gICAgICBjYXNlICdTVFJFQU0nOlxuICAgICAgICByZXR1cm4gdGhpcy5TVFJFQU1cblxuICAgICAgY2FzZSAnU1RSRUFNX0FJJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuU1RSRUFNX0FJXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB0aGlzLkdFVCRcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gIH1cblxuICBzYW1wbGVDbGllbnREYXRhID0ge1xuICAgICAgaWQ6IDAsXG4gICAgICBuYW1lOiBcIk9sZCBTY2hvb2wgRGF0ZXNcIixcbiAgICAgIGRvbWFpbjogXCJvc2QuY29tXCIsXG4gICAgICBzZXJ2aWNlOiBcIm9zZFwiLFxuICAgICAgc3BpZmZlOiBcIm9zZC5jb20vb3NkXCIsXG4gICAgICBzZWNyZXQ6IFwiU01PUEVDWFAtT1M0UC1VU09HLVgySUktM1hNRDFGUURSM0lKWFwiLFxuICAgICAgY3JlYXRlZDogMTY5MzAwMzEzOCxcbiAgICAgIG1vZGlmaWVkOiAxNjkzMDAzMTM4LFxuICAgICAgaWNvbjogXCJcIixcbiAgICAgIGltYWdlRmlsZTogXCJcIixcbiAgfVxuXG4gIHNlbGVjdGVkUmVjb3JkID0gdGhpcy5mYi5jb250cm9sKG51bGwpXG5cbiAgcmVxdWVzdEZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICBkYXRhdHlwZTogdGhpcy5mYi5jb250cm9sKCdBUlJBWScpLFxuICAgIHBhdGg6IHRoaXMuZmIuY29udHJvbDxzdHJpbmc+KFwiYWkvXCIpLFxuICAgIGhlYWRlcnM6IHRoaXMuZmIuYXJyYXkoW10pLFxuICAgIGFkYXB0ZXI6IFtudWxsXSxcbiAgICBtYXBwZXI6IFtudWxsXSxcbiAgICByZXRyeTogdGhpcy5mYi5ncm91cCh7XG4gICAgdGltZXM6IFszXSxcbiAgICBkZWxheTogWzNdLFxuICAgIH0pLFxuICAgIHBvbGxpbmc6IFszXSxcbiAgICBkYXRhYmFzZTogdGhpcy5mYi5ncm91cCh7XG4gICAgICB0YWJsZTogWycnXSxcbiAgICAgIGV4cGlyZXNJbjogWycxbSddLFxuICAgIH0pXG4gIH0pXG5cbiAgZ2V0IGhhc0NoYW5nZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdEZvcm0uZGlydHkgfHwgdGhpcy5yZXF1ZXN0Rm9ybS51bnRvdWNoZWRcbiAgfVxuXG4gIGdldCBkYXRhVHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0Rm9ybS5nZXQoXCJkYXRhdHlwZVwiKT8udmFsdWVcbiAgfVxuXG4gIGdldCBkYXRhYmFzZSgpIHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0Rm9ybS5nZXQoXCJkYXRhYmFzZVwiKT8udmFsdWVcbiAgfVxuXG4gIGdldCByZXRyeSgpIHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0Rm9ybS5nZXQoXCJyZXRyeVwiKT8udmFsdWVcbiAgfVxuXG4gIHNhbXBsZUFkYXB0b3JzID0gW1xuICAgIHsgbGFiZWw6IFwiQ2xpZW50SW5mbyBCYXNpY1wiLCB2YWx1ZTogQ2xpZW50SW5mby5hZGFwdCB9LFxuICAgIHsgbGFiZWw6IFwiQUkgUHJvbXB0XCIsIHZhbHVlOiBBSVByb21wdC5hZGFwdCB9LFxuICBdXG5cbiAgc2FtcGxlTWFwcGVycyA9IFtcbiAgICB7IGxhYmVsOiBcIk1hcHBlciBCYXNpY1wiLCB2YWx1ZTogQ2xpZW50SW5mb01hcHBlci5hZGFwdCB9LFxuICAgIHsgbGFiZWw6IFwiQUkgUHJvbXB0XCIsIHZhbHVlOiBBSVByb21wdC5hZGFwdCB9LFxuICBdXG5cbiAgZ2V0IGhlYWRlcnMoKTogRm9ybUFycmF5IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0Rm9ybS5nZXQoJ2hlYWRlcnMnKSBhcyBGb3JtQXJyYXlcbiAgfVxuXG4gIGdldCBpc1ZhbGlkKCkge1xuICAgIHRoaXMucmVxdWVzdEZvcm0ubWFya0FsbEFzVG91Y2hlZCgpXG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdEZvcm0udmFsaWRcbiAgfVxuXG4gIC8vIHNlcnZlciA9IGBodHRwOi8vc2FtcGxlLWVuZHBvaW50L2FzL2F1dGhvcml6YXRpb24ub2F1dGgyYFxuXG4gIGFycmF5T2JqZWN0c1RvT2JqZWN0cyA9IChhcnI6IGFueVtdKSA9PiB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoYXJyKSA/IGFyci5yZWR1Y2UoKG9iaiwgaXRlbSkgPT4gT2JqZWN0LmFzc2lnbihvYmosIHsgW2l0ZW0ua2V5XTogaXRlbS52YWx1ZSB9KSwge30pIDoge31cbiAgfVxuXG4gIHByb3BzID0gKGFkYXB0ZXI6IGFueSkgPT4ge1xuICAgIHJldHVybiAoYWRhcHRlcikgPyBhZGFwdGVyKCkgOiBudWxsXG4gIH1cblxuICBjb25zdHJ1Y3RvcigpIHsgfVxuXG4gIG5nT25Jbml0KCkge1xuXG4gICAgdGhpcy5zdGF0ZU1hbmFnZXJEZW1vU2VydmljZS5kYXRhJC5waXBlKFxuICAgICAgdGFwKChkYXRhKSA9PiBjb25zb2xlLmxvZyhcIkFQSSBTVFJFQU1fQUkgcmVzcG9uc2VcIiwgZGF0YSkpLFxuICAgIClcblxuICAgIHRoaXMuZXJyb3IkLnBpcGUoXG4gICAgICB0YXAoKGRhdGEpID0+IHtcbiAgICAgICAgZGVidWdnZXJcbiAgICAgICAgY29uc29sZS5sb2coXCJBUEkgU1RSRUFNIHJlc3BvbnNlXCIsIGRhdGEpXG4gICAgICB9KSxcbiAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4ge1xuICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiB0aGlzLmVycm9ySGFuZGxpbmcoZXJyb3IsICdTVFJFQU0nKSlcbiAgICAgIH0pXG4gICAgKVxuXG4gICAgdGhpcy5zZWxlY3RlZFJlY29yZC52YWx1ZUNoYW5nZXNcbiAgICAuc3Vic2NyaWJlKChkYXRhOiBDbGllbnRJbmZvfG51bGwpID0+IHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRSZWNvcmQkID0gKGRhdGEpID8gdGhpcy5zdGF0ZU1hbmFnZXJEZW1vU2VydmljZS5zZWxlY3RSZWNvcmQkKGRhdGEuaWQpIDogRU1QVFlcbiAgICB9KVxuXG4gICAgdGhpcy5zdGF0ZU1hbmFnZXJEZW1vU2VydmljZS5kYXRhJFxuICAgIC5waXBlKFxuICAgICAgdGFwKChkYXRhOiBhbnkpID0+IHtcblxuICAgICAgICBzd2l0Y2ggKHRoaXMucmVxdWVzdFR5cGUpIHtcbiAgICAgICAgICBjYXNlICdHRVQnOlxuICAgICAgICAgICAgdGhpcy5HRVQkLm5leHQoZGF0YSlcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAnUFVUJzpcbiAgICAgICAgICAgIHRoaXMuUFVUJC5uZXh0KGRhdGEpXG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgJ1BPU1QnOlxuICAgICAgICAgICAgdGhpcy5QT1NUJC5uZXh0KGRhdGEpXG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgJ0RFTEVURSc6XG4gICAgICAgICAgICB0aGlzLkRFTEVURSQubmV4dChkYXRhKVxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlICdTVFJFQU0nOlxuICAgICAgICAgICAgdGhpcy5TVFJFQU0ubmV4dChkYXRhKVxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlICdTVFJFQU1fQUknOlxuICAgICAgICAgICAgdGhpcy5TVFJFQU1fQUkubmV4dChkYXRhKVxuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgfSlcbiAgICApLnN1YnNjcmliZSgpXG5cbiAgfVxuXG4gIGFkZEhlYWRlcigpIHtcbiAgICBjb25zdCBoZWFkZXIgPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIGtleTogWycnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgIHZhbHVlOiBbJyddXG4gICAgfSk7XG4gICAgdGhpcy5oZWFkZXJzLnB1c2goaGVhZGVyKVxuICB9XG5cbiAgcmVtb3ZlSGVhZGVyKGluZGV4OiBudW1iZXIpIHtcbiAgICB0aGlzLmhlYWRlcnMucmVtb3ZlQXQoaW5kZXgpXG4gIH1cblxuICBjb21waWxlUmVxdWVzdCgpIHtcblxuICAgIGNvbnN0IHJlcXVlc3RQYXJhbXMgPSB0aGlzLnJlcXVlc3RGb3JtLnZhbHVlXG5cbiAgICByZXF1ZXN0UGFyYW1zLmhlYWRlcnMgPSB0aGlzLmFycmF5T2JqZWN0c1RvT2JqZWN0cyhcbiAgICAgIHJlcXVlc3RQYXJhbXMuaGVhZGVycyB8fCBbXVxuICAgIClcblxuICAgIGNvbnN0IHBhdGhSZXEgPSAocmVxdWVzdFBhcmFtcy5wYXRoID09PSBcIlwiKSA/IFtdIDogKHJlcXVlc3RQYXJhbXMucGF0aCB8fCBcIlwiKS5zcGxpdChcIi9cIilcblxuICAgIGlmICghdGhpcy5wb2xsaW5nU3RhdGUuY2hlY2tlZCkgcmVxdWVzdFBhcmFtcy5wb2xsaW5nID0gMFxuXG4gICAgaWYgKCF0aGlzLmZhaWxlZFN0YXRlLmNoZWNrZWQpIHtcbiAgICAgIHJlcXVlc3RQYXJhbXMucmV0cnkgPSB7IHRpbWVzOiAwLGRlbGF5OiAwIH1cbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50T3B0aW9ucyA9IEFwaVJlcXVlc3QuYWRhcHQocmVxdWVzdFBhcmFtcylcbiAgICBjdXJyZW50T3B0aW9ucy5wYXRoID0gW11cbiAgICBjb25zdCBhcGlPcHRpb25zID0gQXBpUmVxdWVzdC5hZGFwdCh7IC4uLmN1cnJlbnRPcHRpb25zLCBwYXRoOiBwYXRoUmVxIH0pXG5cbiAgICByZXR1cm4geyBhcGlPcHRpb25zOiBhcGlPcHRpb25zLCBwYXRoOiBwYXRoUmVxIH1cblxuICB9XG5cbiAgb25TZXRTdGF0ZU9wdGlvbnMoKSB7XG5cbiAgICBpZighdGhpcy5pc1ZhbGlkKSByZXR1cm5cblxuICAgIGNvbnN0IHJlcVBhcmFtcyA9IHRoaXMuY29tcGlsZVJlcXVlc3QoKVxuXG4gICAgY29uc3QgZGIgPSBEYXRhYmFzZVN0b3JhZ2UuYWRhcHQodGhpcy5kYXRhYmFzZSlcbiAgICBjb25zdCB0eXBlID0gdGhpcy5kYXRhVHlwZSA9PT0gXCJBUlJBWVwiID8gRGF0YVR5cGUuQVJSQVkgOiBEYXRhVHlwZS5PQkpFQ1RcbiAgICB0aGlzLnN0YXRlTWFuYWdlckRlbW9TZXJ2aWNlLnNldEFQSU9wdGlvbnMocmVxUGFyYW1zLmFwaU9wdGlvbnMsIHR5cGUsIGRiKVxuXG4gICAgdGhpcy5yZXF1ZXN0Rm9ybS5tYXJrQXNQcmlzdGluZSgpXG4gIH1cblxuICBvbkNsZWFyUmVjb3JkcygpIHtcbiAgICB0aGlzLnN0YXRlTWFuYWdlckRlbW9TZXJ2aWNlLmNsZWFyUmVjb3JkcygpXG4gIH1cblxuICBvblJlZnJlc2hSZWNvcmRzKCkge1xuICAgIHRoaXMuc3RhdGVNYW5hZ2VyRGVtb1NlcnZpY2UucmVmcmVzaERhdGEoKVxuICB9XG5cbiAgb25HZXRSZXF1ZXN0KCkge1xuICAgIHRoaXMucmVxdWVzdFR5cGUgPSAnR0VUJ1xuICAgIHRoaXMuc3RhdGVNYW5hZ2VyRGVtb1NlcnZpY2UuZ2V0Q2xpZW50cygpXG4gIH1cblxuICBvbkNyZWF0ZVJlcXVlc3QoKSB7XG4gICAgdGhpcy5yZXF1ZXN0VHlwZSA9ICdQT1NUJ1xuICAgIHRoaXMuc3RhdGVNYW5hZ2VyRGVtb1NlcnZpY2UuY3JlYXRlQ2xpZW50KHRoaXMuc2FtcGxlQ2xpZW50RGF0YSlcbiAgfVxuXG4gIG9uVXBkYXRlUmVxdWVzdCgpIHtcbiAgICB0aGlzLnJlcXVlc3RUeXBlID0gJ1BVVCdcbiAgICB0aGlzLnN0YXRlTWFuYWdlckRlbW9TZXJ2aWNlLnVwZGF0ZUNsaWVudCh0aGlzLnNhbXBsZUNsaWVudERhdGEpXG4gIH1cblxuICBvbkRlbGV0ZVJlcXVlc3QoKSB7XG4gICAgdGhpcy5yZXF1ZXN0VHlwZSA9ICdERUxFVEUnXG4gICAgdGhpcy5zdGF0ZU1hbmFnZXJEZW1vU2VydmljZS5kZWxldGVDbGllbnQodGhpcy5zYW1wbGVDbGllbnREYXRhKVxuICB9XG5cbiAgb25TdHJlYW1SZXF1ZXN0KCkge1xuXG4gICAgaWYoIXRoaXMuaXNWYWxpZCkgcmV0dXJuXG5cbiAgICBjb25zdCByZXFQYXJhbXMgPSB0aGlzLmNvbXBpbGVSZXF1ZXN0KClcblxuICAgIHJlcVBhcmFtcy5hcGlPcHRpb25zLnN0cmVhbSA9IHRydWVcblxuICAgIHRoaXMucmVxdWVzdFR5cGUgPSAnU1RSRUFNJ1xuXG4gICAgdGhpcy5zdGF0ZU1hbmFnZXJEZW1vU2VydmljZS5zdHJlYW1SZXF1ZXN0KClcblxuICB9XG5cbiAgZXJyb3JIYW5kbGluZyhlcnI6IGFueSwgdHlwZTogc3RyaW5nKSB7IGNvbnNvbGUubG9nKGVyciwgdHlwZSlcbiAgICBpZih0eXBlID09PSAnR0VUJykgdGhpcy5HRVRfZXJyb3IkLm5leHQoZXJyLm1lc3NhZ2UpXG4gICAgaWYodHlwZSA9PT0gJ1BPU1QnKSB0aGlzLlBPU1RfZXJyb3IkLm5leHQoZXJyLm1lc3NhZ2UpXG4gICAgaWYodHlwZSA9PT0gJ1BVVCcpIHRoaXMuUFVUX2Vycm9yJC5uZXh0KGVyci5tZXNzYWdlKVxuICAgIGlmKHR5cGUgPT09ICdERUxFVEUnKSB0aGlzLkRFTEVURV9lcnJvciQubmV4dChlcnIubWVzc2FnZSlcbiAgICBpZih0eXBlID09PSAnU1RSRUFNJykgdGhpcy5TVFJFQU1fZXJyb3IkLm5leHQoZXJyLm1lc3NhZ2UpXG4gICAgaWYodHlwZSA9PT0gJ1NUUkVBTV9BSScpIHRoaXMuU1RSRUFNX0FJX2Vycm9yJC5uZXh0KGVyci5tZXNzYWdlKVxuICB9XG5cbiAgb25TZWxlY3RBSVR5cGUodHlwZTogbnVtYmVyKSB7XG4gICAgdGhpcy5BSVR5cGUgPSB0eXBlXG4gIH1cblxuICBvbkNsZWFySGlzdG9yeSgpIHtcbiAgICB0aGlzLnByb21wdHMgPSBbXVxuICB9XG5cbn1cbiIsIjxkaXYgc3R5bGU9XCJtYXJnaW46IDJyZW07XCI+XG5cbiAgPGgyPlxuICAgIEhUVFAgUmVxdWVzdCBTdGF0ZSBNYW5hZ2VyXG4gIDwvaDI+XG5cbiAgPGRpdiBbZm9ybUdyb3VwXT1cInJlcXVlc3RGb3JtXCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAycmVtO1wiPlxuICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBnYXA6IC41cmVtXCI+XG4gICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cbiAgICAgICAgPG1hdC1sYWJlbD5TdGF0ZSBEYXRhIFR5cGU8L21hdC1sYWJlbD5cbiAgICAgICAgPG1hdC1zZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwiZGF0YXR5cGVcIj5cbiAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIkFSUkFZXCI+QXJyYXk8L21hdC1vcHRpb24+XG4gICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJPQkpFQ1RcIj5PYmplY3Q8L21hdC1vcHRpb24+XG4gICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGdhcDogLjVyZW1cIj5cbiAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxuICAgICAgICA8bWF0LWxhYmVsPkFkYXB0ZXIgKE1vZGVsKTwvbWF0LWxhYmVsPlxuICAgICAgICA8bWF0LXNlbGVjdCBmb3JtQ29udHJvbE5hbWU9XCJhZGFwdGVyXCIgI2FkYXB0ZXJTZWxlY3Q+XG4gICAgICAgICAgPG1hdC1vcHRpb24+Tm9uZTwvbWF0LW9wdGlvbj5cbiAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgYWRhcHRlciBvZiBzYW1wbGVBZGFwdG9yc1wiIFt2YWx1ZV09XCJhZGFwdGVyLnZhbHVlXCI+XG4gICAgICAgICAgICB7e2FkYXB0ZXIubGFiZWx9fVxuICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxuICAgICAgICA8bWF0LWxhYmVsPk1hcHBlciAoTW9kZWwpPC9tYXQtbGFiZWw+XG4gICAgICAgIDxtYXQtc2VsZWN0IGZvcm1Db250cm9sTmFtZT1cIm1hcHBlclwiICNtYXBwZXJTZWxlY3Q+XG4gICAgICAgICAgPG1hdC1vcHRpb24+Tm9uZTwvbWF0LW9wdGlvbj5cbiAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgbWFwcGVyIG9mIHNhbXBsZU1hcHBlcnNcIiBbdmFsdWVdPVwibWFwcGVyLnZhbHVlXCI+XG4gICAgICAgICAgICB7e21hcHBlci5sYWJlbH19XG4gICAgICAgICAgPC9tYXQtb3B0aW9uPlxuICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IG1hcmdpbi1ib3R0b206IDJyZW07XCIgKm5nSWY9XCJhZGFwdGVyU2VsZWN0LnZhbHVlIHx8IG1hcHBlclNlbGVjdC52YWx1ZVwiPlxuICAgICAgPGRpdiBzdHlsZT1cImZsZXg6MVwiIGNsYXNzPVwiYm94XCI+XG4gICAgICAgIDxoMz5BZGFwdGVyIChJbmNvbWluZyk8L2gzPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiYWRhcHRlclNlbGVjdC52YWx1ZTsgZWxzZSBOT19BREFQVEVSXCI+XG4gICAgICAgICAge3sgcHJvcHMoYWRhcHRlclNlbGVjdC52YWx1ZSkgfCBqc29uIH19XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8bmctdGVtcGxhdGUgI05PX0FEQVBURVI+Tm8gVHJhbnNmb3JtYXRpb248L25nLXRlbXBsYXRlPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IHN0eWxlPVwiZmxleDoxXCIgY2xhc3M9XCJib3hcIj5cbiAgICAgICAgPGgzPk1hcHBlciAoT3V0Z29pbmcpPC9oMz5cbiAgICAgICAgPGRpdiAqbmdJZj1cIm1hcHBlclNlbGVjdC52YWx1ZTsgZWxzZSBOT19NQVBQRVJcIj5cbiAgICAgICAgICB7eyBwcm9wcyhtYXBwZXJTZWxlY3QudmFsdWUpIHwganNvbiB9fVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNOT19NQVBQRVI+Tm8gVHJhbnNmb3JtYXRpb248L25nLXRlbXBsYXRlPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2PlxuICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XG4gICAgICAgIDxtYXQtbGFiZWw+UmVzdFBhdGggKC8gZGVsaW1pdGVkKTwvbWF0LWxhYmVsPlxuICAgICAgICA8aW5wdXQgbWF0SW5wdXQgcGxhY2Vob2xkZXI9XCJjbGllbnRzL2xpc3RcIiBmb3JtQ29udHJvbE5hbWU9XCJwYXRoXCI+XG4gICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgIDwvZGl2PlxuICAgIDxkaXY+XG4gICAgICA8ZGl2IGZvcm1BcnJheU5hbWU9XCJoZWFkZXJzXCI+XG4gICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHRhc2sgb2YgaGVhZGVycy5jb250cm9sczsgbGV0IGkgPSBpbmRleFwiIFtmb3JtR3JvdXBOYW1lXT1cImlcIj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiAuNXJlbVwiPlxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XG4gICAgICAgICAgICAgIDxtYXQtbGFiZWw+S2V5PC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBwbGFjZWhvbGRlcj1cImF1dGhlbnRpY2F0aW9uXCIgZm9ybUNvbnRyb2xOYW1lPVwia2V5XCI+XG4gICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgc3R5bGU9XCJmbGV4OjFcIj5cbiAgICAgICAgICAgICAgPG1hdC1sYWJlbD5WYWx1ZTwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgcGxhY2Vob2xkZXI9XCJzYW1wbGVcIiBmb3JtQ29udHJvbE5hbWU9XCJ2YWx1ZVwiPlxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAuNXJlbTtcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cInJlbW92ZUhlYWRlcihpKVwiPlxuICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxidXR0b24gbWF0LXN0cm9rZWQtYnV0dG9uIChjbGljayk9XCJhZGRIZWFkZXIoKVwiPkFkZCBIZWFkZXI8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMnJlbTsgZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246Y29sdW1uOyBnYXA6IDFyZW07XCI+XG4gICAgICA8ZGl2PlxuICAgICAgICA8bWF0LXNsaWRlLXRvZ2dsZSAjZmFpbGVkU3RhdGU+UmV0cnkgb24gRmFpbGVkPC9tYXQtc2xpZGUtdG9nZ2xlPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiZmFpbGVkU3RhdGUuY2hlY2tlZFwiIHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiAuNXJlbTsgbWFyZ2luLXRvcDogMXJlbTtcIiBmb3JtR3JvdXBOYW1lPVwicmV0cnlcIj5cbiAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cbiAgICAgICAgICAgIDxtYXQtbGFiZWw+I29mIFRpbWVzPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgcGxhY2Vob2xkZXI9XCIzXCIgZm9ybUNvbnRyb2xOYW1lPVwidGltZXNcIiB2YWx1ZT1cIjNcIj5cbiAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxuICAgICAgICAgICAgPG1hdC1sYWJlbD5EZWxheSBVbnRpbCBOZXh0PC9tYXQtbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgcGxhY2Vob2xkZXI9XCIzXCIgZm9ybUNvbnRyb2xOYW1lPVwiZGVsYXlcIiB2YWx1ZT1cIjNcIj5cbiAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdj5cbiAgICAgICAgPG1hdC1zbGlkZS10b2dnbGUgI3BvbGxpbmdTdGF0ZT5Qb2xsaW5nPC9tYXQtc2xpZGUtdG9nZ2xlPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwicG9sbGluZ1N0YXRlLmNoZWNrZWRcIj5cbiAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBzdHlsZT1cIm1hcmdpbi10b3A6IDFyZW1cIj5cbiAgICAgICAgICAgIDxtYXQtbGFiZWw+I29mIFNlY29uZHM8L21hdC1sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBwbGFjZWhvbGRlcj1cIjNcIiBmb3JtQ29udHJvbE5hbWU9XCJwb2xsaW5nXCIgdmFsdWU9XCIzXCI+XG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXY+XG4gICAgICAgIDxtYXQtc2xpZGUtdG9nZ2xlICNEQlN0YXRlPkRhdGFiYXNlIFN0b3JhZ2U8L21hdC1zbGlkZS10b2dnbGU+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJEQlN0YXRlLmNoZWNrZWRcIiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGdhcDogLjVyZW07IG1hcmdpbi10b3A6IDFyZW1cIiBmb3JtR3JvdXBOYW1lPVwiZGF0YWJhc2VcIj5cbiAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cbiAgICAgICAgICAgIDxtYXQtbGFiZWw+VGFibGUgTmFtZTwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IHBsYWNlaG9sZGVyPVwidGFibGVcIiBmb3JtQ29udHJvbE5hbWU9XCJ0YWJsZVwiIHZhbHVlPVwiXCI+XG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XG4gICAgICAgICAgICAgIDxtYXQtbGFiZWw+RXhwaXJlcyBJbjwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICA8bWF0LXNlbGVjdCBmb3JtQ29udHJvbE5hbWU9XCJleHBpcmVzSW5cIj5cbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIjFtXCI+T25lIE1pbnV0ZTwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIjFoXCI+T25lIEhvdXI8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCIxZFwiPk9uZSBEYXk8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMXJlbTsgZGlzcGxheTogZmxleDtcIj5cbiAgICAgICAgPHNwYW4gc3R5bGU9XCJmbGV4OjFcIj48L3NwYW4+XG4gICAgICAgIDxidXR0b24gbWF0LXN0cm9rZWQtYnV0dG9uIChjbGljayk9XCJvblNldFN0YXRlT3B0aW9ucygpXCIgW2Rpc2FibGVkXT1cIiFoYXNDaGFuZ2VkXCI+XG4gICAgICAgICAgU2V0IEFQSSBSZXF1ZXN0IE9wdGlvbnNcbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXY+XG4gICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCIoZXJyb3IkIHwgYXN5bmMpIGFzIGVycm9yXCI+XG4gICAgICAgICAge3sgZXJyb3IgfX1cbiAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDFyZW07IG1hcmdpbi10b3A6IDJyZW07XCI+XG4gICAgPG1hdC1wcm9ncmVzcy1iYXIgbW9kZT1cImluZGV0ZXJtaW5hdGVcIlxuICAgICAgKm5nSWY9XCIoaXNQZW5kaW5nJCB8IGFzeW5jKVwiXG4gICAgPjwvbWF0LXByb2dyZXNzLWJhcj5cbiAgICA8ZGl2ICpuZ0lmPVwicG9sbGluZ1N0YXRlLmNoZWNrZWRcIj5cbiAgICAgIDxtYXQtcHJvZ3Jlc3MtYmFyIG1vZGU9XCJkZXRlcm1pbmF0ZVwiXG4gICAgICAqbmdJZj1cIiEoaXNQZW5kaW5nJCB8IGFzeW5jKSAmJiAodGhpcy5jb3VudGRvd24kIHwgYXN5bmMpIHx8IC0xID4gMFwiXG4gICAgICBbdmFsdWVdPVwiKHRoaXMuY291bnRkb3duJCB8IGFzeW5jKVwiXG4gICAgICA+PC9tYXQtcHJvZ3Jlc3MtYmFyPlxuICAgIDwvZGl2PlxuXG4gIDwvZGl2PlxuXG4gIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAycmVtXCIgKm5nSWY9XCIoR0VUJCB8IGFzeW5jKSBhcyBkYXRhXCI+XG4gICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7XCI+XG4gICAgICA8aDIgc3R5bGU9XCJmbGV4OjE7XCI+Q1VSUkVOVCBTVEFURSAoe3sgZGF0YVR5cGUgfX0pPC9oMj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2ICpuZ0lmPVwiZGF0YS5sZW5ndGggPiAxXCI+XG4gICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cbiAgICAgICAgPG1hdC1sYWJlbD5SZWNvcmRzPC9tYXQtbGFiZWw+XG4gICAgICAgIDxtYXQtc2VsZWN0IFtmb3JtQ29udHJvbF09XCJzZWxlY3RlZFJlY29yZFwiIFtkaXNhYmxlZF09XCJkYXRhID09PSBudWxsICYmIGRhdGE/Lmxlbmd0aCA9PT0gMFwiPlxuICAgICAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCJcIj5Ob25lPC9tYXQtb3B0aW9uPlxuICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBpdGVtIG9mIGRhdGFcIiBbdmFsdWVdPVwiaXRlbVwiPlxuICAgICAgICAgICAge3tpdGVtLm5hbWUgfHwgKGl0ZW0uZmlyc3RfbmFtZSkgfCB0aXRsZWNhc2V9fVxuICAgICAgICAgIDwvbWF0LW9wdGlvbj5cbiAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2ICpuZ0lmPVwiKGRhdGFPYnNlcnZhYmxlJCB8IGFzeW5jKSBhcyBkYXRhUmVjb3JkXCI+XG4gICAgICA8ZGl2ICpuZ0lmPVwiKHNlbGVjdGVkUmVjb3JkJCB8IGFzeW5jKSBhcyByZWNvcmQ7IGVsc2UgTk9fUkVDT1JEXCI+XG4gICAgICAgIHt7IHJlY29yZCB8IGpzb24gfX1cbiAgICAgIDwvZGl2PlxuICAgICAgPG5nLXRlbXBsYXRlICNOT19SRUNPUkQ+Tm8gUmVjb3JkIFNlbGVjdGVkIGZyb20gU3RhdGU8L25nLXRlbXBsYXRlPlxuXG4gICAgPC9kaXY+XG4gICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDFyZW07XCI+XG4gICAgICA8c3BhbiAqbmdJZj1cImRhdGEgIT09IG51bGwgJiYgZGF0YT8ubGVuZ3RoID4gMDsgZWxzZSBOT19EQVRBXCI+XG4gICAgICAgIFN0YXRlIGNvbnRhaW5zIGEgVG90YWwgb2Yge3sgZGF0YS5sZW5ndGggfX0gUmVjb3Jkc1xuICAgICAgPC9zcGFuPlxuICAgICAgPG5nLXRlbXBsYXRlICNOT19EQVRBPk5vIFJlY29yZHM8L25nLXRlbXBsYXRlPlxuICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGdhcDogLjVyZW07IHRleHQtYWxpZ246IGVuZDsganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDtcIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0blwiIG1hdC1zdHJva2VkLWJ1dHRvbiAoY2xpY2spPVwib25DbGVhclJlY29yZHMoKVwiPkNsZWFyPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG5cIiBtYXQtc3Ryb2tlZC1idXR0b24gKGNsaWNrKT1cIm9uUmVmcmVzaFJlY29yZHMoKVwiIFtkaXNhYmxlZF09XCJoYXNDaGFuZ2VkXCI+UmVmcmVzaDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG5cblxuXG4gIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAxcmVtXCI+XG4gICAgPG1hdC1kaXZpZGVyPjwvbWF0LWRpdmlkZXI+XG4gIDwvZGl2PlxuXG4gIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAycmVtXCI+XG4gICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7XCI+XG4gICAgICA8aDIgc3R5bGU9XCJmbGV4OjFcIj5HRVQgUmVxdWVzdCAoe3sgZGF0YVR5cGUgfX0pPC9oMj5cbiAgICAgIDxkaXY+XG4gICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gKGNsaWNrKT1cIm9uR2V0UmVxdWVzdCgpXCIgW2Rpc2FibGVkXT1cImhhc0NoYW5nZWRcIiBjbGFzcz1cImJ0blwiPlJlcXVlc3Q8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiAqbmdJZj1cIihHRVRfZXJyb3IkIHwgYXN5bmMpIGFzIGdldF9lcnJvclwiIHN0eWxlPVwibWFyZ2luLXRvcDogLjVyZW07XCI+XG4gICAgICA8bWF0LWVycm9yPnt7IGdldF9lcnJvciB9fTwvbWF0LWVycm9yPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDFyZW07XCI+XG4gICAgICA8IS0tIDxkaXYgW2lubmVySFRNTF09XCIoR0VUJCB8IGFzeW5jKSB8IGpzb252XCI+PC9kaXY+IC0tPlxuICAgICAgPGRpdiAqbmdJZj1cIihHRVQkIHwgYXN5bmMpIGFzIGdldERhdGFcIj57eyBnZXREYXRhIHwganNvbiB9fTwvZGl2PlxuICAgIDwvZGl2PlxuXG4gIDwvZGl2PlxuXG4gIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAycmVtXCI+XG4gICAgPG1hdC1kaXZpZGVyPjwvbWF0LWRpdmlkZXI+XG4gIDwvZGl2PlxuXG4gIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAycmVtXCI+XG4gICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7XCI+XG4gICAgICA8aDIgc3R5bGU9XCJmbGV4OjFcIj5QT1NUIFJlcXVlc3Q8L2gyPlxuICAgICAgPGRpdj5cbiAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiAoY2xpY2spPVwib25DcmVhdGVSZXF1ZXN0KClcIiBbZGlzYWJsZWRdPVwiaGFzQ2hhbmdlZFwiIGNsYXNzPVwiYnRuXCI+UmVxdWVzdDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2ICpuZ0lmPVwiKFBPU1RfZXJyb3IkIHwgYXN5bmMpIGFzIHBvc3RfZXJyb3JcIiBzdHlsZT1cIm1hcmdpbi10b3A6IC41cmVtO1wiPlxuICAgICAgPG1hdC1lcnJvcj57eyBwb3N0X2Vycm9yIH19PC9tYXQtZXJyb3I+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMXJlbTtcIj5cbiAgICAgIDwhLS0gPGRpdiBbaW5uZXJIVE1MXT1cIihQT1NUJCB8IGFzeW5jKSB8IGpzb252XCI+PC9kaXY+IC0tPlxuICAgICAgPGRpdiAqbmdJZj1cIihQT1NUJCB8IGFzeW5jKSBhcyBwb3N0RGF0YVwiPnt7IHBvc3REYXRhIHwganNvbiB9fTwvZGl2PlxuICAgIDwvZGl2PlxuXG4gIDwvZGl2PlxuXG4gIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAycmVtXCI+XG4gICAgPG1hdC1kaXZpZGVyPjwvbWF0LWRpdmlkZXI+XG4gIDwvZGl2PlxuXG4gIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAycmVtXCI+XG4gICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7XCI+XG4gICAgICA8aDIgc3R5bGU9XCJmbGV4OjFcIj5QVVQgUmVxdWVzdDwvaDI+XG4gICAgICA8ZGl2PlxuICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIChjbGljayk9XCJvblVwZGF0ZVJlcXVlc3QoKVwiIFtkaXNhYmxlZF09XCJoYXNDaGFuZ2VkXCIgY2xhc3M9XCJidG5cIj5SZXF1ZXN0PC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgKm5nSWY9XCIoUFVUX2Vycm9yJCB8IGFzeW5jKSBhcyBwdXRfZXJyb3JcIiBzdHlsZT1cIm1hcmdpbi10b3A6IC41cmVtO1wiPlxuICAgICAgPG1hdC1lcnJvcj57eyBwdXRfZXJyb3IgfX08L21hdC1lcnJvcj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAxcmVtO1wiPlxuICAgICAgPCEtLSA8ZGl2IFtpbm5lckhUTUxdPVwiKFBVVCQgfCBhc3luYykgfCBqc29udlwiPjwvZGl2PiAtLT5cbiAgICAgIDxkaXYgKm5nSWY9XCIoUFVUJCB8IGFzeW5jKSBhcyBwdXREYXRhXCI+e3sgcHV0RGF0YSB8IGpzb24gfX08L2Rpdj5cbiAgICA8L2Rpdj5cblxuICA8L2Rpdj5cblxuICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMnJlbVwiPlxuICAgIDxtYXQtZGl2aWRlcj48L21hdC1kaXZpZGVyPlxuICA8L2Rpdj5cblxuICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMnJlbVwiPlxuICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4O1wiPlxuICAgICAgPGgyIHN0eWxlPVwiZmxleDoxXCI+REVMRVRFIFJlcXVlc3Q8L2gyPlxuICAgICAgPGRpdj5cbiAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiAoY2xpY2spPVwib25EZWxldGVSZXF1ZXN0KClcIiBbZGlzYWJsZWRdPVwiaGFzQ2hhbmdlZFwiIGNsYXNzPVwiYnRuXCI+UmVxdWVzdDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2ICpuZ0lmPVwiKERFTEVURV9lcnJvciQgfCBhc3luYykgYXMgZGVsZXRlX2Vycm9yXCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAuNXJlbTtcIj5cbiAgICAgIDxtYXQtZXJyb3I+e3sgZGVsZXRlX2Vycm9yIH19PC9tYXQtZXJyb3I+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMXJlbTtcIj5cbiAgICAgIDwhLS0gPGRpdiBbaW5uZXJIVE1MXT1cIihERUxFVEUkIHwgYXN5bmMpIHwganNvbnZcIj48L2Rpdj4gLS0+XG4gICAgICA8ZGl2ICpuZ0lmPVwiKERFTEVURSQgfCBhc3luYykgYXMgZGVsZXRlRGF0YVwiPnt7IGRlbGV0ZURhdGEgfCBqc29uIH19PC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgPC9kaXY+XG5cbiAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDJyZW1cIj5cbiAgICA8bWF0LWRpdmlkZXI+PC9tYXQtZGl2aWRlcj5cbiAgPC9kaXY+XG5cbiAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDJyZW1cIj5cbiAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDtcIj5cbiAgICAgIDxoMiBzdHlsZT1cImZsZXg6MVwiPlN0cmVhbWluZyBHRVQgUmVxdWVzdDwvaDI+XG4gICAgICA8ZGl2PlxuICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIChjbGljayk9XCJvblN0cmVhbVJlcXVlc3QoKVwiIGNsYXNzPVwiYnRuXCIgW2Rpc2FibGVkXT1cImhhc0NoYW5nZWRcIj5SZXF1ZXN0PC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgKm5nSWY9XCIoU1RSRUFNX2Vycm9yJCB8IGFzeW5jKSBhcyBzdHJlYW1fZXJyb3JcIiBzdHlsZT1cIm1hcmdpbi10b3A6IC41cmVtO1wiPlxuICAgICAgPG1hdC1lcnJvcj57eyBzdHJlYW1fZXJyb3IgfX08L21hdC1lcnJvcj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAxcmVtO1wiPlxuICAgICAgPGRpdiAqbmdJZj1cIihTVFJFQU0kIHwgYXN5bmMpIGFzIGRhdGFcIiBjbGFzcz1cImNvbnRhaW5lclwiPlxuICAgICAgICA8dGFibGUgbWF0LXRhYmxlIFtkYXRhU291cmNlXT1cImRhdGFcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImlkXCI+XG4gICAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPiBJRCA8L3RoPlxuICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj4ge3tlbGVtZW50LmlkfX0gPC90ZD5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwibmFtZVwiPlxuICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj4gRmlyc3QgTmFtZSA8L3RoPlxuICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj4ge3tlbGVtZW50Lm5hbWV9fSA8L3RkPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJsYXN0TmFtZVwiPlxuICAgICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj4gTGFzdCBOYW1lIDwvdGg+XG4gICAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgZWxlbWVudFwiPiB7e2VsZW1lbnQubGFzdE5hbWV9fSA8L3RkPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJhZ2VcIj5cbiAgICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+IEFnZSA8L3RoPlxuICAgICAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IGVsZW1lbnRcIj4ge3tlbGVtZW50LmFnZX19IDwvdGQ+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICA8dHIgbWF0LWhlYWRlci1yb3cgKm1hdEhlYWRlclJvd0RlZj1cImRpc3BsYXllZENvbHVtbnNcIj48L3RyPlxuICAgICAgICAgIDx0ciBtYXQtcm93ICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBkaXNwbGF5ZWRDb2x1bW5zO1wiPjwvdHI+XG4gICAgICAgIDwvdGFibGU+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICA8L2Rpdj5cblxuPC9kaXY+XG4iXX0=
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
2
|
-
import { DataType, DatabaseStorage } from '../../../models';
|
|
3
|
-
import { HTTPManagerStateService, ApiRequest, RequestOptions } from '../../../services';
|
|
4
|
-
import { ClientInfo } from '../../request-manager-demo/models/sample-client-info';
|
|
5
|
-
import { ClientInfoMapper } from '../../request-manager-demo/models/sample-mapper-client-info';
|
|
6
|
-
import * as i0 from "@angular/core";
|
|
7
|
-
export class StateManagerDemoService extends HTTPManagerStateService {
|
|
8
|
-
constructor() {
|
|
9
|
-
super(ApiRequest.adapt({
|
|
10
|
-
server: "",
|
|
11
|
-
path: [],
|
|
12
|
-
headers: {},
|
|
13
|
-
adapter: ClientInfo.adapt,
|
|
14
|
-
mapper: ClientInfoMapper.adapt,
|
|
15
|
-
stream: false,
|
|
16
|
-
}), DataType.ARRAY, DatabaseStorage.adapt());
|
|
17
|
-
}
|
|
18
|
-
setAPIOptions(apiOptions, dataType, database) {
|
|
19
|
-
this.setApiRequestOptions(apiOptions, dataType, database);
|
|
20
|
-
}
|
|
21
|
-
getClients() {
|
|
22
|
-
// const headers = {
|
|
23
|
-
// auth: "sample-auth-token"
|
|
24
|
-
// }
|
|
25
|
-
// const sampleOptions = RequestOptions.adapt({ path: ["id", 12], headers, sample: true })
|
|
26
|
-
this.fetchRecords();
|
|
27
|
-
}
|
|
28
|
-
createClient(data) {
|
|
29
|
-
// const headers = {
|
|
30
|
-
// auth: "sample-auth-token"
|
|
31
|
-
// }
|
|
32
|
-
// const sampleOptions = RequestOptions.adapt({ path: ["id", 12], headers, sample: true })
|
|
33
|
-
this.createRecord(data);
|
|
34
|
-
}
|
|
35
|
-
updateClient(data) {
|
|
36
|
-
// const headers = {
|
|
37
|
-
// auth: "sample-auth-token"
|
|
38
|
-
// }
|
|
39
|
-
data.id = 1031;
|
|
40
|
-
const sampleOptions = RequestOptions.adapt({ path: [data.id] });
|
|
41
|
-
this.updateRecord(data, sampleOptions);
|
|
42
|
-
}
|
|
43
|
-
deleteClient(data) {
|
|
44
|
-
// const headers = {
|
|
45
|
-
// auth: "sample-auth-token"
|
|
46
|
-
// }
|
|
47
|
-
data.id = 1031;
|
|
48
|
-
const sampleOptions = RequestOptions.adapt({ path: [data.id] });
|
|
49
|
-
this.deleteRecord(sampleOptions);
|
|
50
|
-
}
|
|
51
|
-
streamRequest() {
|
|
52
|
-
const headers = {
|
|
53
|
-
auth: "sample-auth-token"
|
|
54
|
-
};
|
|
55
|
-
// const sampleOptions = RequestOptions.adapt({ path: [1], headers })
|
|
56
|
-
this.fetchStream();
|
|
57
|
-
}
|
|
58
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: StateManagerDemoService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
59
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: StateManagerDemoService, providedIn: 'root' }); }
|
|
60
|
-
}
|
|
61
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: StateManagerDemoService, decorators: [{
|
|
62
|
-
type: Injectable,
|
|
63
|
-
args: [{
|
|
64
|
-
providedIn: 'root'
|
|
65
|
-
}]
|
|
66
|
-
}], ctorParameters: () => [] });
|
|
67
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGUtbWFuYWdlci1kZW1vLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9odHRwLXJlcXVlc3QtbWFuYWdlci9zcmMvbGliL2h0dHAtcmVxdWVzdC1zZXJ2aWNlcy1kZW1vL3JlcXVlc3QtbWFuYWdlci1zdGF0ZS1kZW1vL3NlcnZpY2VzL3N0YXRlLW1hbmFnZXItZGVtby5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxlQUFlLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRXhGLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzREFBc0QsQ0FBQztBQUNsRixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw2REFBNkQsQ0FBQzs7QUFLL0YsTUFBTSxPQUFPLHVCQUF3QixTQUFRLHVCQUE0QjtJQUV2RTtRQUNFLEtBQUssQ0FDSCxVQUFVLENBQUMsS0FBSyxDQUFDO1lBQ2YsTUFBTSxFQUFFLEVBQUU7WUFDVixJQUFJLEVBQUUsRUFBRTtZQUNSLE9BQU8sRUFBRSxFQUFFO1lBQ1gsT0FBTyxFQUFFLFVBQVUsQ0FBQyxLQUFLO1lBQ3pCLE1BQU0sRUFBRSxnQkFBZ0IsQ0FBQyxLQUFLO1lBQzlCLE1BQU0sRUFBRSxLQUFLO1NBQ2QsQ0FBQyxFQUNGLFFBQVEsQ0FBQyxLQUFLLEVBQ2QsZUFBZSxDQUFDLEtBQUssRUFBRSxDQUN4QixDQUFBO0lBQ0gsQ0FBQztJQUVELGFBQWEsQ0FBQyxVQUFzQixFQUFFLFFBQWtCLEVBQUUsUUFBMEI7UUFDbEYsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFVBQVUsRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUE7SUFDM0QsQ0FBQztJQUVELFVBQVU7UUFFUixvQkFBb0I7UUFDcEIsOEJBQThCO1FBQzlCLElBQUk7UUFDSiwwRkFBMEY7UUFDMUYsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFBO0lBRXJCLENBQUM7SUFFRCxZQUFZLENBQUMsSUFBUztRQUVwQixvQkFBb0I7UUFDcEIsOEJBQThCO1FBQzlCLElBQUk7UUFFSiwwRkFBMEY7UUFDMUYsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUV6QixDQUFDO0lBRUQsWUFBWSxDQUFDLElBQWdCO1FBRTNCLG9CQUFvQjtRQUNwQiw4QkFBOEI7UUFDOUIsSUFBSTtRQUNKLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFBO1FBQ2QsTUFBTSxhQUFhLEdBQUcsY0FBYyxDQUFDLEtBQUssQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDL0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsYUFBYSxDQUFDLENBQUE7SUFFeEMsQ0FBQztJQUVELFlBQVksQ0FBQyxJQUFnQjtRQUUzQixvQkFBb0I7UUFDcEIsOEJBQThCO1FBQzlCLElBQUk7UUFFSixJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQTtRQUNkLE1BQU0sYUFBYSxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBQy9ELElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLENBQUE7SUFFbEMsQ0FBQztJQUVELGFBQWE7UUFFWCxNQUFNLE9BQU8sR0FBRztZQUNkLElBQUksRUFBRSxtQkFBbUI7U0FDMUIsQ0FBQTtRQUVELHFFQUFxRTtRQUNyRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUE7SUFFcEIsQ0FBQzsrR0ExRVUsdUJBQXVCO21IQUF2Qix1QkFBdUIsY0FGdEIsTUFBTTs7NEZBRVAsdUJBQXVCO2tCQUhuQyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgRGF0YVR5cGUsIERhdGFiYXNlU3RvcmFnZSB9IGZyb20gJy4uLy4uLy4uL21vZGVscyc7XG5pbXBvcnQgeyBIVFRQTWFuYWdlclN0YXRlU2VydmljZSwgQXBpUmVxdWVzdCwgUmVxdWVzdE9wdGlvbnMgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcyc7XG5cbmltcG9ydCB7IENsaWVudEluZm8gfSBmcm9tICcuLi8uLi9yZXF1ZXN0LW1hbmFnZXItZGVtby9tb2RlbHMvc2FtcGxlLWNsaWVudC1pbmZvJztcbmltcG9ydCB7IENsaWVudEluZm9NYXBwZXIgfSBmcm9tICcuLi8uLi9yZXF1ZXN0LW1hbmFnZXItZGVtby9tb2RlbHMvc2FtcGxlLW1hcHBlci1jbGllbnQtaW5mbyc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFN0YXRlTWFuYWdlckRlbW9TZXJ2aWNlIGV4dGVuZHMgSFRUUE1hbmFnZXJTdGF0ZVNlcnZpY2U8YW55PiB7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoXG4gICAgICBBcGlSZXF1ZXN0LmFkYXB0KHtcbiAgICAgICAgc2VydmVyOiBcIlwiLFxuICAgICAgICBwYXRoOiBbXSxcbiAgICAgICAgaGVhZGVyczoge30sXG4gICAgICAgIGFkYXB0ZXI6IENsaWVudEluZm8uYWRhcHQsXG4gICAgICAgIG1hcHBlcjogQ2xpZW50SW5mb01hcHBlci5hZGFwdCxcbiAgICAgICAgc3RyZWFtOiBmYWxzZSxcbiAgICAgIH0pLFxuICAgICAgRGF0YVR5cGUuQVJSQVksXG4gICAgICBEYXRhYmFzZVN0b3JhZ2UuYWRhcHQoKVxuICAgIClcbiAgfVxuXG4gIHNldEFQSU9wdGlvbnMoYXBpT3B0aW9uczogQXBpUmVxdWVzdCwgZGF0YVR5cGU6IERhdGFUeXBlLCBkYXRhYmFzZT86IERhdGFiYXNlU3RvcmFnZSkge1xuICAgIHRoaXMuc2V0QXBpUmVxdWVzdE9wdGlvbnMoYXBpT3B0aW9ucywgZGF0YVR5cGUsIGRhdGFiYXNlKVxuICB9XG5cbiAgZ2V0Q2xpZW50cygpIHtcblxuICAgIC8vIGNvbnN0IGhlYWRlcnMgPSB7XG4gICAgLy8gICBhdXRoOiBcInNhbXBsZS1hdXRoLXRva2VuXCJcbiAgICAvLyB9XG4gICAgLy8gY29uc3Qgc2FtcGxlT3B0aW9ucyA9IFJlcXVlc3RPcHRpb25zLmFkYXB0KHsgcGF0aDogW1wiaWRcIiwgMTJdLCBoZWFkZXJzLCBzYW1wbGU6IHRydWUgfSlcbiAgICB0aGlzLmZldGNoUmVjb3JkcygpXG5cbiAgfVxuXG4gIGNyZWF0ZUNsaWVudChkYXRhOiBhbnkpIHtcblxuICAgIC8vIGNvbnN0IGhlYWRlcnMgPSB7XG4gICAgLy8gICBhdXRoOiBcInNhbXBsZS1hdXRoLXRva2VuXCJcbiAgICAvLyB9XG5cbiAgICAvLyBjb25zdCBzYW1wbGVPcHRpb25zID0gUmVxdWVzdE9wdGlvbnMuYWRhcHQoeyBwYXRoOiBbXCJpZFwiLCAxMl0sIGhlYWRlcnMsIHNhbXBsZTogdHJ1ZSB9KVxuICAgIHRoaXMuY3JlYXRlUmVjb3JkKGRhdGEpXG5cbiAgfVxuXG4gIHVwZGF0ZUNsaWVudChkYXRhOiBDbGllbnRJbmZvKSB7XG5cbiAgICAvLyBjb25zdCBoZWFkZXJzID0ge1xuICAgIC8vICAgYXV0aDogXCJzYW1wbGUtYXV0aC10b2tlblwiXG4gICAgLy8gfVxuICAgIGRhdGEuaWQgPSAxMDMxXG4gICAgY29uc3Qgc2FtcGxlT3B0aW9ucyA9IFJlcXVlc3RPcHRpb25zLmFkYXB0KHsgcGF0aDogW2RhdGEuaWRdIH0pXG4gICAgdGhpcy51cGRhdGVSZWNvcmQoZGF0YSwgc2FtcGxlT3B0aW9ucylcblxuICB9XG5cbiAgZGVsZXRlQ2xpZW50KGRhdGE6IENsaWVudEluZm8pIHtcblxuICAgIC8vIGNvbnN0IGhlYWRlcnMgPSB7XG4gICAgLy8gICBhdXRoOiBcInNhbXBsZS1hdXRoLXRva2VuXCJcbiAgICAvLyB9XG5cbiAgICBkYXRhLmlkID0gMTAzMVxuICAgIGNvbnN0IHNhbXBsZU9wdGlvbnMgPSBSZXF1ZXN0T3B0aW9ucy5hZGFwdCh7IHBhdGg6IFtkYXRhLmlkXSB9KVxuICAgIHRoaXMuZGVsZXRlUmVjb3JkKHNhbXBsZU9wdGlvbnMpXG5cbiAgfVxuXG4gIHN0cmVhbVJlcXVlc3QoKSB7XG5cbiAgICBjb25zdCBoZWFkZXJzID0ge1xuICAgICAgYXV0aDogXCJzYW1wbGUtYXV0aC10b2tlblwiXG4gICAgfVxuXG4gICAgLy8gY29uc3Qgc2FtcGxlT3B0aW9ucyA9IFJlcXVlc3RPcHRpb25zLmFkYXB0KHsgcGF0aDogWzFdLCBoZWFkZXJzIH0pXG4gICAgdGhpcy5mZXRjaFN0cmVhbSgpXG5cbiAgfVxuXG59XG4iXX0=
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
export class AIPrompt {
|
|
2
|
-
constructor(response = '') {
|
|
3
|
-
this.response = response;
|
|
4
|
-
}
|
|
5
|
-
static adapt(item) {
|
|
6
|
-
return new AIPrompt(item?.response);
|
|
7
|
-
}
|
|
8
|
-
}
|
|
9
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FtcGxlLWFpLXByb21wdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2h0dHAtcmVxdWVzdC1tYW5hZ2VyL3NyYy9saWIvaHR0cC1yZXF1ZXN0LXNlcnZpY2VzLWRlbW8vcmVxdWVzdC1zaWduYWxzLW1hbmFnZXItZGVtby9tb2RlbHMvc2FtcGxlLWFpLXByb21wdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFJQSxNQUFNLE9BQU8sUUFBUTtJQUVuQixZQUNTLFdBQVcsRUFBRTtRQUFiLGFBQVEsR0FBUixRQUFRLENBQUs7SUFDbkIsQ0FBQztJQUVKLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBVTtRQUVyQixPQUFPLElBQUksUUFBUSxDQUNqQixJQUFJLEVBQUUsUUFBUSxDQUNmLENBQUE7SUFFSCxDQUFDO0NBRUYiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgaW50ZXJmYWNlIEFJUHJvbXB0SW50ZXJmYWNlIHtcbiAgcmVzcG9uc2U6IHN0cmluZ1xufVxuXG5leHBvcnQgY2xhc3MgQUlQcm9tcHQgaW1wbGVtZW50cyBBSVByb21wdEludGVyZmFjZSB7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHJlc3BvbnNlID0gJycsXG4gICkge31cblxuICBzdGF0aWMgYWRhcHQoaXRlbT86IGFueSk6IEFJUHJvbXB0IHtcblxuICAgIHJldHVybiBuZXcgQUlQcm9tcHQoXG4gICAgICBpdGVtPy5yZXNwb25zZSxcbiAgICApXG5cbiAgfVxuXG59XG4iXX0=
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
export class ClientInfo {
|
|
2
|
-
constructor(domain = '', service = '', id = 0, name = '') {
|
|
3
|
-
this.domain = domain;
|
|
4
|
-
this.service = service;
|
|
5
|
-
this.id = id;
|
|
6
|
-
this.name = name;
|
|
7
|
-
}
|
|
8
|
-
static adapt(item) {
|
|
9
|
-
return new ClientInfo(item?.domain, item?.service, item?.id, (item?.first_name || item?.last_name) ? `${item?.first_name} ${item?.last_name}` : '');
|
|
10
|
-
}
|
|
11
|
-
}
|
|
12
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FtcGxlLWNsaWVudC1pbmZvLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvaHR0cC1yZXF1ZXN0LW1hbmFnZXIvc3JjL2xpYi9odHRwLXJlcXVlc3Qtc2VydmljZXMtZGVtby9yZXF1ZXN0LXNpZ25hbHMtbWFuYWdlci1kZW1vL21vZGVscy9zYW1wbGUtY2xpZW50LWluZm8udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBT0EsTUFBTSxPQUFPLFVBQVU7SUFFckIsWUFDUyxTQUFTLEVBQUUsRUFDWCxVQUFVLEVBQUUsRUFDWixLQUFLLENBQUMsRUFDTixPQUFPLEVBQUU7UUFIVCxXQUFNLEdBQU4sTUFBTSxDQUFLO1FBQ1gsWUFBTyxHQUFQLE9BQU8sQ0FBSztRQUNaLE9BQUUsR0FBRixFQUFFLENBQUk7UUFDTixTQUFJLEdBQUosSUFBSSxDQUFLO0lBQ2YsQ0FBQztJQUVKLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBVTtRQUVyQixPQUFPLElBQUksVUFBVSxDQUNuQixJQUFJLEVBQUUsTUFBTSxFQUNaLElBQUksRUFBRSxPQUFPLEVBQ2IsSUFBSSxFQUFFLEVBQUUsRUFDUixDQUFDLElBQUksRUFBRSxVQUFVLElBQUksSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksRUFBRSxVQUFVLElBQUksSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQ3RGLENBQUE7SUFFSCxDQUFDO0NBRUYiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgaW50ZXJmYWNlIENsaWVudEluZm9JbnRlcmZhY2Uge1xuICBkb21haW46IHN0cmluZ1xuICBzZXJ2aWNlOiBzdHJpbmdcbiAgaWQ6IG51bWJlclxuICBuYW1lOiBzdHJpbmdcbn1cblxuZXhwb3J0IGNsYXNzIENsaWVudEluZm8gaW1wbGVtZW50cyBDbGllbnRJbmZvSW50ZXJmYWNlIHtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgZG9tYWluID0gJycsXG4gICAgcHVibGljIHNlcnZpY2UgPSAnJyxcbiAgICBwdWJsaWMgaWQgPSAwLFxuICAgIHB1YmxpYyBuYW1lID0gJycsXG4gICkge31cblxuICBzdGF0aWMgYWRhcHQoaXRlbT86IGFueSk6IENsaWVudEluZm8ge1xuXG4gICAgcmV0dXJuIG5ldyBDbGllbnRJbmZvKFxuICAgICAgaXRlbT8uZG9tYWluLFxuICAgICAgaXRlbT8uc2VydmljZSxcbiAgICAgIGl0ZW0/LmlkLFxuICAgICAgKGl0ZW0/LmZpcnN0X25hbWUgfHwgaXRlbT8ubGFzdF9uYW1lKSA/IGAke2l0ZW0/LmZpcnN0X25hbWV9ICR7aXRlbT8ubGFzdF9uYW1lfWAgOiAnJyxcbiAgICApXG5cbiAgfVxuXG59XG5cblxuIl19
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
export class ClientInfoMapper {
|
|
2
|
-
constructor(id = 0, first_name = '', last_name = '', email = '') {
|
|
3
|
-
this.id = id;
|
|
4
|
-
this.first_name = first_name;
|
|
5
|
-
this.last_name = last_name;
|
|
6
|
-
this.email = email;
|
|
7
|
-
}
|
|
8
|
-
static adapt(item) {
|
|
9
|
-
const first_name = (item?.name) ? item.name.split(' ')[0] : '';
|
|
10
|
-
const last_name = (item?.name) ? item.name.split(' ')[1] : '';
|
|
11
|
-
return new ClientInfoMapper(item?.id, first_name, last_name, item?.email);
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FtcGxlLW1hcHBlci1jbGllbnQtaW5mby5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2h0dHAtcmVxdWVzdC1tYW5hZ2VyL3NyYy9saWIvaHR0cC1yZXF1ZXN0LXNlcnZpY2VzLWRlbW8vcmVxdWVzdC1zaWduYWxzLW1hbmFnZXItZGVtby9tb2RlbHMvc2FtcGxlLW1hcHBlci1jbGllbnQtaW5mby50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFPQSxNQUFNLE9BQU8sZ0JBQWdCO0lBRTNCLFlBQ1MsS0FBSyxDQUFDLEVBQ04sYUFBYSxFQUFFLEVBQ2YsWUFBWSxFQUFFLEVBQ2QsUUFBUSxFQUFFO1FBSFYsT0FBRSxHQUFGLEVBQUUsQ0FBSTtRQUNOLGVBQVUsR0FBVixVQUFVLENBQUs7UUFDZixjQUFTLEdBQVQsU0FBUyxDQUFLO1FBQ2QsVUFBSyxHQUFMLEtBQUssQ0FBSztJQUNoQixDQUFDO0lBRUosTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFVO1FBRXJCLE1BQU0sVUFBVSxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFBO1FBQzlELE1BQU0sU0FBUyxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFBO1FBRTdELE9BQU8sSUFBSSxnQkFBZ0IsQ0FDekIsSUFBSSxFQUFFLEVBQUUsRUFDUixVQUFVLEVBQ1YsU0FBUyxFQUNULElBQUksRUFBRSxLQUFLLENBQ1osQ0FBQTtJQUVILENBQUM7Q0FFRiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBpbnRlcmZhY2UgQ2xpZW50SW5mb01hcHBlckludGVyZmFjZSB7XG4gIGlkOiBudW1iZXJcbiAgZmlyc3RfbmFtZTogc3RyaW5nXG4gIGxhc3RfbmFtZTogc3RyaW5nXG4gIGVtYWlsOiBzdHJpbmdcbn1cblxuZXhwb3J0IGNsYXNzIENsaWVudEluZm9NYXBwZXIgaW1wbGVtZW50cyBDbGllbnRJbmZvTWFwcGVySW50ZXJmYWNlIHtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgaWQgPSAwLFxuICAgIHB1YmxpYyBmaXJzdF9uYW1lID0gJycsXG4gICAgcHVibGljIGxhc3RfbmFtZSA9ICcnLFxuICAgIHB1YmxpYyBlbWFpbCA9ICcnLFxuICApIHt9XG5cbiAgc3RhdGljIGFkYXB0KGl0ZW0/OiBhbnkpOiBDbGllbnRJbmZvTWFwcGVyIHtcblxuICAgIGNvbnN0IGZpcnN0X25hbWUgPSAoaXRlbT8ubmFtZSkgPyBpdGVtLm5hbWUuc3BsaXQoJyAnKVswXSA6ICcnXG4gICAgY29uc3QgbGFzdF9uYW1lID0gKGl0ZW0/Lm5hbWUpID8gaXRlbS5uYW1lLnNwbGl0KCcgJylbMV0gOiAnJ1xuXG4gICAgcmV0dXJuIG5ldyBDbGllbnRJbmZvTWFwcGVyKFxuICAgICAgaXRlbT8uaWQsXG4gICAgICBmaXJzdF9uYW1lLFxuICAgICAgbGFzdF9uYW1lLFxuICAgICAgaXRlbT8uZW1haWwsXG4gICAgKVxuXG4gIH1cblxufVxuXG5cbiJdfQ==
|