@certd/plugin-cert 1.24.3 → 1.25.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/dist/access/eab-access.d.ts +4 -4
  3. package/dist/access/eab-access.js +48 -48
  4. package/dist/access/index.d.ts +1 -1
  5. package/dist/access/index.js +1 -1
  6. package/dist/dns-provider/api.d.ts +27 -27
  7. package/dist/dns-provider/api.js +1 -1
  8. package/dist/dns-provider/base.d.ts +8 -8
  9. package/dist/dns-provider/base.js +6 -6
  10. package/dist/dns-provider/decorator.d.ts +3 -3
  11. package/dist/dns-provider/decorator.js +25 -25
  12. package/dist/dns-provider/index.d.ts +4 -4
  13. package/dist/dns-provider/index.js +4 -4
  14. package/dist/dns-provider/registry.d.ts +2 -2
  15. package/dist/dns-provider/registry.js +2 -2
  16. package/dist/index.d.ts +3 -3
  17. package/dist/index.js +3 -3
  18. package/dist/plugin/cert-plugin/acme.d.ts +66 -65
  19. package/dist/plugin/cert-plugin/acme.js +280 -270
  20. package/dist/plugin/cert-plugin/base.d.ts +46 -46
  21. package/dist/plugin/cert-plugin/base.js +281 -284
  22. package/dist/plugin/cert-plugin/cert-reader.d.ts +34 -31
  23. package/dist/plugin/cert-plugin/cert-reader.js +112 -89
  24. package/dist/plugin/cert-plugin/convert.d.ts +21 -21
  25. package/dist/plugin/cert-plugin/convert.js +70 -70
  26. package/dist/plugin/cert-plugin/index.d.ts +18 -18
  27. package/dist/plugin/cert-plugin/index.js +208 -206
  28. package/dist/plugin/cert-plugin/lego/dns.d.ts +1 -1
  29. package/dist/plugin/cert-plugin/lego/dns.js +1 -1
  30. package/dist/plugin/cert-plugin/lego/index.d.ts +17 -17
  31. package/dist/plugin/cert-plugin/lego/index.js +172 -171
  32. package/dist/plugin/index.d.ts +2 -2
  33. package/dist/plugin/index.js +2 -2
  34. package/package.json +4 -4
  35. package/tsconfig.tsbuildinfo +1 -1
  36. package/dist/bundle.js +0 -1
  37. package/dist/d/access/eab-access.d.ts +0 -4
  38. package/dist/d/access/index.d.ts +0 -1
  39. package/dist/d/dns-provider/api.d.ts +0 -27
  40. package/dist/d/dns-provider/base.d.ts +0 -8
  41. package/dist/d/dns-provider/decorator.d.ts +0 -3
  42. package/dist/d/dns-provider/index.d.ts +0 -4
  43. package/dist/d/dns-provider/registry.d.ts +0 -2
  44. package/dist/d/index.d.ts +0 -3
  45. package/dist/d/plugin/cert-plugin/acme.d.ts +0 -52
  46. package/dist/d/plugin/cert-plugin/cert-reader.d.ts +0 -16
  47. package/dist/d/plugin/cert-plugin/index.d.ts +0 -51
  48. package/dist/d/plugin/index.d.ts +0 -1
  49. package/dist/plugin/cert-plugin/lego.d.ts +0 -16
  50. package/dist/plugin/cert-plugin/lego.js +0 -153
  51. package/dist/plugin-cert.mjs +0 -11786
  52. package/dist/plugin-cert.umd.js +0 -28
