uitec-ng-header 1.1.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -182
- package/esm2020/lib/ui-header.component.mjs +20 -26
- package/esm2020/lib/ui-header.module.mjs +4 -10
- package/esm2020/public-api.mjs +1 -17
- package/fesm2015/uitec-ng-header.mjs +24 -1808
- package/fesm2015/uitec-ng-header.mjs.map +1 -1
- package/fesm2020/uitec-ng-header.mjs +24 -1771
- package/fesm2020/uitec-ng-header.mjs.map +1 -1
- package/lib/ui-header.component.d.ts +8 -11
- package/lib/ui-header.module.d.ts +1 -2
- package/package.json +2 -3
- package/public-api.d.ts +0 -15
- package/esm2020/lib/assistant/components/assistant-action-card/ui-assistant-action-card.component.mjs +0 -102
- package/esm2020/lib/assistant/components/assistant-button/ui-assistant-button.component.mjs +0 -18
- package/esm2020/lib/assistant/components/assistant-composer/ui-assistant-composer.component.mjs +0 -79
- package/esm2020/lib/assistant/components/assistant-layout/ui-assistant-layout.component.mjs +0 -140
- package/esm2020/lib/assistant/components/assistant-messages/ui-assistant-messages.component.mjs +0 -144
- package/esm2020/lib/assistant/components/assistant-panel/ui-assistant-panel.component.mjs +0 -156
- package/esm2020/lib/assistant/components/assistant-text/ui-assistant-text.component.mjs +0 -26
- package/esm2020/lib/assistant/models/uiny-api.models.mjs +0 -12
- package/esm2020/lib/assistant/models/uiny.models.mjs +0 -2
- package/esm2020/lib/assistant/services/ui-assistant.service.mjs +0 -137
- package/esm2020/lib/assistant/services/uiny-api.service.mjs +0 -149
- package/esm2020/lib/assistant/services/uiny-chat.service.mjs +0 -368
- package/esm2020/lib/assistant/services/uiny-session.service.mjs +0 -74
- package/esm2020/lib/assistant/ui-assistant.module.mjs +0 -59
- package/esm2020/lib/assistant/uiny.config.mjs +0 -53
- package/esm2020/lib/assistant/utils/uiny-api.adapter.mjs +0 -154
- package/esm2020/lib/assistant/utils/uiny-contexto.mjs +0 -43
- package/esm2020/lib/assistant/utils/uiny-markdown.mjs +0 -122
- package/lib/assistant/components/assistant-action-card/ui-assistant-action-card.component.d.ts +0 -33
- package/lib/assistant/components/assistant-button/ui-assistant-button.component.d.ts +0 -9
- package/lib/assistant/components/assistant-composer/ui-assistant-composer.component.d.ts +0 -24
- package/lib/assistant/components/assistant-layout/ui-assistant-layout.component.d.ts +0 -51
- package/lib/assistant/components/assistant-messages/ui-assistant-messages.component.d.ts +0 -38
- package/lib/assistant/components/assistant-panel/ui-assistant-panel.component.d.ts +0 -53
- package/lib/assistant/components/assistant-text/ui-assistant-text.component.d.ts +0 -14
- package/lib/assistant/models/uiny-api.models.d.ts +0 -109
- package/lib/assistant/models/uiny.models.d.ts +0 -104
- package/lib/assistant/services/ui-assistant.service.d.ts +0 -55
- package/lib/assistant/services/uiny-api.service.d.ts +0 -38
- package/lib/assistant/services/uiny-chat.service.d.ts +0 -82
- package/lib/assistant/services/uiny-session.service.d.ts +0 -38
- package/lib/assistant/ui-assistant.module.d.ts +0 -19
- package/lib/assistant/uiny.config.d.ts +0 -31
- package/lib/assistant/utils/uiny-api.adapter.d.ts +0 -22
- package/lib/assistant/utils/uiny-contexto.d.ts +0 -7
- package/lib/assistant/utils/uiny-markdown.d.ts +0 -37
|
@@ -1,137 +0,0 @@
|
|
|
1
|
-
import { Inject, Injectable, isDevMode, Optional } from '@angular/core';
|
|
2
|
-
import { BehaviorSubject, combineLatest, Subject } from 'rxjs';
|
|
3
|
-
import { distinctUntilChanged, map, shareReplay } from 'rxjs/operators';
|
|
4
|
-
import { UINY_CONFIG } from '../uiny.config';
|
|
5
|
-
import { normalizarContexto, mesmoContexto } from '../utils/uiny-contexto';
|
|
6
|
-
import { UinyApiService } from './uiny-api.service';
|
|
7
|
-
import { UinySessionService } from './uiny-session.service';
|
|
8
|
-
import * as i0 from "@angular/core";
|
|
9
|
-
import * as i1 from "./uiny-session.service";
|
|
10
|
-
import * as i2 from "./uiny-api.service";
|
|
11
|
-
/**
|
|
12
|
-
* Estado compartilhado da Uiny: quem habilitou (o header), quem hospeda o painel
|
|
13
|
-
* (o ui-assistant-layout), se está aberto, o contexto da tela e os eventos de saída.
|
|
14
|
-
*
|
|
15
|
-
* O painel só fica disponível quando TODAS as condições valem:
|
|
16
|
-
* - algum ui-header está com [showAssistant]="true";
|
|
17
|
-
* - existe um ui-assistant-layout na página para receber o painel;
|
|
18
|
-
* - há sessão autenticada no AuthService (e a API não a recusou);
|
|
19
|
-
* - a URL da API está configurada.
|
|
20
|
-
*/
|
|
21
|
-
export class UiAssistantService {
|
|
22
|
-
constructor(session, api, config) {
|
|
23
|
-
this.session = session;
|
|
24
|
-
this.api = api;
|
|
25
|
-
this.config = config;
|
|
26
|
-
this.habilitadores$ = new BehaviorSubject(new Set());
|
|
27
|
-
this.hosts$ = new BehaviorSubject(0);
|
|
28
|
-
this.abertoInterno$ = new BehaviorSubject(false);
|
|
29
|
-
this.contextoInterno$ = new BehaviorSubject({});
|
|
30
|
-
this.eventosInternos$ = new Subject();
|
|
31
|
-
this.gatilho = null;
|
|
32
|
-
this.avisouSemHost = false;
|
|
33
|
-
this.contexto$ = this.contextoInterno$.pipe(distinctUntilChanged(mesmoContexto));
|
|
34
|
-
/** Ações concluídas e instruções de interface vindas da API, já validadas. */
|
|
35
|
-
this.eventos$ = this.eventosInternos$.asObservable();
|
|
36
|
-
this.disponivel$ = combineLatest([this.habilitadores$, this.hosts$, this.session.sessao$]).pipe(map(([habilitadores, hosts, sessao]) => habilitadores.size > 0 && hosts > 0 && !!sessao && this.api.configurada && !!this.config), distinctUntilChanged(), shareReplay({ bufferSize: 1, refCount: false }));
|
|
37
|
-
this.aberto$ = combineLatest([this.abertoInterno$, this.disponivel$]).pipe(map(([aberto, disponivel]) => aberto && disponivel), distinctUntilChanged(), shareReplay({ bufferSize: 1, refCount: false }));
|
|
38
|
-
// Indisponível (logout, sessão recusada, header sem a flag): fecha sem devolver foco.
|
|
39
|
-
this.disponivel$.subscribe(disponivel => {
|
|
40
|
-
if (!disponivel && this.abertoInterno$.value) {
|
|
41
|
-
this.gatilho = null;
|
|
42
|
-
this.abertoInterno$.next(false);
|
|
43
|
-
}
|
|
44
|
-
});
|
|
45
|
-
combineLatest([this.habilitadores$, this.hosts$]).subscribe(([habilitadores, hosts]) => this.diagnosticar(habilitadores.size > 0, hosts));
|
|
46
|
-
}
|
|
47
|
-
get aberto() {
|
|
48
|
-
return this.abertoInterno$.value;
|
|
49
|
-
}
|
|
50
|
-
get sistemaOrigem() {
|
|
51
|
-
return this.config?.sistemaOrigem ?? null;
|
|
52
|
-
}
|
|
53
|
-
abrir(gatilho) {
|
|
54
|
-
if (gatilho)
|
|
55
|
-
this.gatilho = gatilho;
|
|
56
|
-
this.abertoInterno$.next(true);
|
|
57
|
-
}
|
|
58
|
-
/** Fecha o painel e devolve o foco ao botão que o abriu, se ele ainda existir. */
|
|
59
|
-
fechar(devolverFoco = true) {
|
|
60
|
-
if (!this.abertoInterno$.value)
|
|
61
|
-
return;
|
|
62
|
-
this.abertoInterno$.next(false);
|
|
63
|
-
const gatilho = this.gatilho;
|
|
64
|
-
this.gatilho = null;
|
|
65
|
-
if (devolverFoco && gatilho) {
|
|
66
|
-
// espera o layout reexibir a aplicação (no celular ela fica recolhida)
|
|
67
|
-
setTimeout(() => gatilho.isConnected && gatilho.focus());
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
alternar(gatilho) {
|
|
71
|
-
this.abertoInterno$.value ? this.fechar() : this.abrir(gatilho);
|
|
72
|
-
}
|
|
73
|
-
/** Substitui o contexto da tela atual. Campos fora do tipo UinyContexto são ignorados. */
|
|
74
|
-
definirContexto(contexto) {
|
|
75
|
-
this.contextoInterno$.next(normalizarContexto(contexto));
|
|
76
|
-
}
|
|
77
|
-
/** Altera apenas os campos informados do contexto. */
|
|
78
|
-
atualizarContexto(parcial) {
|
|
79
|
-
this.contextoInterno$.next(normalizarContexto({ ...this.contextoInterno$.value, ...parcial }));
|
|
80
|
-
}
|
|
81
|
-
get contexto() {
|
|
82
|
-
return this.contextoInterno$.value;
|
|
83
|
-
}
|
|
84
|
-
/** @internal usado pelo ui-header */
|
|
85
|
-
definirHabilitado(origem, habilitado) {
|
|
86
|
-
const atual = new Set(this.habilitadores$.value);
|
|
87
|
-
habilitado ? atual.add(origem) : atual.delete(origem);
|
|
88
|
-
if (atual.size !== this.habilitadores$.value.size)
|
|
89
|
-
this.habilitadores$.next(atual);
|
|
90
|
-
}
|
|
91
|
-
/** @internal usado pelo ui-assistant-layout */
|
|
92
|
-
registrarHost() {
|
|
93
|
-
this.hosts$.next(this.hosts$.value + 1);
|
|
94
|
-
let removido = false;
|
|
95
|
-
return () => {
|
|
96
|
-
if (removido)
|
|
97
|
-
return;
|
|
98
|
-
removido = true;
|
|
99
|
-
this.hosts$.next(Math.max(0, this.hosts$.value - 1));
|
|
100
|
-
};
|
|
101
|
-
}
|
|
102
|
-
/** @internal usado pelo serviço de conversa */
|
|
103
|
-
emitir(evento) {
|
|
104
|
-
this.eventosInternos$.next(evento);
|
|
105
|
-
}
|
|
106
|
-
diagnosticar(habilitado, hosts) {
|
|
107
|
-
if (!isDevMode() || !habilitado)
|
|
108
|
-
return;
|
|
109
|
-
if (!this.config) {
|
|
110
|
-
console.error('[Uiny] showAssistant está ativo, mas UiAssistantModule.forRoot({ sistemaOrigem }) não foi importado.');
|
|
111
|
-
}
|
|
112
|
-
else if (!this.api.configurada) {
|
|
113
|
-
console.error('[Uiny] URL da API não configurada. Informe APP_ENVIRONMENT.domain.uiny ou forRoot({ apiUrl }).');
|
|
114
|
-
}
|
|
115
|
-
else if (hosts === 0 && !this.avisouSemHost) {
|
|
116
|
-
// o layout pode ser criado logo depois do header; avisa só se continuar faltando
|
|
117
|
-
this.avisouSemHost = true;
|
|
118
|
-
setTimeout(() => {
|
|
119
|
-
if (this.hosts$.value === 0) {
|
|
120
|
-
console.warn('[Uiny] showAssistant está ativo, mas nenhum <ui-assistant-layout> envolve a aplicação. O botão fica oculto.');
|
|
121
|
-
}
|
|
122
|
-
}, 2000);
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
UiAssistantService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: UiAssistantService, deps: [{ token: i1.UinySessionService }, { token: i2.UinyApiService }, { token: UINY_CONFIG, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
127
|
-
UiAssistantService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: UiAssistantService, providedIn: 'root' });
|
|
128
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: UiAssistantService, decorators: [{
|
|
129
|
-
type: Injectable,
|
|
130
|
-
args: [{ providedIn: 'root' }]
|
|
131
|
-
}], ctorParameters: function () { return [{ type: i1.UinySessionService }, { type: i2.UinyApiService }, { type: undefined, decorators: [{
|
|
132
|
-
type: Optional
|
|
133
|
-
}, {
|
|
134
|
-
type: Inject,
|
|
135
|
-
args: [UINY_CONFIG]
|
|
136
|
-
}] }]; } });
|
|
137
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidWktYXNzaXN0YW50LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS1oZWFkZXIvc3JjL2xpYi9hc3Npc3RhbnQvc2VydmljZXMvdWktYXNzaXN0YW50LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4RSxPQUFPLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDM0UsT0FBTyxFQUFFLG9CQUFvQixFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4RSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzNFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7OztBQUU1RDs7Ozs7Ozs7O0dBU0c7QUFFSCxNQUFNLE9BQU8sa0JBQWtCO0lBa0IzQixZQUNZLE9BQTJCLEVBQzNCLEdBQW1CLEVBQ2MsTUFBeUI7UUFGMUQsWUFBTyxHQUFQLE9BQU8sQ0FBb0I7UUFDM0IsUUFBRyxHQUFILEdBQUcsQ0FBZ0I7UUFDYyxXQUFNLEdBQU4sTUFBTSxDQUFtQjtRQW5CckQsbUJBQWMsR0FBRyxJQUFJLGVBQWUsQ0FBc0IsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ3JFLFdBQU0sR0FBRyxJQUFJLGVBQWUsQ0FBUyxDQUFDLENBQUMsQ0FBQztRQUN4QyxtQkFBYyxHQUFHLElBQUksZUFBZSxDQUFVLEtBQUssQ0FBQyxDQUFDO1FBQ3JELHFCQUFnQixHQUFHLElBQUksZUFBZSxDQUFlLEVBQUUsQ0FBQyxDQUFDO1FBQ3pELHFCQUFnQixHQUFHLElBQUksT0FBTyxFQUFjLENBQUM7UUFDdEQsWUFBTyxHQUF1QixJQUFJLENBQUM7UUFDbkMsa0JBQWEsR0FBRyxLQUFLLENBQUM7UUFNckIsY0FBUyxHQUE2QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7UUFDL0csOEVBQThFO1FBQ3JFLGFBQVEsR0FBMkIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFlBQVksRUFBRSxDQUFDO1FBTzdFLElBQUksQ0FBQyxXQUFXLEdBQUcsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQzNGLEdBQUcsQ0FBQyxDQUFDLENBQUMsYUFBYSxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUMsYUFBYSxDQUFDLElBQUksR0FBRyxDQUFDLElBQUksS0FBSyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQ2pJLG9CQUFvQixFQUFFLEVBQ3RCLFdBQVcsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQ2xELENBQUM7UUFFRixJQUFJLENBQUMsT0FBTyxHQUFHLGFBQWEsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUN0RSxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsRUFBRSxFQUFFLENBQUMsTUFBTSxJQUFJLFVBQVUsQ0FBQyxFQUNuRCxvQkFBb0IsRUFBRSxFQUN0QixXQUFXLENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUNsRCxDQUFDO1FBRUYsc0ZBQXNGO1FBQ3RGLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQ3BDLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUU7Z0JBQzFDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO2dCQUNwQixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUNuQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsSUFBSSxHQUFHLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQzlJLENBQUM7SUFFRCxJQUFJLE1BQU07UUFDTixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDO0lBQ3JDLENBQUM7SUFFRCxJQUFJLGFBQWE7UUFDYixPQUFPLElBQUksQ0FBQyxNQUFNLEVBQUUsYUFBYSxJQUFJLElBQUksQ0FBQztJQUM5QyxDQUFDO0lBRUQsS0FBSyxDQUFDLE9BQTRCO1FBQzlCLElBQUksT0FBTztZQUFFLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRCxrRkFBa0Y7SUFDbEYsTUFBTSxDQUFDLFlBQVksR0FBRyxJQUFJO1FBQ3RCLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUs7WUFBRSxPQUFPO1FBQ3ZDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2hDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDN0IsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDcEIsSUFBSSxZQUFZLElBQUksT0FBTyxFQUFFO1lBQ3pCLHVFQUF1RTtZQUN2RSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLFdBQVcsSUFBSSxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztTQUM1RDtJQUNMLENBQUM7SUFFRCxRQUFRLENBQUMsT0FBNEI7UUFDakMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNwRSxDQUFDO0lBRUQsMEZBQTBGO0lBQzFGLGVBQWUsQ0FBQyxRQUE2QjtRQUN6QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVELHNEQUFzRDtJQUN0RCxpQkFBaUIsQ0FBQyxPQUE4QjtRQUM1QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLEdBQUcsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ25HLENBQUM7SUFFRCxJQUFJLFFBQVE7UUFDUixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUM7SUFDdkMsQ0FBQztJQUVELHFDQUFxQztJQUNyQyxpQkFBaUIsQ0FBQyxNQUFjLEVBQUUsVUFBbUI7UUFDakQsTUFBTSxLQUFLLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNqRCxVQUFVLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdEQsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLElBQUk7WUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN2RixDQUFDO0lBRUQsK0NBQStDO0lBQy9DLGFBQWE7UUFDVCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN4QyxJQUFJLFFBQVEsR0FBRyxLQUFLLENBQUM7UUFDckIsT0FBTyxHQUFHLEVBQUU7WUFDUixJQUFJLFFBQVE7Z0JBQUUsT0FBTztZQUNyQixRQUFRLEdBQUcsSUFBSSxDQUFDO1lBQ2hCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekQsQ0FBQyxDQUFDO0lBQ04sQ0FBQztJQUVELCtDQUErQztJQUMvQyxNQUFNLENBQUMsTUFBa0I7UUFDckIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRU8sWUFBWSxDQUFDLFVBQW1CLEVBQUUsS0FBYTtRQUNuRCxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxVQUFVO1lBQUUsT0FBTztRQUN4QyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNkLE9BQU8sQ0FBQyxLQUFLLENBQUMsc0dBQXNHLENBQUMsQ0FBQztTQUN6SDthQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRTtZQUM5QixPQUFPLENBQUMsS0FBSyxDQUFDLGdHQUFnRyxDQUFDLENBQUM7U0FDbkg7YUFBTSxJQUFJLEtBQUssS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQzNDLGlGQUFpRjtZQUNqRixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztZQUMxQixVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNaLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEtBQUssQ0FBQyxFQUFFO29CQUN6QixPQUFPLENBQUMsSUFBSSxDQUFDLDZHQUE2RyxDQUFDLENBQUM7aUJBQy9IO1lBQ0wsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQ1o7SUFDTCxDQUFDOztnSEEvSFEsa0JBQWtCLGtGQXFCSCxXQUFXO29IQXJCMUIsa0JBQWtCLGNBREwsTUFBTTs0RkFDbkIsa0JBQWtCO2tCQUQ5QixVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRTs7MEJBc0J6QixRQUFROzswQkFBSSxNQUFNOzJCQUFDLFdBQVciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIGlzRGV2TW9kZSwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgY29tYmluZUxhdGVzdCwgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGlzdGluY3RVbnRpbENoYW5nZWQsIG1hcCwgc2hhcmVSZXBsYXkgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBVaW55Q29uZmlnLCBVaW55Q29udGV4dG8sIFVpbnlFdmVudG8gfSBmcm9tICcuLi9tb2RlbHMvdWlueS5tb2RlbHMnO1xuaW1wb3J0IHsgVUlOWV9DT05GSUcgfSBmcm9tICcuLi91aW55LmNvbmZpZyc7XG5pbXBvcnQgeyBub3JtYWxpemFyQ29udGV4dG8sIG1lc21vQ29udGV4dG8gfSBmcm9tICcuLi91dGlscy91aW55LWNvbnRleHRvJztcbmltcG9ydCB7IFVpbnlBcGlTZXJ2aWNlIH0gZnJvbSAnLi91aW55LWFwaS5zZXJ2aWNlJztcbmltcG9ydCB7IFVpbnlTZXNzaW9uU2VydmljZSB9IGZyb20gJy4vdWlueS1zZXNzaW9uLnNlcnZpY2UnO1xuXG4vKipcbiAqIEVzdGFkbyBjb21wYXJ0aWxoYWRvIGRhIFVpbnk6IHF1ZW0gaGFiaWxpdG91IChvIGhlYWRlciksIHF1ZW0gaG9zcGVkYSBvIHBhaW5lbFxuICogKG8gdWktYXNzaXN0YW50LWxheW91dCksIHNlIGVzdMOhIGFiZXJ0bywgbyBjb250ZXh0byBkYSB0ZWxhIGUgb3MgZXZlbnRvcyBkZSBzYcOtZGEuXG4gKlxuICogTyBwYWluZWwgc8OzIGZpY2EgZGlzcG9uw612ZWwgcXVhbmRvIFRPREFTIGFzIGNvbmRpw6fDtWVzIHZhbGVtOlxuICogIC0gYWxndW0gdWktaGVhZGVyIGVzdMOhIGNvbSBbc2hvd0Fzc2lzdGFudF09XCJ0cnVlXCI7XG4gKiAgLSBleGlzdGUgdW0gdWktYXNzaXN0YW50LWxheW91dCBuYSBww6FnaW5hIHBhcmEgcmVjZWJlciBvIHBhaW5lbDtcbiAqICAtIGjDoSBzZXNzw6NvIGF1dGVudGljYWRhIG5vIEF1dGhTZXJ2aWNlIChlIGEgQVBJIG7Do28gYSByZWN1c291KTtcbiAqICAtIGEgVVJMIGRhIEFQSSBlc3TDoSBjb25maWd1cmFkYS5cbiAqL1xuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBVaUFzc2lzdGFudFNlcnZpY2Uge1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBoYWJpbGl0YWRvcmVzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8UmVhZG9ubHlTZXQ8b2JqZWN0Pj4obmV3IFNldCgpKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGhvc3RzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigwKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFiZXJ0b0ludGVybm8kID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBjb250ZXh0b0ludGVybm8kID0gbmV3IEJlaGF2aW9yU3ViamVjdDxVaW55Q29udGV4dG8+KHt9KTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGV2ZW50b3NJbnRlcm5vcyQgPSBuZXcgU3ViamVjdDxVaW55RXZlbnRvPigpO1xuICAgIHByaXZhdGUgZ2F0aWxobzogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgICBwcml2YXRlIGF2aXNvdVNlbUhvc3QgPSBmYWxzZTtcblxuICAgIC8qKiBIZWFkZXIgaGFiaWxpdG91IGUgaMOhIHVzdcOhcmlvIGF1dGVudGljYWRvIChjb250cm9sYSBvIGJvdMOjbykuICovXG4gICAgcmVhZG9ubHkgZGlzcG9uaXZlbCQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gICAgLyoqIFBhaW5lbCBhYmVydG8gKHNlbXByZSBmYWxzZSBxdWFuZG8gaW5kaXNwb27DrXZlbCkuICovXG4gICAgcmVhZG9ubHkgYWJlcnRvJDogT2JzZXJ2YWJsZTxib29sZWFuPjtcbiAgICByZWFkb25seSBjb250ZXh0byQ6IE9ic2VydmFibGU8VWlueUNvbnRleHRvPiA9IHRoaXMuY29udGV4dG9JbnRlcm5vJC5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKG1lc21vQ29udGV4dG8pKTtcbiAgICAvKiogQcOnw7VlcyBjb25jbHXDrWRhcyBlIGluc3RydcOnw7VlcyBkZSBpbnRlcmZhY2UgdmluZGFzIGRhIEFQSSwgasOhIHZhbGlkYWRhcy4gKi9cbiAgICByZWFkb25seSBldmVudG9zJDogT2JzZXJ2YWJsZTxVaW55RXZlbnRvPiA9IHRoaXMuZXZlbnRvc0ludGVybm9zJC5hc09ic2VydmFibGUoKTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHNlc3Npb246IFVpbnlTZXNzaW9uU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBhcGk6IFVpbnlBcGlTZXJ2aWNlLFxuICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KFVJTllfQ09ORklHKSBwcml2YXRlIGNvbmZpZzogVWlueUNvbmZpZyB8IG51bGxcbiAgICApIHtcbiAgICAgICAgdGhpcy5kaXNwb25pdmVsJCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMuaGFiaWxpdGFkb3JlcyQsIHRoaXMuaG9zdHMkLCB0aGlzLnNlc3Npb24uc2Vzc2FvJF0pLnBpcGUoXG4gICAgICAgICAgICBtYXAoKFtoYWJpbGl0YWRvcmVzLCBob3N0cywgc2Vzc2FvXSkgPT4gaGFiaWxpdGFkb3Jlcy5zaXplID4gMCAmJiBob3N0cyA+IDAgJiYgISFzZXNzYW8gJiYgdGhpcy5hcGkuY29uZmlndXJhZGEgJiYgISF0aGlzLmNvbmZpZyksXG4gICAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgICAgICAgc2hhcmVSZXBsYXkoeyBidWZmZXJTaXplOiAxLCByZWZDb3VudDogZmFsc2UgfSlcbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLmFiZXJ0byQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLmFiZXJ0b0ludGVybm8kLCB0aGlzLmRpc3Bvbml2ZWwkXSkucGlwZShcbiAgICAgICAgICAgIG1hcCgoW2FiZXJ0bywgZGlzcG9uaXZlbF0pID0+IGFiZXJ0byAmJiBkaXNwb25pdmVsKSxcbiAgICAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICAgICAgICBzaGFyZVJlcGxheSh7IGJ1ZmZlclNpemU6IDEsIHJlZkNvdW50OiBmYWxzZSB9KVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIEluZGlzcG9uw612ZWwgKGxvZ291dCwgc2Vzc8OjbyByZWN1c2FkYSwgaGVhZGVyIHNlbSBhIGZsYWcpOiBmZWNoYSBzZW0gZGV2b2x2ZXIgZm9jby5cbiAgICAgICAgdGhpcy5kaXNwb25pdmVsJC5zdWJzY3JpYmUoZGlzcG9uaXZlbCA9PiB7XG4gICAgICAgICAgICBpZiAoIWRpc3Bvbml2ZWwgJiYgdGhpcy5hYmVydG9JbnRlcm5vJC52YWx1ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZ2F0aWxobyA9IG51bGw7XG4gICAgICAgICAgICAgICAgdGhpcy5hYmVydG9JbnRlcm5vJC5uZXh0KGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29tYmluZUxhdGVzdChbdGhpcy5oYWJpbGl0YWRvcmVzJCwgdGhpcy5ob3N0cyRdKS5zdWJzY3JpYmUoKFtoYWJpbGl0YWRvcmVzLCBob3N0c10pID0+IHRoaXMuZGlhZ25vc3RpY2FyKGhhYmlsaXRhZG9yZXMuc2l6ZSA+IDAsIGhvc3RzKSk7XG4gICAgfVxuXG4gICAgZ2V0IGFiZXJ0bygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWJlcnRvSW50ZXJubyQudmFsdWU7XG4gICAgfVxuXG4gICAgZ2V0IHNpc3RlbWFPcmlnZW0oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbmZpZz8uc2lzdGVtYU9yaWdlbSA/PyBudWxsO1xuICAgIH1cblxuICAgIGFicmlyKGdhdGlsaG8/OiBIVE1MRWxlbWVudCB8IG51bGwpOiB2b2lkIHtcbiAgICAgICAgaWYgKGdhdGlsaG8pIHRoaXMuZ2F0aWxobyA9IGdhdGlsaG87XG4gICAgICAgIHRoaXMuYWJlcnRvSW50ZXJubyQubmV4dCh0cnVlKTtcbiAgICB9XG5cbiAgICAvKiogRmVjaGEgbyBwYWluZWwgZSBkZXZvbHZlIG8gZm9jbyBhbyBib3TDo28gcXVlIG8gYWJyaXUsIHNlIGVsZSBhaW5kYSBleGlzdGlyLiAqL1xuICAgIGZlY2hhcihkZXZvbHZlckZvY28gPSB0cnVlKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5hYmVydG9JbnRlcm5vJC52YWx1ZSkgcmV0dXJuO1xuICAgICAgICB0aGlzLmFiZXJ0b0ludGVybm8kLm5leHQoZmFsc2UpO1xuICAgICAgICBjb25zdCBnYXRpbGhvID0gdGhpcy5nYXRpbGhvO1xuICAgICAgICB0aGlzLmdhdGlsaG8gPSBudWxsO1xuICAgICAgICBpZiAoZGV2b2x2ZXJGb2NvICYmIGdhdGlsaG8pIHtcbiAgICAgICAgICAgIC8vIGVzcGVyYSBvIGxheW91dCByZWV4aWJpciBhIGFwbGljYcOnw6NvIChubyBjZWx1bGFyIGVsYSBmaWNhIHJlY29saGlkYSlcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gZ2F0aWxoby5pc0Nvbm5lY3RlZCAmJiBnYXRpbGhvLmZvY3VzKCkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYWx0ZXJuYXIoZ2F0aWxobz86IEhUTUxFbGVtZW50IHwgbnVsbCk6IHZvaWQge1xuICAgICAgICB0aGlzLmFiZXJ0b0ludGVybm8kLnZhbHVlID8gdGhpcy5mZWNoYXIoKSA6IHRoaXMuYWJyaXIoZ2F0aWxobyk7XG4gICAgfVxuXG4gICAgLyoqIFN1YnN0aXR1aSBvIGNvbnRleHRvIGRhIHRlbGEgYXR1YWwuIENhbXBvcyBmb3JhIGRvIHRpcG8gVWlueUNvbnRleHRvIHPDo28gaWdub3JhZG9zLiAqL1xuICAgIGRlZmluaXJDb250ZXh0byhjb250ZXh0bzogVWlueUNvbnRleHRvIHwgbnVsbCk6IHZvaWQge1xuICAgICAgICB0aGlzLmNvbnRleHRvSW50ZXJubyQubmV4dChub3JtYWxpemFyQ29udGV4dG8oY29udGV4dG8pKTtcbiAgICB9XG5cbiAgICAvKiogQWx0ZXJhIGFwZW5hcyBvcyBjYW1wb3MgaW5mb3JtYWRvcyBkbyBjb250ZXh0by4gKi9cbiAgICBhdHVhbGl6YXJDb250ZXh0byhwYXJjaWFsOiBQYXJ0aWFsPFVpbnlDb250ZXh0bz4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jb250ZXh0b0ludGVybm8kLm5leHQobm9ybWFsaXphckNvbnRleHRvKHsgLi4udGhpcy5jb250ZXh0b0ludGVybm8kLnZhbHVlLCAuLi5wYXJjaWFsIH0pKTtcbiAgICB9XG5cbiAgICBnZXQgY29udGV4dG8oKTogVWlueUNvbnRleHRvIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGV4dG9JbnRlcm5vJC52YWx1ZTtcbiAgICB9XG5cbiAgICAvKiogQGludGVybmFsIHVzYWRvIHBlbG8gdWktaGVhZGVyICovXG4gICAgZGVmaW5pckhhYmlsaXRhZG8ob3JpZ2VtOiBvYmplY3QsIGhhYmlsaXRhZG86IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgYXR1YWwgPSBuZXcgU2V0KHRoaXMuaGFiaWxpdGFkb3JlcyQudmFsdWUpO1xuICAgICAgICBoYWJpbGl0YWRvID8gYXR1YWwuYWRkKG9yaWdlbSkgOiBhdHVhbC5kZWxldGUob3JpZ2VtKTtcbiAgICAgICAgaWYgKGF0dWFsLnNpemUgIT09IHRoaXMuaGFiaWxpdGFkb3JlcyQudmFsdWUuc2l6ZSkgdGhpcy5oYWJpbGl0YWRvcmVzJC5uZXh0KGF0dWFsKTtcbiAgICB9XG5cbiAgICAvKiogQGludGVybmFsIHVzYWRvIHBlbG8gdWktYXNzaXN0YW50LWxheW91dCAqL1xuICAgIHJlZ2lzdHJhckhvc3QoKTogKCkgPT4gdm9pZCB7XG4gICAgICAgIHRoaXMuaG9zdHMkLm5leHQodGhpcy5ob3N0cyQudmFsdWUgKyAxKTtcbiAgICAgICAgbGV0IHJlbW92aWRvID0gZmFsc2U7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBpZiAocmVtb3ZpZG8pIHJldHVybjtcbiAgICAgICAgICAgIHJlbW92aWRvID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuaG9zdHMkLm5leHQoTWF0aC5tYXgoMCwgdGhpcy5ob3N0cyQudmFsdWUgLSAxKSk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqIEBpbnRlcm5hbCB1c2FkbyBwZWxvIHNlcnZpw6dvIGRlIGNvbnZlcnNhICovXG4gICAgZW1pdGlyKGV2ZW50bzogVWlueUV2ZW50byk6IHZvaWQge1xuICAgICAgICB0aGlzLmV2ZW50b3NJbnRlcm5vcyQubmV4dChldmVudG8pO1xuICAgIH1cblxuICAgIHByaXZhdGUgZGlhZ25vc3RpY2FyKGhhYmlsaXRhZG86IGJvb2xlYW4sIGhvc3RzOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKCFpc0Rldk1vZGUoKSB8fCAhaGFiaWxpdGFkbykgcmV0dXJuO1xuICAgICAgICBpZiAoIXRoaXMuY29uZmlnKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdbVWlueV0gc2hvd0Fzc2lzdGFudCBlc3TDoSBhdGl2bywgbWFzIFVpQXNzaXN0YW50TW9kdWxlLmZvclJvb3QoeyBzaXN0ZW1hT3JpZ2VtIH0pIG7Do28gZm9pIGltcG9ydGFkby4nKTtcbiAgICAgICAgfSBlbHNlIGlmICghdGhpcy5hcGkuY29uZmlndXJhZGEpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tVaW55XSBVUkwgZGEgQVBJIG7Do28gY29uZmlndXJhZGEuIEluZm9ybWUgQVBQX0VOVklST05NRU5ULmRvbWFpbi51aW55IG91IGZvclJvb3QoeyBhcGlVcmwgfSkuJyk7XG4gICAgICAgIH0gZWxzZSBpZiAoaG9zdHMgPT09IDAgJiYgIXRoaXMuYXZpc291U2VtSG9zdCkge1xuICAgICAgICAgICAgLy8gbyBsYXlvdXQgcG9kZSBzZXIgY3JpYWRvIGxvZ28gZGVwb2lzIGRvIGhlYWRlcjsgYXZpc2Egc8OzIHNlIGNvbnRpbnVhciBmYWx0YW5kb1xuICAgICAgICAgICAgdGhpcy5hdmlzb3VTZW1Ib3N0ID0gdHJ1ZTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmhvc3RzJC52YWx1ZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1tVaW55XSBzaG93QXNzaXN0YW50IGVzdMOhIGF0aXZvLCBtYXMgbmVuaHVtIDx1aS1hc3Npc3RhbnQtbGF5b3V0PiBlbnZvbHZlIGEgYXBsaWNhw6fDo28uIE8gYm90w6NvIGZpY2Egb2N1bHRvLicpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIDIwMDApO1xuICAgICAgICB9XG4gICAgfVxufVxuIl19
|
|
@@ -1,149 +0,0 @@
|
|
|
1
|
-
import { HttpBackend, HttpClient, HttpErrorResponse, HttpHeaders, HttpParams } from '@angular/common/http';
|
|
2
|
-
import { Inject, Injectable, Optional } from '@angular/core';
|
|
3
|
-
import { defer, throwError, TimeoutError } from 'rxjs';
|
|
4
|
-
import { catchError, timeout } from 'rxjs/operators';
|
|
5
|
-
import { resolverUrlUiny, UINY_CONFIG, UINY_TIMEOUT_ACAO_MS, UINY_TIMEOUT_CONSULTA_MS, UINY_TIMEOUT_MENSAGEM_MS } from '../uiny.config';
|
|
6
|
-
import { idValido } from '../utils/uiny-api.adapter';
|
|
7
|
-
import { UinySessionService } from './uiny-session.service';
|
|
8
|
-
import * as i0 from "@angular/core";
|
|
9
|
-
import * as i1 from "@angular/common/http";
|
|
10
|
-
import * as i2 from "./uiny-session.service";
|
|
11
|
-
const MENSAGENS_PADRAO = {
|
|
12
|
-
sessao: 'Sua sessão expirou. Entre novamente na Uishop para continuar com a Uiny.',
|
|
13
|
-
rede: 'Não foi possível conectar à Uiny. Verifique sua internet e tente de novo.',
|
|
14
|
-
timeout: 'A Uiny demorou demais para responder. Tente de novo em instantes.',
|
|
15
|
-
conflito: 'Não foi possível concluir agora. Atualize e tente de novo.',
|
|
16
|
-
nao_encontrado: 'Não encontramos o que você pediu. Ele pode ter sido removido.',
|
|
17
|
-
invalido: 'Não foi possível processar esse pedido.',
|
|
18
|
-
limite: 'Você enviou muitas mensagens em pouco tempo. Aguarde um pouco e tente de novo.',
|
|
19
|
-
servidor: 'A Uiny está com instabilidade no momento. Tente de novo em instantes.',
|
|
20
|
-
configuracao: 'A Uiny não está configurada neste sistema.',
|
|
21
|
-
};
|
|
22
|
-
/**
|
|
23
|
-
* Cliente HTTP da API da Uiny (uishop-ia, /api/v1).
|
|
24
|
-
*
|
|
25
|
-
* Usa um HttpClient sobre o HttpBackend, sem os interceptors da aplicação:
|
|
26
|
-
* - o ErrorInterceptor do uitec-ng-core troca o erro por uma string (perde status e o corpo,
|
|
27
|
-
* necessários para sessão expirada, ação expirada/invalidada e conflitos) e abre um toast global;
|
|
28
|
-
* - o SpinnerInterceptor cobriria a tela a cada mensagem.
|
|
29
|
-
* O token é o mesmo usado pelo JwtInterceptor (AuthService.currentUserValue.token) e só é
|
|
30
|
-
* anexado a requisições cuja URL começa com a URL-base configurada da Uiny.
|
|
31
|
-
*/
|
|
32
|
-
export class UinyApiService {
|
|
33
|
-
constructor(httpBackend, session, config, env) {
|
|
34
|
-
this.session = session;
|
|
35
|
-
this.http = new HttpClient(httpBackend);
|
|
36
|
-
this.baseUrl = resolverUrlUiny(config, env);
|
|
37
|
-
}
|
|
38
|
-
get configurada() {
|
|
39
|
-
return !!this.baseUrl;
|
|
40
|
-
}
|
|
41
|
-
listarConversas() {
|
|
42
|
-
return defer(() => this.request('GET', '/conversas', null, UINY_TIMEOUT_CONSULTA_MS, new HttpParams().set('page', 1).set('per_page', 20)));
|
|
43
|
-
}
|
|
44
|
-
criarConversa(contexto) {
|
|
45
|
-
return defer(() => this.request('POST', '/conversas', { contexto }, UINY_TIMEOUT_CONSULTA_MS));
|
|
46
|
-
}
|
|
47
|
-
/** Página mais recente do histórico (até 100 mensagens), em ordem cronológica. */
|
|
48
|
-
historico(idConversa) {
|
|
49
|
-
return defer(() => this.request('GET', `/conversas/${this.id(idConversa)}`, null, UINY_TIMEOUT_CONSULTA_MS, new HttpParams().set('page', 1).set('per_page', 100)));
|
|
50
|
-
}
|
|
51
|
-
enviarMensagem(idConversa, texto, contexto) {
|
|
52
|
-
return defer(() => this.request('POST', `/conversas/${this.id(idConversa)}/mensagens`, { texto, contexto }, UINY_TIMEOUT_MENSAGEM_MS));
|
|
53
|
-
}
|
|
54
|
-
/** Confirma pelo id da ação persistida. Nenhum argumento é enviado. Nunca é repetida automaticamente. */
|
|
55
|
-
confirmarAcao(idAcao) {
|
|
56
|
-
return defer(() => this.request('POST', `/acoes/${this.id(idAcao)}/confirmar`, {}, UINY_TIMEOUT_ACAO_MS));
|
|
57
|
-
}
|
|
58
|
-
cancelarAcao(idAcao) {
|
|
59
|
-
return defer(() => this.request('POST', `/acoes/${this.id(idAcao)}/cancelar`, {}, UINY_TIMEOUT_CONSULTA_MS));
|
|
60
|
-
}
|
|
61
|
-
id(valor) {
|
|
62
|
-
const id = idValido(valor);
|
|
63
|
-
if (!id)
|
|
64
|
-
throw this.erro('invalido', 0);
|
|
65
|
-
return id;
|
|
66
|
-
}
|
|
67
|
-
request(method, path, body, timeoutMs, params) {
|
|
68
|
-
if (!this.baseUrl) {
|
|
69
|
-
return throwError(() => this.erro('configuracao', 0));
|
|
70
|
-
}
|
|
71
|
-
const url = this.baseUrl + path;
|
|
72
|
-
const token = this.session.token();
|
|
73
|
-
if (!token) {
|
|
74
|
-
return throwError(() => this.erro('sessao', 401));
|
|
75
|
-
}
|
|
76
|
-
let headers = new HttpHeaders({ 'Accept': 'application/json' });
|
|
77
|
-
// Garantia explícita: o token só segue para a URL-base da Uiny.
|
|
78
|
-
if (url.startsWith(this.baseUrl + '/')) {
|
|
79
|
-
headers = headers.set('Authorization', `Bearer ${token}`);
|
|
80
|
-
}
|
|
81
|
-
if (method === 'POST') {
|
|
82
|
-
headers = headers.set('Content-Type', 'application/json');
|
|
83
|
-
}
|
|
84
|
-
return this.http.request(method, url, { body: body ?? undefined, headers, params, responseType: 'json' }).pipe(timeout(timeoutMs), catchError(err => throwError(() => this.normalizarErro(err))));
|
|
85
|
-
}
|
|
86
|
-
normalizarErro(err) {
|
|
87
|
-
if (err instanceof TimeoutError) {
|
|
88
|
-
return this.erro('timeout', 0);
|
|
89
|
-
}
|
|
90
|
-
if (!(err instanceof HttpErrorResponse)) {
|
|
91
|
-
return this.erro('servidor', 0);
|
|
92
|
-
}
|
|
93
|
-
const corpo = err.error && typeof err.error === 'object' ? err.error : null;
|
|
94
|
-
const correlacao = this.textoSeguro(corpo?.id_correlacao, 64) || this.textoSeguro(err.headers?.get('X-Correlation-Id'), 64);
|
|
95
|
-
const codigo = this.textoSeguro(corpo?.erro?.codigo, 60);
|
|
96
|
-
const mensagemApi = this.textoSeguro(corpo?.erro?.mensagem, 300);
|
|
97
|
-
let tipo;
|
|
98
|
-
if (err.status === 0)
|
|
99
|
-
tipo = 'rede';
|
|
100
|
-
else if (err.status === 401)
|
|
101
|
-
tipo = 'sessao';
|
|
102
|
-
else if (err.status === 404)
|
|
103
|
-
tipo = 'nao_encontrado';
|
|
104
|
-
else if (err.status === 409)
|
|
105
|
-
tipo = 'conflito';
|
|
106
|
-
else if (err.status === 429)
|
|
107
|
-
tipo = 'limite';
|
|
108
|
-
else if (err.status === 400 || err.status === 403 || err.status === 422)
|
|
109
|
-
tipo = 'invalido';
|
|
110
|
-
else
|
|
111
|
-
tipo = 'servidor';
|
|
112
|
-
if (tipo === 'sessao') {
|
|
113
|
-
this.session.recusarSessaoAtual();
|
|
114
|
-
}
|
|
115
|
-
// 502/503/504 trazem mensagens próprias e seguras (INTEGRACAO_*, PROVEDOR_IA_INDISPONIVEL).
|
|
116
|
-
// 500 (INTERNO) e falhas de rede usam sempre o texto padrão.
|
|
117
|
-
const usarMensagemApi = tipo !== 'rede' && tipo !== 'sessao' && err.status !== 500;
|
|
118
|
-
const mensagem = (usarMensagemApi && mensagemApi) || MENSAGENS_PADRAO[tipo];
|
|
119
|
-
return { tipo, status: err.status, codigo, mensagem, correlacao, corpo };
|
|
120
|
-
}
|
|
121
|
-
erro(tipo, status) {
|
|
122
|
-
return { tipo, status, codigo: null, mensagem: MENSAGENS_PADRAO[tipo], correlacao: null };
|
|
123
|
-
}
|
|
124
|
-
textoSeguro(valor, max) {
|
|
125
|
-
if (typeof valor !== 'string')
|
|
126
|
-
return null;
|
|
127
|
-
const texto = valor.trim();
|
|
128
|
-
if (!texto || /bearer\s/i.test(texto))
|
|
129
|
-
return null;
|
|
130
|
-
return texto.length > max ? texto.slice(0, max) + '…' : texto;
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
UinyApiService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: UinyApiService, deps: [{ token: i1.HttpBackend }, { token: i2.UinySessionService }, { token: UINY_CONFIG, optional: true }, { token: 'APP_ENVIRONMENT', optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
134
|
-
UinyApiService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: UinyApiService, providedIn: 'root' });
|
|
135
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: UinyApiService, decorators: [{
|
|
136
|
-
type: Injectable,
|
|
137
|
-
args: [{ providedIn: 'root' }]
|
|
138
|
-
}], ctorParameters: function () { return [{ type: i1.HttpBackend }, { type: i2.UinySessionService }, { type: undefined, decorators: [{
|
|
139
|
-
type: Optional
|
|
140
|
-
}, {
|
|
141
|
-
type: Inject,
|
|
142
|
-
args: [UINY_CONFIG]
|
|
143
|
-
}] }, { type: undefined, decorators: [{
|
|
144
|
-
type: Optional
|
|
145
|
-
}, {
|
|
146
|
-
type: Inject,
|
|
147
|
-
args: ['APP_ENVIRONMENT']
|
|
148
|
-
}] }]; } });
|
|
149
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidWlueS1hcGkuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3VpLWhlYWRlci9zcmMvbGliL2Fzc2lzdGFudC9zZXJ2aWNlcy91aW55LWFwaS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLGlCQUFpQixFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMzRyxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0QsT0FBTyxFQUFFLEtBQUssRUFBYyxVQUFVLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ25FLE9BQU8sRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFTckQsT0FBTyxFQUNILGVBQWUsRUFDZixXQUFXLEVBQ1gsb0JBQW9CLEVBQ3BCLHdCQUF3QixFQUN4Qix3QkFBd0IsRUFDM0IsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDckQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7Ozs7QUFFNUQsTUFBTSxnQkFBZ0IsR0FBcUM7SUFDdkQsTUFBTSxFQUFFLDBFQUEwRTtJQUNsRixJQUFJLEVBQUUsMkVBQTJFO0lBQ2pGLE9BQU8sRUFBRSxtRUFBbUU7SUFDNUUsUUFBUSxFQUFFLDREQUE0RDtJQUN0RSxjQUFjLEVBQUUsK0RBQStEO0lBQy9FLFFBQVEsRUFBRSx5Q0FBeUM7SUFDbkQsTUFBTSxFQUFFLGdGQUFnRjtJQUN4RixRQUFRLEVBQUUsdUVBQXVFO0lBQ2pGLFlBQVksRUFBRSw0Q0FBNEM7Q0FDN0QsQ0FBQztBQUVGOzs7Ozs7Ozs7R0FTRztBQUVILE1BQU0sT0FBTyxjQUFj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M0MsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxLQUFLLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQztRQUNuRCxPQUFPLEtBQUssQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUNsRSxDQUFDOzs0R0F6SFEsY0FBYywrRUFRQyxXQUFXLDZCQUNYLGlCQUFpQjtnSEFUaEMsY0FBYyxjQURELE1BQU07NEZBQ25CLGNBQWM7a0JBRDFCLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFOzswQkFTekIsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxXQUFXOzswQkFDOUIsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxpQkFBaUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQmFja2VuZCwgSHR0cENsaWVudCwgSHR0cEVycm9yUmVzcG9uc2UsIEh0dHBIZWFkZXJzLCBIdHRwUGFyYW1zIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZGVmZXIsIE9ic2VydmFibGUsIHRocm93RXJyb3IsIFRpbWVvdXRFcnJvciB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgdGltZW91dCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7XG4gICAgVWlueUNvbnRleHRvQXBpLFxuICAgIFVpbnlDcmlhckNvbnZlcnNhUmVzcG9uc2UsXG4gICAgVWlueUhpc3Rvcmljb1Jlc3BvbnNlLFxuICAgIFVpbnlMaXN0YUNvbnZlcnNhc1Jlc3BvbnNlLFxuICAgIFVpbnlSZXNwb3N0YUFwaVxufSBmcm9tICcuLi9tb2RlbHMvdWlueS1hcGkubW9kZWxzJztcbmltcG9ydCB7IFVpbnlDb25maWcsIFVpbnlFcnJvIH0gZnJvbSAnLi4vbW9kZWxzL3VpbnkubW9kZWxzJztcbmltcG9ydCB7XG4gICAgcmVzb2x2ZXJVcmxVaW55LFxuICAgIFVJTllfQ09ORklHLFxuICAgIFVJTllfVElNRU9VVF9BQ0FPX01TLFxuICAgIFVJTllfVElNRU9VVF9DT05TVUxUQV9NUyxcbiAgICBVSU5ZX1RJTUVPVVRfTUVOU0FHRU1fTVNcbn0gZnJvbSAnLi4vdWlueS5jb25maWcnO1xuaW1wb3J0IHsgaWRWYWxpZG8gfSBmcm9tICcuLi91dGlscy91aW55LWFwaS5hZGFwdGVyJztcbmltcG9ydCB7IFVpbnlTZXNzaW9uU2VydmljZSB9IGZyb20gJy4vdWlueS1zZXNzaW9uLnNlcnZpY2UnO1xuXG5jb25zdCBNRU5TQUdFTlNfUEFEUkFPOiBSZWNvcmQ8VWlueUVycm9bJ3RpcG8nXSwgc3RyaW5nPiA9IHtcbiAgICBzZXNzYW86ICdTdWEgc2Vzc8OjbyBleHBpcm91LiBFbnRyZSBub3ZhbWVudGUgbmEgVWlzaG9wIHBhcmEgY29udGludWFyIGNvbSBhIFVpbnkuJyxcbiAgICByZWRlOiAnTsOjbyBmb2kgcG9zc8OtdmVsIGNvbmVjdGFyIMOgIFVpbnkuIFZlcmlmaXF1ZSBzdWEgaW50ZXJuZXQgZSB0ZW50ZSBkZSBub3ZvLicsXG4gICAgdGltZW91dDogJ0EgVWlueSBkZW1vcm91IGRlbWFpcyBwYXJhIHJlc3BvbmRlci4gVGVudGUgZGUgbm92byBlbSBpbnN0YW50ZXMuJyxcbiAgICBjb25mbGl0bzogJ07Do28gZm9pIHBvc3PDrXZlbCBjb25jbHVpciBhZ29yYS4gQXR1YWxpemUgZSB0ZW50ZSBkZSBub3ZvLicsXG4gICAgbmFvX2VuY29udHJhZG86ICdOw6NvIGVuY29udHJhbW9zIG8gcXVlIHZvY8OqIHBlZGl1LiBFbGUgcG9kZSB0ZXIgc2lkbyByZW1vdmlkby4nLFxuICAgIGludmFsaWRvOiAnTsOjbyBmb2kgcG9zc8OtdmVsIHByb2Nlc3NhciBlc3NlIHBlZGlkby4nLFxuICAgIGxpbWl0ZTogJ1ZvY8OqIGVudmlvdSBtdWl0YXMgbWVuc2FnZW5zIGVtIHBvdWNvIHRlbXBvLiBBZ3VhcmRlIHVtIHBvdWNvIGUgdGVudGUgZGUgbm92by4nLFxuICAgIHNlcnZpZG9yOiAnQSBVaW55IGVzdMOhIGNvbSBpbnN0YWJpbGlkYWRlIG5vIG1vbWVudG8uIFRlbnRlIGRlIG5vdm8gZW0gaW5zdGFudGVzLicsXG4gICAgY29uZmlndXJhY2FvOiAnQSBVaW55IG7Do28gZXN0w6EgY29uZmlndXJhZGEgbmVzdGUgc2lzdGVtYS4nLFxufTtcblxuLyoqXG4gKiBDbGllbnRlIEhUVFAgZGEgQVBJIGRhIFVpbnkgKHVpc2hvcC1pYSwgL2FwaS92MSkuXG4gKlxuICogVXNhIHVtIEh0dHBDbGllbnQgc29icmUgbyBIdHRwQmFja2VuZCwgc2VtIG9zIGludGVyY2VwdG9ycyBkYSBhcGxpY2HDp8OjbzpcbiAqICAtIG8gRXJyb3JJbnRlcmNlcHRvciBkbyB1aXRlYy1uZy1jb3JlIHRyb2NhIG8gZXJybyBwb3IgdW1hIHN0cmluZyAocGVyZGUgc3RhdHVzIGUgbyBjb3JwbyxcbiAqICAgIG5lY2Vzc8OhcmlvcyBwYXJhIHNlc3PDo28gZXhwaXJhZGEsIGHDp8OjbyBleHBpcmFkYS9pbnZhbGlkYWRhIGUgY29uZmxpdG9zKSBlIGFicmUgdW0gdG9hc3QgZ2xvYmFsO1xuICogIC0gbyBTcGlubmVySW50ZXJjZXB0b3IgY29icmlyaWEgYSB0ZWxhIGEgY2FkYSBtZW5zYWdlbS5cbiAqIE8gdG9rZW4gw6kgbyBtZXNtbyB1c2FkbyBwZWxvIEp3dEludGVyY2VwdG9yIChBdXRoU2VydmljZS5jdXJyZW50VXNlclZhbHVlLnRva2VuKSBlIHPDsyDDqVxuICogYW5leGFkbyBhIHJlcXVpc2nDp8O1ZXMgY3VqYSBVUkwgY29tZcOnYSBjb20gYSBVUkwtYmFzZSBjb25maWd1cmFkYSBkYSBVaW55LlxuICovXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIFVpbnlBcGlTZXJ2aWNlIHtcblxuICAgIHJlYWRvbmx5IGJhc2VVcmw6IHN0cmluZyB8IG51bGw7XG4gICAgcHJpdmF0ZSByZWFkb25seSBodHRwOiBIdHRwQ2xpZW50O1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIGh0dHBCYWNrZW5kOiBIdHRwQmFja2VuZCxcbiAgICAgICAgcHJpdmF0ZSBzZXNzaW9uOiBVaW55U2Vzc2lvblNlcnZpY2UsXG4gICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoVUlOWV9DT05GSUcpIGNvbmZpZzogVWlueUNvbmZpZyB8IG51bGwsXG4gICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoJ0FQUF9FTlZJUk9OTUVOVCcpIGVudjogYW55XG4gICAgKSB7XG4gICAgICAgIHRoaXMuaHR0cCA9IG5ldyBIdHRwQ2xpZW50KGh0dHBCYWNrZW5kKTtcbiAgICAgICAgdGhpcy5iYXNlVXJsID0gcmVzb2x2ZXJVcmxVaW55KGNvbmZpZywgZW52KTtcbiAgICB9XG5cbiAgICBnZXQgY29uZmlndXJhZGEoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuYmFzZVVybDtcbiAgICB9XG5cbiAgICBsaXN0YXJDb252ZXJzYXMoKTogT2JzZXJ2YWJsZTxVaW55TGlzdGFDb252ZXJzYXNSZXNwb25zZT4ge1xuICAgICAgICByZXR1cm4gZGVmZXIoKCkgPT4gdGhpcy5yZXF1ZXN0PFVpbnlMaXN0YUNvbnZlcnNhc1Jlc3BvbnNlPignR0VUJywgJy9jb252ZXJzYXMnLCBudWxsLCBVSU5ZX1RJTUVPVVRfQ09OU1VMVEFfTVMsXG4gICAgICAgICAgICBuZXcgSHR0cFBhcmFtcygpLnNldCgncGFnZScsIDEpLnNldCgncGVyX3BhZ2UnLCAyMCkpKTtcbiAgICB9XG5cbiAgICBjcmlhckNvbnZlcnNhKGNvbnRleHRvOiBVaW55Q29udGV4dG9BcGkpOiBPYnNlcnZhYmxlPFVpbnlDcmlhckNvbnZlcnNhUmVzcG9uc2U+IHtcbiAgICAgICAgcmV0dXJuIGRlZmVyKCgpID0+IHRoaXMucmVxdWVzdDxVaW55Q3JpYXJDb252ZXJzYVJlc3BvbnNlPignUE9TVCcsICcvY29udmVyc2FzJywgeyBjb250ZXh0byB9LCBVSU5ZX1RJTUVPVVRfQ09OU1VMVEFfTVMpKTtcbiAgICB9XG5cbiAgICAvKiogUMOhZ2luYSBtYWlzIHJlY2VudGUgZG8gaGlzdMOzcmljbyAoYXTDqSAxMDAgbWVuc2FnZW5zKSwgZW0gb3JkZW0gY3Jvbm9sw7NnaWNhLiAqL1xuICAgIGhpc3RvcmljbyhpZENvbnZlcnNhOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFVpbnlIaXN0b3JpY29SZXNwb25zZT4ge1xuICAgICAgICByZXR1cm4gZGVmZXIoKCkgPT4gdGhpcy5yZXF1ZXN0PFVpbnlIaXN0b3JpY29SZXNwb25zZT4oJ0dFVCcsIGAvY29udmVyc2FzLyR7dGhpcy5pZChpZENvbnZlcnNhKX1gLCBudWxsLCBVSU5ZX1RJTUVPVVRfQ09OU1VMVEFfTVMsXG4gICAgICAgICAgICBuZXcgSHR0cFBhcmFtcygpLnNldCgncGFnZScsIDEpLnNldCgncGVyX3BhZ2UnLCAxMDApKSk7XG4gICAgfVxuXG4gICAgZW52aWFyTWVuc2FnZW0oaWRDb252ZXJzYTogc3RyaW5nLCB0ZXh0bzogc3RyaW5nLCBjb250ZXh0bzogVWlueUNvbnRleHRvQXBpKTogT2JzZXJ2YWJsZTxVaW55UmVzcG9zdGFBcGk+IHtcbiAgICAgICAgcmV0dXJuIGRlZmVyKCgpID0+IHRoaXMucmVxdWVzdDxVaW55UmVzcG9zdGFBcGk+KCdQT1NUJywgYC9jb252ZXJzYXMvJHt0aGlzLmlkKGlkQ29udmVyc2EpfS9tZW5zYWdlbnNgLCB7IHRleHRvLCBjb250ZXh0byB9LCBVSU5ZX1RJTUVPVVRfTUVOU0FHRU1fTVMpKTtcbiAgICB9XG5cbiAgICAvKiogQ29uZmlybWEgcGVsbyBpZCBkYSBhw6fDo28gcGVyc2lzdGlkYS4gTmVuaHVtIGFyZ3VtZW50byDDqSBlbnZpYWRvLiBOdW5jYSDDqSByZXBldGlkYSBhdXRvbWF0aWNhbWVudGUuICovXG4gICAgY29uZmlybWFyQWNhbyhpZEFjYW86IHN0cmluZyk6IE9ic2VydmFibGU8VWlueVJlc3Bvc3RhQXBpPiB7XG4gICAgICAgIHJldHVybiBkZWZlcigoKSA9PiB0aGlzLnJlcXVlc3Q8VWlueVJlc3Bvc3RhQXBpPignUE9TVCcsIGAvYWNvZXMvJHt0aGlzLmlkKGlkQWNhbyl9L2NvbmZpcm1hcmAsIHt9LCBVSU5ZX1RJTUVPVVRfQUNBT19NUykpO1xuICAgIH1cblxuICAgIGNhbmNlbGFyQWNhbyhpZEFjYW86IHN0cmluZyk6IE9ic2VydmFibGU8VWlueVJlc3Bvc3RhQXBpPiB7XG4gICAgICAgIHJldHVybiBkZWZlcigoKSA9PiB0aGlzLnJlcXVlc3Q8VWlueVJlc3Bvc3RhQXBpPignUE9TVCcsIGAvYWNvZXMvJHt0aGlzLmlkKGlkQWNhbyl9L2NhbmNlbGFyYCwge30sIFVJTllfVElNRU9VVF9DT05TVUxUQV9NUykpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaWQodmFsb3I6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IGlkID0gaWRWYWxpZG8odmFsb3IpO1xuICAgICAgICBpZiAoIWlkKSB0aHJvdyB0aGlzLmVycm8oJ2ludmFsaWRvJywgMCk7XG4gICAgICAgIHJldHVybiBpZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlcXVlc3Q8VD4obWV0aG9kOiAnR0VUJyB8ICdQT1NUJywgcGF0aDogc3RyaW5nLCBib2R5OiBhbnksIHRpbWVvdXRNczogbnVtYmVyLCBwYXJhbXM/OiBIdHRwUGFyYW1zKTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgICAgIGlmICghdGhpcy5iYXNlVXJsKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiB0aGlzLmVycm8oJ2NvbmZpZ3VyYWNhbycsIDApKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1cmwgPSB0aGlzLmJhc2VVcmwgKyBwYXRoO1xuICAgICAgICBjb25zdCB0b2tlbiA9IHRoaXMuc2Vzc2lvbi50b2tlbigpO1xuICAgICAgICBpZiAoIXRva2VuKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiB0aGlzLmVycm8oJ3Nlc3NhbycsIDQwMSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoeyAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL2pzb24nIH0pO1xuICAgICAgICAvLyBHYXJhbnRpYSBleHBsw61jaXRhOiBvIHRva2VuIHPDsyBzZWd1ZSBwYXJhIGEgVVJMLWJhc2UgZGEgVWlueS5cbiAgICAgICAgaWYgKHVybC5zdGFydHNXaXRoKHRoaXMuYmFzZVVybCArICcvJykpIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgnQXV0aG9yaXphdGlvbicsIGBCZWFyZXIgJHt0b2tlbn1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWV0aG9kID09PSAnUE9TVCcpIHtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgnQ29udGVudC1UeXBlJywgJ2FwcGxpY2F0aW9uL2pzb24nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAucmVxdWVzdDxUPihtZXRob2QsIHVybCwgeyBib2R5OiBib2R5ID8/IHVuZGVmaW5lZCwgaGVhZGVycywgcGFyYW1zLCByZXNwb25zZVR5cGU6ICdqc29uJyB9KS5waXBlKFxuICAgICAgICAgICAgdGltZW91dCh0aW1lb3V0TXMpLFxuICAgICAgICAgICAgY2F0Y2hFcnJvcihlcnIgPT4gdGhyb3dFcnJvcigoKSA9PiB0aGlzLm5vcm1hbGl6YXJFcnJvKGVycikpKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgbm9ybWFsaXphckVycm8oZXJyOiBhbnkpOiBVaW55RXJybyB7XG4gICAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBUaW1lb3V0RXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmVycm8oJ3RpbWVvdXQnLCAwKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIShlcnIgaW5zdGFuY2VvZiBIdHRwRXJyb3JSZXNwb25zZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmVycm8oJ3NlcnZpZG9yJywgMCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb3JwbzogVWlueVJlc3Bvc3RhQXBpID0gZXJyLmVycm9yICYmIHR5cGVvZiBlcnIuZXJyb3IgPT09ICdvYmplY3QnID8gZXJyLmVycm9yIDogbnVsbDtcbiAgICAgICAgY29uc3QgY29ycmVsYWNhbyA9IHRoaXMudGV4dG9TZWd1cm8oY29ycG8/LmlkX2NvcnJlbGFjYW8sIDY0KSB8fCB0aGlzLnRleHRvU2VndXJvKGVyci5oZWFkZXJzPy5nZXQoJ1gtQ29ycmVsYXRpb24tSWQnKSwgNjQpO1xuICAgICAgICBjb25zdCBjb2RpZ28gPSB0aGlzLnRleHRvU2VndXJvKGNvcnBvPy5lcnJvPy5jb2RpZ28sIDYwKTtcbiAgICAgICAgY29uc3QgbWVuc2FnZW1BcGkgPSB0aGlzLnRleHRvU2VndXJvKGNvcnBvPy5lcnJvPy5tZW5zYWdlbSwgMzAwKTtcblxuICAgICAgICBsZXQgdGlwbzogVWlueUVycm9bJ3RpcG8nXTtcbiAgICAgICAgaWYgKGVyci5zdGF0dXMgPT09IDApIHRpcG8gPSAncmVkZSc7XG4gICAgICAgIGVsc2UgaWYgKGVyci5zdGF0dXMgPT09IDQwMSkgdGlwbyA9ICdzZXNzYW8nO1xuICAgICAgICBlbHNlIGlmIChlcnIuc3RhdHVzID09PSA0MDQpIHRpcG8gPSAnbmFvX2VuY29udHJhZG8nO1xuICAgICAgICBlbHNlIGlmIChlcnIuc3RhdHVzID09PSA0MDkpIHRpcG8gPSAnY29uZmxpdG8nO1xuICAgICAgICBlbHNlIGlmIChlcnIuc3RhdHVzID09PSA0MjkpIHRpcG8gPSAnbGltaXRlJztcbiAgICAgICAgZWxzZSBpZiAoZXJyLnN0YXR1cyA9PT0gNDAwIHx8IGVyci5zdGF0dXMgPT09IDQwMyB8fCBlcnIuc3RhdHVzID09PSA0MjIpIHRpcG8gPSAnaW52YWxpZG8nO1xuICAgICAgICBlbHNlIHRpcG8gPSAnc2Vydmlkb3InO1xuXG4gICAgICAgIGlmICh0aXBvID09PSAnc2Vzc2FvJykge1xuICAgICAgICAgICAgdGhpcy5zZXNzaW9uLnJlY3VzYXJTZXNzYW9BdHVhbCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gNTAyLzUwMy81MDQgdHJhemVtIG1lbnNhZ2VucyBwcsOzcHJpYXMgZSBzZWd1cmFzIChJTlRFR1JBQ0FPXyosIFBST1ZFRE9SX0lBX0lORElTUE9OSVZFTCkuXG4gICAgICAgIC8vIDUwMCAoSU5URVJOTykgZSBmYWxoYXMgZGUgcmVkZSB1c2FtIHNlbXByZSBvIHRleHRvIHBhZHLDo28uXG4gICAgICAgIGNvbnN0IHVzYXJNZW5zYWdlbUFwaSA9IHRpcG8gIT09ICdyZWRlJyAmJiB0aXBvICE9PSAnc2Vzc2FvJyAmJiBlcnIuc3RhdHVzICE9PSA1MDA7XG4gICAgICAgIGNvbnN0IG1lbnNhZ2VtID0gKHVzYXJNZW5zYWdlbUFwaSAmJiBtZW5zYWdlbUFwaSkgfHwgTUVOU0FHRU5TX1BBRFJBT1t0aXBvXTtcblxuICAgICAgICByZXR1cm4geyB0aXBvLCBzdGF0dXM6IGVyci5zdGF0dXMsIGNvZGlnbywgbWVuc2FnZW0sIGNvcnJlbGFjYW8sIGNvcnBvIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBlcnJvKHRpcG86IFVpbnlFcnJvWyd0aXBvJ10sIHN0YXR1czogbnVtYmVyKTogVWlueUVycm8ge1xuICAgICAgICByZXR1cm4geyB0aXBvLCBzdGF0dXMsIGNvZGlnbzogbnVsbCwgbWVuc2FnZW06IE1FTlNBR0VOU19QQURSQU9bdGlwb10sIGNvcnJlbGFjYW86IG51bGwgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHRleHRvU2VndXJvKHZhbG9yOiBhbnksIG1heDogbnVtYmVyKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsb3IgIT09ICdzdHJpbmcnKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgdGV4dG8gPSB2YWxvci50cmltKCk7XG4gICAgICAgIGlmICghdGV4dG8gfHwgL2JlYXJlclxccy9pLnRlc3QodGV4dG8pKSByZXR1cm4gbnVsbDtcbiAgICAgICAgcmV0dXJuIHRleHRvLmxlbmd0aCA+IG1heCA/IHRleHRvLnNsaWNlKDAsIG1heCkgKyAn4oCmJyA6IHRleHRvO1xuICAgIH1cbn1cbiJdfQ==
|