UNPKG

@0xsticks/web3modal-angular-sticks

Version:

Web3Modal implementation for Angular

68 lines 18.9 kB
import { Component, Input, ViewEncapsulation, } from '@angular/core'; import { Web3ModalService } from './web3-modal.service'; import * as i0 from "@angular/core"; import * as i1 from "./web3-modal.service"; import * as i2 from "../modal/modal.component"; import * as i3 from "./web3-modal-metamask-logo.component"; import * as i4 from "@angular/common"; export class Web3ModalComponent { constructor(service) { this.service = service; this.open = false; this.providers = []; this.metamaskShopURL = 'https://metamask.io/download.html'; this.promptMetamaskIfNotInstalled = false; } ngOnInit() { this.openSubscription = this.service.shouldOpen.subscribe({ next: (open) => { this.open = open; }, }); this.providersSubscription = this.service.providers.subscribe({ next: (providers) => { this.showMetamaskDownload = this.promptMetamaskIfNotInstalled && !this.isMetamaskInProviders(providers); this.providers = providers; for (let provider of providers) { let filename = provider.logo .toString() .substring(provider.logo.toString().lastIndexOf('/') + 1); let url = new URL(`/logos/${filename}`, document.baseURI); provider.logo = url; } }, }); } ngOnDestroy() { this.openSubscription.unsubscribe(); this.providersSubscription.unsubscribe(); } close() { this.service.close(); } isMetamaskInProviders(providers) { return providers.some((p) => p.name.toLowerCase() === 'metamask'); } openMetamaskDownloadPage() { window.open(this.metamaskShopURL, '_blank'); } } Web3ModalComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.1", ngImport: i0, type: Web3ModalComponent, deps: [{ token: i1.Web3ModalService }], target: i0.ɵɵFactoryTarget.Component }); Web3ModalComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.1", type: Web3ModalComponent, selector: "m-web3-modal", inputs: { title: "title", description: "description", descriptionGray: "descriptionGray", dismissText: "dismissText", promptMetamaskIfNotInstalled: "promptMetamaskIfNotInstalled" }, ngImport: i0, template: "<m-modal [open]=\"open\" (closed)=\"close()\">\n <div class=\"m-web3Modal\">\n <div class=\"m-web3Modal__header\">\n <h3 class=\"m-web3ModalHeader__title\">\n {{ title }}\n </h3>\n <div class=\"m-web3ModalHeader__description\">\n <p class=\"m-web3ModalHeader__text\">\n {{ description }}\n </p>\n <p\n class=\"m-web3ModalHeader__text--gray m-web3ModalHeader__text\"\n >\n {{ descriptionGray }}\n </p>\n </div>\n </div>\n <div class=\"m-web3Modal__body\">\n <div class=\"m-web3ModalBody__provider\">\n <div\n class=\"m-web3ModalProvider__body\"\n *ngIf=\"providers && showMetamaskDownload\"\n (click)=\"openMetamaskDownloadPage()\"\n >\n <div class=\"m-web3ModalProviderBody__icon--custom\">\n <m-web3-modal-metamask-logo></m-web3-modal-metamask-logo>\n </div>\n <div class=\"m-web3ModalProviderBody__name\">MetaMask</div>\n </div>\n <div\n class=\"m-web3ModalProvider__body\"\n *ngFor=\"let provider of providers\"\n (click)=\"provider.onClick()\"\n >\n <div class=\"m-web3ModalProviderBody__icon\">\n <img [src]=\"provider.logo\" [alt]=\"provider.logo\" />\n </div>\n <div class=\"m-web3ModalProviderBody__name\">\n {{ provider.name }}\n </div>\n </div>\n </div>\n </div>\n <div class=\"m-web3Modal__footer\">\n <div class=\"m-web3ModalFooter__description\">\n <p class=\"m-web3ModalFooter__text\" (click)=\"close()\">\n {{ dismissText }}\n </p>\n </div>\n </div>\n </div>\n</m-modal>\n", styles: [".m-web3Modal{position:relative;display:block;width:100%;margin:auto;box-sizing:border-box;background-color:#fff}@media screen and (max-width: 540px){.m-web3Modal{flex:1;display:flex;flex-direction:column;justify-content:space-between;border-radius:0;margin:0}}.m-web3Modal__header{padding:40px 50px 0}.m-web3ModalHeader__title{font-size:30px;font-weight:800;margin:0;color:#4f4f50}.m-web3ModalHeader__text{margin:0;font-weight:600;line-height:22px;font-size:16px;color:#4f4f50}.m-web3ModalHeader__description{display:flex;flex-direction:column;justify-content:center;min-height:70px}.m-web3ModalHeader__text--gray{margin:0;color:#7d7d82}.m-web3Modal__footer{height:100px;margin-top:-40px;display:flex;padding:0 50px;flex-direction:column;justify-content:center}@media screen and (max-width: 768px){.m-web3Modal__footer{margin-top:-20px}}.m-web3ModalFooter__text{text-align:center;font-size:17px;font-weight:600;margin:0;cursor:pointer;color:#7d7d82}.m-web3Modal__body{padding:20px 50px;max-height:420px;overflow-y:auto}.m-web3ModalBody__provider{display:flex;justify-content:space-between;flex-wrap:wrap}@media screen and (max-width: 540px){.m-web3ModalBody__provider{justify-content:center}}.m-web3ModalProvider__body{display:flex;justify-content:center;align-items:center;flex-direction:column;cursor:pointer;width:194px;height:165px;margin-bottom:20px;background-color:#fff;border:1px solid #dce2e4}.m-web3ModalProviderBody__name{margin-top:12px;font-weight:600;font-size:15px;color:#4f4f50}.m-web3ModalProviderBody__icon,.m-web3ModalProviderBody__icon--custom svg{width:60px;height:60px;display:flex;border-radius:50%;overflow:visible;box-shadow:none;justify-content:center;align-items:center}.m-web3ModalProviderBody__icon img,.m-web3ModalProviderBody__icon m-web3-modal-metamask-logo,.m-web3ModalProviderBody__icon--custom svg img,.m-web3ModalProviderBody__icon--custom svg m-web3-modal-metamask-logo{width:100%;height:100%}\n"], components: [{ type: i2.Modal, selector: "m-modal", inputs: ["open", "allowClose"], outputs: ["closed"] }, { type: i3.Web3ModalMetamaskLogoComponent, selector: "m-web3-modal-metamask-logo" }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], encapsulation: i0.ViewEncapsulation.None }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.1", ngImport: i0, type: Web3ModalComponent, decorators: [{ type: Component, args: [{ selector: 'm-web3-modal', encapsulation: ViewEncapsulation.None, template: "<m-modal [open]=\"open\" (closed)=\"close()\">\n <div class=\"m-web3Modal\">\n <div class=\"m-web3Modal__header\">\n <h3 class=\"m-web3ModalHeader__title\">\n {{ title }}\n </h3>\n <div class=\"m-web3ModalHeader__description\">\n <p class=\"m-web3ModalHeader__text\">\n {{ description }}\n </p>\n <p\n class=\"m-web3ModalHeader__text--gray m-web3ModalHeader__text\"\n >\n {{ descriptionGray }}\n </p>\n </div>\n </div>\n <div class=\"m-web3Modal__body\">\n <div class=\"m-web3ModalBody__provider\">\n <div\n class=\"m-web3ModalProvider__body\"\n *ngIf=\"providers && showMetamaskDownload\"\n (click)=\"openMetamaskDownloadPage()\"\n >\n <div class=\"m-web3ModalProviderBody__icon--custom\">\n <m-web3-modal-metamask-logo></m-web3-modal-metamask-logo>\n </div>\n <div class=\"m-web3ModalProviderBody__name\">MetaMask</div>\n </div>\n <div\n class=\"m-web3ModalProvider__body\"\n *ngFor=\"let provider of providers\"\n (click)=\"provider.onClick()\"\n >\n <div class=\"m-web3ModalProviderBody__icon\">\n <img [src]=\"provider.logo\" [alt]=\"provider.logo\" />\n </div>\n <div class=\"m-web3ModalProviderBody__name\">\n {{ provider.name }}\n </div>\n </div>\n </div>\n </div>\n <div class=\"m-web3Modal__footer\">\n <div class=\"m-web3ModalFooter__description\">\n <p class=\"m-web3ModalFooter__text\" (click)=\"close()\">\n {{ dismissText }}\n </p>\n </div>\n </div>\n </div>\n</m-modal>\n", styles: [".m-web3Modal{position:relative;display:block;width:100%;margin:auto;box-sizing:border-box;background-color:#fff}@media screen and (max-width: 540px){.m-web3Modal{flex:1;display:flex;flex-direction:column;justify-content:space-between;border-radius:0;margin:0}}.m-web3Modal__header{padding:40px 50px 0}.m-web3ModalHeader__title{font-size:30px;font-weight:800;margin:0;color:#4f4f50}.m-web3ModalHeader__text{margin:0;font-weight:600;line-height:22px;font-size:16px;color:#4f4f50}.m-web3ModalHeader__description{display:flex;flex-direction:column;justify-content:center;min-height:70px}.m-web3ModalHeader__text--gray{margin:0;color:#7d7d82}.m-web3Modal__footer{height:100px;margin-top:-40px;display:flex;padding:0 50px;flex-direction:column;justify-content:center}@media screen and (max-width: 768px){.m-web3Modal__footer{margin-top:-20px}}.m-web3ModalFooter__text{text-align:center;font-size:17px;font-weight:600;margin:0;cursor:pointer;color:#7d7d82}.m-web3Modal__body{padding:20px 50px;max-height:420px;overflow-y:auto}.m-web3ModalBody__provider{display:flex;justify-content:space-between;flex-wrap:wrap}@media screen and (max-width: 540px){.m-web3ModalBody__provider{justify-content:center}}.m-web3ModalProvider__body{display:flex;justify-content:center;align-items:center;flex-direction:column;cursor:pointer;width:194px;height:165px;margin-bottom:20px;background-color:#fff;border:1px solid #dce2e4}.m-web3ModalProviderBody__name{margin-top:12px;font-weight:600;font-size:15px;color:#4f4f50}.m-web3ModalProviderBody__icon,.m-web3ModalProviderBody__icon--custom svg{width:60px;height:60px;display:flex;border-radius:50%;overflow:visible;box-shadow:none;justify-content:center;align-items:center}.m-web3ModalProviderBody__icon img,.m-web3ModalProviderBody__icon m-web3-modal-metamask-logo,.m-web3ModalProviderBody__icon--custom svg img,.m-web3ModalProviderBody__icon--custom svg m-web3-modal-metamask-logo{width:100%;height:100%}\n"] }] }], ctorParameters: function () { return [{ type: i1.Web3ModalService }]; }, propDecorators: { title: [{ type: Input }], description: [{ type: Input }], descriptionGray: [{ type: Input }], dismissText: [{ type: Input }], promptMetamaskIfNotInstalled: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViMy1tb2RhbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy93ZWIzbW9kYWwvc3JjL2xpYi93ZWIzLW1vZGFsL3dlYjMtbW9kYWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvd2ViM21vZGFsL3NyYy9saWIvd2ViMy1tb2RhbC93ZWIzLW1vZGFsLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUdMLGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUd2QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7Ozs7O0FBUXhELE1BQU0sT0FBTyxrQkFBa0I7SUFlN0IsWUFBb0IsT0FBeUI7UUFBekIsWUFBTyxHQUFQLE9BQU8sQ0FBa0I7UUFkN0MsU0FBSSxHQUFHLEtBQUssQ0FBQztRQUNiLGNBQVMsR0FBMkIsRUFBRSxDQUFDO1FBS3RCLG9CQUFlLEdBQUcsbUNBQW1DLENBQUM7UUFNOUQsaUNBQTRCLEdBQUcsS0FBSyxDQUFDO0lBRUUsQ0FBQztJQUVqRCxRQUFRO1FBQ04sSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQztZQUN4RCxJQUFJLEVBQUUsQ0FBQyxJQUFhLEVBQUUsRUFBRTtnQkFDdEIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7WUFDbkIsQ0FBQztTQUNGLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUM7WUFDNUQsSUFBSSxFQUFFLENBQUMsU0FBaUMsRUFBRSxFQUFFO2dCQUMxQyxJQUFJLENBQUMsb0JBQW9CO29CQUN2QixJQUFJLENBQUMsNEJBQTRCO3dCQUNqQyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDekMsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7Z0JBRTNCLEtBQUssSUFBSSxRQUFRLElBQUksU0FBUyxFQUFFO29CQUM5QixJQUFJLFFBQVEsR0FBRyxRQUFRLENBQUMsSUFBSTt5QkFDekIsUUFBUSxFQUFFO3lCQUNWLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztvQkFDNUQsSUFBSSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsVUFBVSxRQUFRLEVBQUUsRUFBRSxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7b0JBQzFELFFBQVEsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDO2lCQUNyQjtZQUNILENBQUM7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNwQyxJQUFJLENBQUMscUJBQXFCLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDM0MsQ0FBQztJQUVELEtBQUs7UUFDSCxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFFTyxxQkFBcUIsQ0FBQyxTQUFpQztRQUM3RCxPQUFPLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEtBQUssVUFBVSxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUVPLHdCQUF3QjtRQUM5QixNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDOUMsQ0FBQzs7K0dBekRVLGtCQUFrQjttR0FBbEIsa0JBQWtCLDBPQ2pCL0IscXNEQW9EQTsyRkRuQ2Esa0JBQWtCO2tCQU45QixTQUFTOytCQUNFLGNBQWMsaUJBR1QsaUJBQWlCLENBQUMsSUFBSTt1R0FXNUIsS0FBSztzQkFBYixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLDRCQUE0QjtzQkFBcEMsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IElQcm92aWRlclVzZXJPcHRpb25zIH0gZnJvbSAnQG1pbmRzb3JnL3dlYjNtb2RhbC10cyc7XG5pbXBvcnQgeyBXZWIzTW9kYWxTZXJ2aWNlIH0gZnJvbSAnLi93ZWIzLW1vZGFsLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdtLXdlYjMtbW9kYWwnLFxuICB0ZW1wbGF0ZVVybDogJ3dlYjMtbW9kYWwuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi93ZWIzLW1vZGFsLmNvbXBvbmVudC5zY3NzJ10sXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG59KVxuZXhwb3J0IGNsYXNzIFdlYjNNb2RhbENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgb3BlbiA9IGZhbHNlO1xuICBwcm92aWRlcnM6IElQcm92aWRlclVzZXJPcHRpb25zW10gPSBbXTtcbiAgc2hvd01ldGFtYXNrRG93bmxvYWQ6IGJvb2xlYW47XG5cbiAgcHJpdmF0ZSBvcGVuU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgcHJvdmlkZXJzU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgcmVhZG9ubHkgbWV0YW1hc2tTaG9wVVJMID0gJ2h0dHBzOi8vbWV0YW1hc2suaW8vZG93bmxvYWQuaHRtbCc7XG5cbiAgQElucHV0KCkgdGl0bGU6IHN0cmluZztcbiAgQElucHV0KCkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGRlc2NyaXB0aW9uR3JheT86IHN0cmluZztcbiAgQElucHV0KCkgZGlzbWlzc1RleHQ/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIHByb21wdE1ldGFtYXNrSWZOb3RJbnN0YWxsZWQgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHNlcnZpY2U6IFdlYjNNb2RhbFNlcnZpY2UpIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5vcGVuU3Vic2NyaXB0aW9uID0gdGhpcy5zZXJ2aWNlLnNob3VsZE9wZW4uc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChvcGVuOiBib29sZWFuKSA9PiB7XG4gICAgICAgIHRoaXMub3BlbiA9IG9wZW47XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgdGhpcy5wcm92aWRlcnNTdWJzY3JpcHRpb24gPSB0aGlzLnNlcnZpY2UucHJvdmlkZXJzLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocHJvdmlkZXJzOiBJUHJvdmlkZXJVc2VyT3B0aW9uc1tdKSA9PiB7XG4gICAgICAgIHRoaXMuc2hvd01ldGFtYXNrRG93bmxvYWQgPVxuICAgICAgICAgIHRoaXMucHJvbXB0TWV0YW1hc2tJZk5vdEluc3RhbGxlZCAmJlxuICAgICAgICAgICF0aGlzLmlzTWV0YW1hc2tJblByb3ZpZGVycyhwcm92aWRlcnMpO1xuICAgICAgICB0aGlzLnByb3ZpZGVycyA9IHByb3ZpZGVycztcblxuICAgICAgICBmb3IgKGxldCBwcm92aWRlciBvZiBwcm92aWRlcnMpIHtcbiAgICAgICAgICBsZXQgZmlsZW5hbWUgPSBwcm92aWRlci5sb2dvXG4gICAgICAgICAgICAudG9TdHJpbmcoKVxuICAgICAgICAgICAgLnN1YnN0cmluZyhwcm92aWRlci5sb2dvLnRvU3RyaW5nKCkubGFzdEluZGV4T2YoJy8nKSArIDEpO1xuICAgICAgICAgIGxldCB1cmwgPSBuZXcgVVJMKGAvbG9nb3MvJHtmaWxlbmFtZX1gLCBkb2N1bWVudC5iYXNlVVJJKTtcbiAgICAgICAgICBwcm92aWRlci5sb2dvID0gdXJsO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5vcGVuU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5wcm92aWRlcnNTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIGNsb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuc2VydmljZS5jbG9zZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBpc01ldGFtYXNrSW5Qcm92aWRlcnMocHJvdmlkZXJzOiBJUHJvdmlkZXJVc2VyT3B0aW9uc1tdKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHByb3ZpZGVycy5zb21lKChwKSA9PiBwLm5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ21ldGFtYXNrJyk7XG4gIH1cblxuICBwcml2YXRlIG9wZW5NZXRhbWFza0Rvd25sb2FkUGFnZSgpOiB2b2lkIHtcbiAgICB3aW5kb3cub3Blbih0aGlzLm1ldGFtYXNrU2hvcFVSTCwgJ19ibGFuaycpO1xuICB9XG59XG4iLCI8bS1tb2RhbCBbb3Blbl09XCJvcGVuXCIgKGNsb3NlZCk9XCJjbG9zZSgpXCI+XG4gIDxkaXYgY2xhc3M9XCJtLXdlYjNNb2RhbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJtLXdlYjNNb2RhbF9faGVhZGVyXCI+XG4gICAgICA8aDMgY2xhc3M9XCJtLXdlYjNNb2RhbEhlYWRlcl9fdGl0bGVcIj5cbiAgICAgICAge3sgdGl0bGUgfX1cbiAgICAgIDwvaDM+XG4gICAgICA8ZGl2IGNsYXNzPVwibS13ZWIzTW9kYWxIZWFkZXJfX2Rlc2NyaXB0aW9uXCI+XG4gICAgICAgIDxwIGNsYXNzPVwibS13ZWIzTW9kYWxIZWFkZXJfX3RleHRcIj5cbiAgICAgICAgICB7eyBkZXNjcmlwdGlvbiB9fVxuICAgICAgICA8L3A+XG4gICAgICAgIDxwXG4gICAgICAgICAgY2xhc3M9XCJtLXdlYjNNb2RhbEhlYWRlcl9fdGV4dC0tZ3JheSBtLXdlYjNNb2RhbEhlYWRlcl9fdGV4dFwiXG4gICAgICAgID5cbiAgICAgICAgICB7eyBkZXNjcmlwdGlvbkdyYXkgfX1cbiAgICAgICAgPC9wPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cIm0td2ViM01vZGFsX19ib2R5XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibS13ZWIzTW9kYWxCb2R5X19wcm92aWRlclwiPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJtLXdlYjNNb2RhbFByb3ZpZGVyX19ib2R5XCJcbiAgICAgICAgICAqbmdJZj1cInByb3ZpZGVycyAmJiBzaG93TWV0YW1hc2tEb3dubG9hZFwiXG4gICAgICAgICAgKGNsaWNrKT1cIm9wZW5NZXRhbWFza0Rvd25sb2FkUGFnZSgpXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLXdlYjNNb2RhbFByb3ZpZGVyQm9keV9faWNvbi0tY3VzdG9tXCI+XG4gICAgICAgICAgICA8bS13ZWIzLW1vZGFsLW1ldGFtYXNrLWxvZ28+PC9tLXdlYjMtbW9kYWwtbWV0YW1hc2stbG9nbz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibS13ZWIzTW9kYWxQcm92aWRlckJvZHlfX25hbWVcIj5NZXRhTWFzazwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwibS13ZWIzTW9kYWxQcm92aWRlcl9fYm9keVwiXG4gICAgICAgICAgKm5nRm9yPVwibGV0IHByb3ZpZGVyIG9mIHByb3ZpZGVyc1wiXG4gICAgICAgICAgKGNsaWNrKT1cInByb3ZpZGVyLm9uQ2xpY2soKVwiXG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibS13ZWIzTW9kYWxQcm92aWRlckJvZHlfX2ljb25cIj5cbiAgICAgICAgICAgIDxpbWcgW3NyY109XCJwcm92aWRlci5sb2dvXCIgW2FsdF09XCJwcm92aWRlci5sb2dvXCIgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibS13ZWIzTW9kYWxQcm92aWRlckJvZHlfX25hbWVcIj5cbiAgICAgICAgICAgIHt7IHByb3ZpZGVyLm5hbWUgfX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwibS13ZWIzTW9kYWxfX2Zvb3RlclwiPlxuICAgICAgPGRpdiBjbGFzcz1cIm0td2ViM01vZGFsRm9vdGVyX19kZXNjcmlwdGlvblwiPlxuICAgICAgICA8cCBjbGFzcz1cIm0td2ViM01vZGFsRm9vdGVyX190ZXh0XCIgKGNsaWNrKT1cImNsb3NlKClcIj5cbiAgICAgICAgICB7eyBkaXNtaXNzVGV4dCB9fVxuICAgICAgICA8L3A+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L20tbW9kYWw+XG4iXX0=