@@ -1,4 +0,0 @@
1
- export declare class EabAccess {
2
- kid: string;
3
- hmacKey: string;
4
- }
@@ -1 +0,0 @@
1
- export * from "./eab-access";
@@ -1,27 +0,0 @@
1
- import { HttpClient, IAccess, ILogger, Registrable } from "@certd/pipeline";
2
- export type DnsProviderDefine = Registrable & {
3
- accessType: string;
4
- autowire?: {
5
- [key: string]: any;
6
- };
7
- };
8
- export type CreateRecordOptions = {
9
- fullRecord: string;
10
- type: string;
11
- value: any;
12
- domain: string;
13
- };
14
- export type RemoveRecordOptions<T> = CreateRecordOptions & {
15
- record: T;
16
- };
17
- export type DnsProviderContext = {
18
- access: IAccess;
19
- logger: ILogger;
20
- http: HttpClient;
21
- };
22
- export interface IDnsProvider<T = any> {
23
- onInstance(): Promise<void>;
24
- createRecord(options: CreateRecordOptions): Promise<T>;
25
- removeRecord(options: RemoveRecordOptions<T>): Promise<void>;
26
- setCtx(ctx: DnsProviderContext): void;
27
- }
@@ -1,8 +0,0 @@
1
- import { CreateRecordOptions, DnsProviderContext, IDnsProvider, RemoveRecordOptions } from "./api";
2
- export declare abstract class AbstractDnsProvider<T = any> implements IDnsProvider<T> {
3
- ctx: DnsProviderContext;
4
- setCtx(ctx: DnsProviderContext): void;
5
- abstract createRecord(options: CreateRecordOptions): Promise<T>;
6
- abstract onInstance(): Promise<void>;
7
- abstract removeRecord(options: RemoveRecordOptions<T>): Promise<void>;
8
- }
@@ -1,3 +0,0 @@
1
- import { DnsProviderDefine } from "./api";
2
- export declare const DNS_PROVIDER_CLASS_KEY = "pipeline:dns-provider";
3
- export declare function IsDnsProvider(define: DnsProviderDefine): ClassDecorator;
@@ -1,4 +0,0 @@
1
- export * from "./api";
2
- export * from "./registry";
3
- export * from "./decorator";
4
- export * from "./base";
@@ -1,2 +0,0 @@
1
- import { Registry } from "@certd/pipeline";
2
- export declare const dnsProviderRegistry: Registry<unknown>;
package/dist/d/index.d.ts DELETED
@@ -1,3 +0,0 @@
1
- export * from "./plugin";
2
- export * from "./dns-provider";
3
- export * from "./access";
@@ -1,52 +0,0 @@
1
- import * as acme from "@certd/acme-client";
2
- import { Logger } from "log4js";
3
- import { IContext } from "@certd/pipeline";
4
- import { IDnsProvider } from "../../dns-provider";
5
- import { ClientExternalAccountBindingOptions } from "@certd/acme-client";
6
- export type CertInfo = {
7
- crt: string;
8
- key: string;
9
- csr: string;
10
- };
11
- export type SSLProvider = "letsencrypt" | "buypass" | "zerossl";
12
- export declare class AcmeService {
13
- userContext: IContext;
14
- logger: Logger;
15
- sslProvider: SSLProvider;
16
- eab?: ClientExternalAccountBindingOptions;
17
- constructor(options: {
18
- userContext: IContext;
19
- logger: Logger;
20
- sslProvider: SSLProvider;
21
- eab?: ClientExternalAccountBindingOptions;
22
- });
23
- getAccountConfig(email: string): Promise<any>;
24
- buildAccountKey(email: string): string;
25
- saveAccountConfig(email: string, conf: any): Promise<void>;
26
- getAcmeClient(email: string, isTest?: boolean): Promise<acme.Client>;
27
- createNewKey(): Promise<string>;
28
- parseDomain(fullDomain: string): string;
29
- challengeCreateFn(authz: any, challenge: any, keyAuthorization: string, dnsProvider: IDnsProvider): Promise<any>;
30
- /**
31
- * Function used to remove an ACME challenge response
32
- *
33
- * @param {object} authz Authorization object
34
- * @param {object} challenge Selected challenge
35
- * @param {string} keyAuthorization Authorization key
36
- * @param recordItem challengeCreateFn create record item
37
- * @param dnsProvider dnsProvider
38
- * @returns {Promise}
39
- */
40
- challengeRemoveFn(authz: any, challenge: any, keyAuthorization: string, recordItem: any, dnsProvider: IDnsProvider): Promise<void>;
41
- order(options: {
42
- email: string;
43
- domains: string | string[];
44
- dnsProvider: any;
45
- csrInfo: any;
46
- isTest?: boolean;
47
- }): Promise<CertInfo>;
48
- buildCommonNameByDomains(domains: string | string[]): {
49
- commonName: string;
50
- altNames: string[] | undefined;
51
- };
52
- }
@@ -1,16 +0,0 @@
1
- import { CertInfo } from "./acme";
2
- import forge from "node-forge";
3
- export declare class CertReader implements CertInfo {
4
- crt: string;
5
- key: string;
6
- csr: string;
7
- detail: any;
8
- expires: number;
9
- constructor(certInfo: CertInfo);
10
- toCertInfo(): CertInfo;
11
- getCrtDetail(crt: string): {
12
- detail: forge.pki.Certificate;
13
- expires: Date;
14
- };
15
- saveToFile(type: "crt" | "key", filepath?: string): string;
16
- }
@@ -1,51 +0,0 @@
1
- import { AbstractTaskPlugin, HttpClient, IAccessService, IContext, Step } from "@certd/pipeline";
2
- import { AcmeService, CertInfo, SSLProvider } from "./acme";
3
- import { Logger } from "log4js";
4
- import { CertReader } from "./cert-reader";
5
- export { CertReader };
6
- export type { CertInfo };
7
- export declare class CertApplyPlugin extends AbstractTaskPlugin {
8
- domains: string;
9
- email: string;
10
- sslProvider: SSLProvider;
11
- eabAccessId: number;
12
- dnsProviderType: string;
13
- dnsProviderAccess: string;
14
- renewDays: number;
15
- forceUpdate: string;
16
- csrInfo: string;
17
- intro: string;
18
- acme: AcmeService;
19
- logger: Logger;
20
- userContext: IContext;
21
- accessService: IAccessService;
22
- http: HttpClient;
23
- lastStatus: Step;
24
- cert?: CertInfo;
25
- onInstance(): Promise<void>;
26
- execute(): Promise<void>;
27
- output(certReader: CertReader): Promise<void>;
28
- zipCert(cert: CertInfo, applyTime: string): Promise<void>;
29
- /**
30
- * 是否更新证书
31
- */
32
- condition(): Promise<CertReader | null>;
33
- doCertApply(): Promise<CertReader>;
34
- formatCert(pem: string): string;
35
- formatCerts(cert: {
36
- crt: string;
37
- key: string;
38
- csr: string;
39
- }): CertInfo;
40
- readLastCert(): Promise<CertReader | undefined>;
41
- /**
42
- * 检查是否过期,默认提前20天
43
- * @param expires
44
- * @param maxDays
45
- * @returns {boolean}
46
- */
47
- isWillExpire(expires: number, maxDays?: number): {
48
- isWillExpire: boolean;
49
- leftDays: number;
50
- };
51
- }
@@ -1 +0,0 @@
1
- export * from "./cert-plugin";
@@ -1,16 +0,0 @@
1
- import type { CertInfo } from "./acme.js";
2
- import { CertReader } from "./cert-reader.js";
3
- import { CertApplyBasePlugin } from "./base.js";
4
- import { EabAccess } from "../../access";
5
- export { CertReader };
6
- export type { CertInfo };
7
- export declare class CertApplyLegoPlugin extends CertApplyBasePlugin {
8
- dnsType: string;
9
- environment: string;
10
- legoEabAccessId: number;
11
- customArgs: string;
12
- eab?: EabAccess;
13
- onInstance(): Promise<void>;
14
- onInit(): Promise<void>;
15
- doCertApply(): Promise<CertReader>;
16
- }
@@ -1,153 +0,0 @@
1
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
- return c > 3 && r && Object.defineProperty(target, key, r), r;
6
- };
7
- var __metadata = (this && this.__metadata) || function (k, v) {
8
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
- };
10
- import { IsTaskPlugin, pluginGroups, RunStrategy, sp, TaskInput } from "@certd/pipeline";
11
- import { CertReader } from "./cert-reader.js";
12
- import { CertApplyBasePlugin } from "./base.js";
13
- import fs from "fs";
14
- import path from "path";
15
- export { CertReader };
16
- let CertApplyLegoPlugin = class CertApplyLegoPlugin extends CertApplyBasePlugin {
17
- dnsType;
18
- environment;
19
- legoEabAccessId;
20
- customArgs = "";
21
- eab;
22
- async onInstance() {
23
- this.accessService = this.ctx.accessService;
24
- this.logger = this.ctx.logger;
25
- this.userContext = this.ctx.userContext;
26
- this.http = this.ctx.http;
27
- this.lastStatus = this.ctx.lastStatus;
28
- if (this.legoEabAccessId) {
29
- this.eab = await this.ctx.accessService.getById(this.legoEabAccessId);
30
- }
31
- }
32
- async onInit() { }
33
- async doCertApply() {
34
- const env = {};
35
- const env_lines = this.environment.split("\n");
36
- for (const line of env_lines) {
37
- const [key, value] = line.trim().split("=");
38
- env[key] = value.trim();
39
- }
40
- let domainArgs = "";
41
- for (const domain of this.domains) {
42
- domainArgs += ` -d "${domain}"`;
43
- }
44
- this.logger.info(`环境变量:${JSON.stringify(env)}`);
45
- let eabArgs = "";
46
- if (this.eab) {
47
- eabArgs = ` --eab "${this.eab.kid}" --kid "${this.eab.kid}" --hmac "${this.eab.hmacKey}"`;
48
- }
49
- const keyType = "-k rsa2048";
50
- const saveDir = `./data/.lego/pipeline_${this.pipeline.id}/`;
51
- const savePathArgs = `--path "${saveDir}"`;
52
- const os_type = process.platform === "win32" ? "windows" : "linux";
53
- const legoPath = path.resolve("./tools", os_type, "lego");
54
- const cmds = [
55
- `${legoPath} -a --email "${this.email}" --dns ${this.dnsType} ${keyType} ${domainArgs} ${eabArgs} ${savePathArgs} ${this.customArgs || ""} run`,
56
- ];
57
- await sp.spawn({
58
- cmd: cmds,
59
- logger: this.logger,
60
- env,
61
- });
62
- //读取证书文件
63
- // example.com.crt
64
- // example.com.issuer.crt
65
- // example.com.json
66
- // example.com.key
67
- let domain1 = this.domains[0];
68
- domain1 = domain1.replaceAll("*", "_");
69
- const crtPath = path.resolve(saveDir, "certificates", `${domain1}.crt`);
70
- if (fs.existsSync(crtPath) === false) {
71
- throw new Error(`证书文件不存在,证书申请失败:${crtPath}`);
72
- }
73
- const crt = fs.readFileSync(crtPath, "utf8");
74
- const keyPath = path.resolve(saveDir, "certificates", `${domain1}.key`);
75
- const key = fs.readFileSync(keyPath, "utf8");
76
- const csr = "";
77
- const cert = { crt, key, csr };
78
- const certInfo = this.formatCerts(cert);
79
- return new CertReader(certInfo);
80
- }
81
- };
82
- __decorate([
83
- TaskInput({
84
- title: "DNS类型",
85
- component: {
86
- name: "a-input",
87
- vModel: "value",
88
- placeholder: "alidns",
89
- },
90
- helper: "你的域名是通过哪家提供商进行解析的,具体应该配置什么请参考lego文档:https://go-acme.github.io/lego/dns/",
91
- required: true,
92
- }),
93
- __metadata("design:type", String)
94
- ], CertApplyLegoPlugin.prototype, "dnsType", void 0);
95
- __decorate([
96
- TaskInput({
97
- title: "环境变量",
98
- component: {
99
- name: "a-textarea",
100
- vModel: "value",
101
- rows: 4,
102
- placeholder: "ALICLOUD_ACCESS_KEY=abcdefghijklmnopqrstuvwx\nALICLOUD_SECRET_KEY=your-secret-key",
103
- },
104
- required: true,
105
- helper: "一行一条,例如 appKeyId=xxxxx,具体配置请参考lego文档:https://go-acme.github.io/lego/dns/",
106
- }),
107
- __metadata("design:type", String)
108
- ], CertApplyLegoPlugin.prototype, "environment", void 0);
109
- __decorate([
110
- TaskInput({
111
- title: "EAB授权",
112
- component: {
113
- name: "pi-access-selector",
114
- type: "eab",
115
- },
116
- maybeNeed: true,
117
- helper: "如果需要提供EAB授权",
118
- }),
119
- __metadata("design:type", Number)
120
- ], CertApplyLegoPlugin.prototype, "legoEabAccessId", void 0);
121
- __decorate([
122
- TaskInput({
123
- title: "自定义LEGO参数",
124
- component: {
125
- name: "a-input",
126
- vModel: "value",
127
- placeholder: "--dns-timeout 30",
128
- },
129
- helper: "额外的lego命令行参数,参考文档:https://go-acme.github.io/lego/usage/cli/options/",
130
- maybeNeed: true,
131
- }),
132
- __metadata("design:type", Object)
133
- ], CertApplyLegoPlugin.prototype, "customArgs", void 0);
134
- CertApplyLegoPlugin = __decorate([
135
- IsTaskPlugin({
136
- name: "CertApplyLego",
137
- title: "证书申请(Lego)",
138
- group: pluginGroups.cert.key,
139
- desc: "支持海量DNS解析提供商,推荐使用,一样的免费通配符域名证书申请,支持多个域名打到同一个证书上",
140
- default: {
141
- input: {
142
- renewDays: 20,
143
- forceUpdate: false,
144
- },
145
- strategy: {
146
- runStrategy: RunStrategy.AlwaysRun,
147
- },
148
- },
149
- })
150
- ], CertApplyLegoPlugin);
151
- export { CertApplyLegoPlugin };
152
- new CertApplyLegoPlugin();
153
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGVnby5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wbHVnaW4vY2VydC1wbHVnaW4vbGVnby50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFRLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRS9GLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDaEQsT0FBTyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBRXBCLE9BQU8sSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUV4QixPQUFPLEVBQUUsVUFBVSxFQUFFLENBQUM7QUFrQmYsSUFBTSxtQkFBbUIsR0FBekIsTUFBTSxtQkFBb0IsU0FBUSxtQkFBbUI7SUFXMUQsT0FBTyxDQUFVO0lBYWpCLFdBQVcsQ0FBVTtJQVdyQixlQUFlLENBQVU7SUFZekIsVUFBVSxHQUFHLEVBQUUsQ0FBQztJQUVoQixHQUFHLENBQWE7SUFFaEIsS0FBSyxDQUFDLFVBQVU7UUFDZCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDO1FBQzVDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUM7UUFDOUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQztRQUN4QyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDO1FBQzFCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFrQixDQUFDO1FBQzlDLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxHQUFHLEdBQUcsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ3hFLENBQUM7SUFDSCxDQUFDO0lBQ0QsS0FBSyxDQUFDLE1BQU0sS0FBbUIsQ0FBQztJQUVoQyxLQUFLLENBQUMsV0FBVztRQUNmLE1BQU0sR0FBRyxHQUFRLEVBQUUsQ0FBQztRQUNwQixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMvQyxLQUFLLE1BQU0sSUFBSSxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQzdCLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM1QyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzFCLENBQUM7UUFFRCxJQUFJLFVBQVUsR0FBRyxFQUFFLENBQUM7UUFDcEIsS0FBSyxNQUFNLE1BQU0sSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDbEMsVUFBVSxJQUFJLFFBQVEsTUFBTSxHQUFHLENBQUM7UUFDbEMsQ0FBQztRQUNELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDaEQsSUFBSSxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2pCLElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ2IsT0FBTyxHQUFHLFdBQVcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFlBQVksSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLGFBQWEsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEdBQUcsQ0FBQztRQUM1RixDQUFDO1FBQ0QsTUFBTSxPQUFPLEdBQUcsWUFBWSxDQUFDO1FBRTdCLE1BQU0sT0FBTyxHQUFHLHlCQUF5QixJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsR0FBRyxDQUFDO1FBQzdELE1BQU0sWUFBWSxHQUFHLFdBQVcsT0FBTyxHQUFHLENBQUM7UUFDM0MsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLFFBQVEsS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO1FBQ25FLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUMxRCxNQUFNLElBQUksR0FBRztZQUNYLEdBQUcsUUFBUSxnQkFBZ0IsSUFBSSxDQUFDLEtBQUssV0FBVyxJQUFJLENBQUMsT0FBTyxJQUFJLE9BQU8sSUFBSSxVQUFVLElBQUksT0FBTyxJQUFJLFlBQVksS0FBSyxJQUFJLENBQUMsVUFBVSxJQUFJLEVBQUUsTUFBTTtTQUNqSixDQUFDO1FBRUYsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ2IsR0FBRyxFQUFFLElBQUk7WUFDVCxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07WUFDbkIsR0FBRztTQUNKLENBQUMsQ0FBQztRQUVILFFBQVE7UUFDUixrQkFBa0I7UUFDbEIseUJBQXlCO1FBQ3pCLG1CQUFtQjtRQUNuQixrQkFBa0I7UUFFbEIsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5QixPQUFPLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDdkMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsY0FBYyxFQUFFLEdBQUcsT0FBTyxNQUFNLENBQUMsQ0FBQztRQUN4RSxJQUFJLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEtBQUssS0FBSyxFQUFFLENBQUM7WUFDckMsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQkFBa0IsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUMvQyxDQUFDO1FBQ0QsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDN0MsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsY0FBYyxFQUFFLEdBQUcsT0FBTyxNQUFNLENBQUMsQ0FBQztRQUN4RSxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUM3QyxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUM7UUFDZixNQUFNLElBQUksR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7UUFDL0IsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4QyxPQUFPLElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2xDLENBQUM7Q0FDRixDQUFBO0FBekdDO0lBVkMsU0FBUyxDQUFDO1FBQ1QsS0FBSyxFQUFFLE9BQU87UUFDZCxTQUFTLEVBQUU7WUFDVCxJQUFJLEVBQUUsU0FBUztZQUNmLE1BQU0sRUFBRSxPQUFPO1lBQ2YsV0FBVyxFQUFFLFFBQVE7U0FDdEI7UUFDRCxNQUFNLEVBQUUseUVBQXlFO1FBQ2pGLFFBQVEsRUFBRSxJQUFJO0tBQ2YsQ0FBQzs7b0RBQ2U7QUFhakI7SUFYQyxTQUFTLENBQUM7UUFDVCxLQUFLLEVBQUUsTUFBTTtRQUNiLFNBQVMsRUFBRTtZQUNULElBQUksRUFBRSxZQUFZO1lBQ2xCLE1BQU0sRUFBRSxPQUFPO1lBQ2YsSUFBSSxFQUFFLENBQUM7WUFDUCxXQUFXLEVBQUUsbUZBQW1GO1NBQ2pHO1FBQ0QsUUFBUSxFQUFFLElBQUk7UUFDZCxNQUFNLEVBQUUsMEVBQTBFO0tBQ25GLENBQUM7O3dEQUNtQjtBQVdyQjtJQVRDLFNBQVMsQ0FBQztRQUNULEtBQUssRUFBRSxPQUFPO1FBQ2QsU0FBUyxFQUFFO1lBQ1QsSUFBSSxFQUFFLG9CQUFvQjtZQUMxQixJQUFJLEVBQUUsS0FBSztTQUNaO1FBQ0QsU0FBUyxFQUFFLElBQUk7UUFDZixNQUFNLEVBQUUsYUFBYTtLQUN0QixDQUFDOzs0REFDdUI7QUFZekI7SUFWQyxTQUFTLENBQUM7UUFDVCxLQUFLLEVBQUUsV0FBVztRQUNsQixTQUFTLEVBQUU7WUFDVCxJQUFJLEVBQUUsU0FBUztZQUNmLE1BQU0sRUFBRSxPQUFPO1lBQ2YsV0FBVyxFQUFFLGtCQUFrQjtTQUNoQztRQUNELE1BQU0sRUFBRSxxRUFBcUU7UUFDN0UsU0FBUyxFQUFFLElBQUk7S0FDaEIsQ0FBQzs7dURBQ2M7QUEvQ0wsbUJBQW1CO0lBZi9CLFlBQVksQ0FBQztRQUNaLElBQUksRUFBRSxlQUFlO1FBQ3JCLEtBQUssRUFBRSxZQUFZO1FBQ25CLEtBQUssRUFBRSxZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUc7UUFDNUIsSUFBSSxFQUFFLGlEQUFpRDtRQUN2RCxPQUFPLEVBQUU7WUFDUCxLQUFLLEVBQUU7Z0JBQ0wsU0FBUyxFQUFFLEVBQUU7Z0JBQ2IsV0FBVyxFQUFFLEtBQUs7YUFDbkI7WUFDRCxRQUFRLEVBQUU7Z0JBQ1IsV0FBVyxFQUFFLFdBQVcsQ0FBQyxTQUFTO2FBQ25DO1NBQ0Y7S0FDRixDQUFDO0dBQ1csbUJBQW1CLENBb0gvQjs7QUFFRCxJQUFJLG1CQUFtQixFQUFFLENBQUMifQ==