medusa-payment-upnance
Version:
Upnance Medusa payment plugin
213 lines • 17.1 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.UpnanceProvider = void 0;
const utils_1 = require("@medusajs/framework/utils");
const bignumber_js_1 = __importDefault(require("bignumber.js"));
const upnance_1 = require("../__generated__/upnance");
const model_1 = require("../model");
class UpnanceProvider extends utils_1.AbstractPaymentProvider {
static validateOptions(options) {
if (!options.apiKey) {
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "API key is required in the provider's options.");
}
if (!options.accountId) {
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Account id is required in the provider's options.");
}
if (!options.environment) {
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "Environment is required in the provider's options.");
}
}
constructor(container, options) {
super(container, options);
const basePath = new URL("", options.environment === "production"
? model_1.API_PRODUCTION_URL
: model_1.API_STAGING_URL).href + "/";
this.upnanceClient = new upnance_1.UpnanceApi(new upnance_1.Configuration({
apiKey: options.apiKey,
basePath,
}));
this.options = options;
}
async getPaymentStatus(args) {
const { id } = args.data;
const { data: transaction } = await this.upnanceClient.checkoutControllerFind({ id });
switch (transaction.status) {
case upnance_1.PayInStatus.SUCCESS:
return { status: utils_1.PaymentSessionStatus.CAPTURED };
case upnance_1.PayInStatus.AUTHORIZED:
return { status: utils_1.PaymentSessionStatus.AUTHORIZED };
case upnance_1.PayInStatus.CREATED:
return { status: utils_1.PaymentSessionStatus.PENDING };
case upnance_1.PayInStatus.FAILURE:
return { status: utils_1.PaymentSessionStatus.ERROR };
case upnance_1.PayInStatus.CANCELLED:
return { status: utils_1.PaymentSessionStatus.CANCELED };
default:
return { status: utils_1.PaymentSessionStatus.PENDING };
}
}
async initiatePayment(args) {
try {
const currency = args.currency_code.toUpperCase();
const { data: payment } = await this.upnanceClient.paymentControllerCreate({
payInCardCreateControllerArgs: {
accountId: this.options.accountId,
acquirer: upnance_1.Acquirer.CLEARHAUS,
gateway: upnance_1.Gateway.QUICKPAY,
currency,
value: new bignumber_js_1.default(args.amount.toString())
.multipliedBy(100)
.toString(),
invoiceAddress: this.newAddress(args.context?.customer?.billing_address ?? undefined),
},
});
await this.upnanceClient.paymentControllerLink({
id: payment.id,
payInCardLinkControllerArgs: { charge: this.options.autoCapture },
});
return {
data: {
...payment,
},
id: payment.id,
};
}
catch (error) {
throw new utils_1.MedusaError(utils_1.MedusaError.Types.CONFLICT, "An error occurred while initiating payment");
}
}
async authorizePayment(args) {
try {
const data = args.data;
const { status } = await this.getPaymentStatus({ data });
return { status, data };
}
catch (error) {
throw new utils_1.MedusaError(utils_1.MedusaError.Types.CONFLICT, "An error occurred while authorizing payment");
}
}
async capturePayment(args) {
try {
const data = args.data;
const { status } = await this.getPaymentStatus({ data });
if (status === utils_1.PaymentSessionStatus.CAPTURED) {
return {
data: await this.retrievePayment({ data }),
};
}
const { data: paymentCharge } = await this.upnanceClient.paymentControllerCharge({
id: data.id,
});
return {
data: {
...paymentCharge,
},
};
}
catch (error) {
throw new utils_1.MedusaError(utils_1.MedusaError.Types.CONFLICT, "An error occurred while capturing payment");
}
}
async refundPayment(args) {
try {
const { value } = args.amount;
const data = args.data;
const { data: refund } = await this.upnanceClient.paymentControllerRefund({
id: data.id,
payInCardRefundControllerArgs: {
value: new bignumber_js_1.default(value).multipliedBy(100).toString(),
},
});
return {
data: {
...refund,
},
};
}
catch (error) {
throw new utils_1.MedusaError(utils_1.MedusaError.Types.CONFLICT, "An error occurred while refunding payment");
}
}
async cancelPayment(args) {
return { data: args.data };
}
async retrievePayment(args) {
try {
const data = args.data;
const { data: transaction } = await this.upnanceClient.checkoutControllerFind({
id: data.id,
});
return {
data: {
...transaction,
},
};
}
catch (error) {
throw new utils_1.MedusaError(utils_1.MedusaError.Types.CONFLICT, "An error occurred while retrieving payment");
}
}
async updatePayment(args) {
return { data: args.data };
}
async deletePayment(args) {
return { data: args.data };
}
async getWebhookActionAndData(args) {
if (!(0, model_1.isChecksumValid)(args.data, String(args.headers[model_1.WEBHOOK_HEADER_CHECKSUM_NAME]), this.options.apiKeySecret)) {
throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNAUTHORIZED, "Invalid checksum");
}
const data = args.data;
try {
return {
action: this.newPaymentAction(data.status),
};
}
catch (error) {
throw new utils_1.MedusaError(utils_1.MedusaError.Types.CONFLICT, "An error occurred while processing the webhook");
}
}
newAddress(address) {
if (!address?.address_1 ||
!address?.city ||
!address?.province ||
!address?.postal_code ||
!address?.country_code) {
return undefined;
}
const country = address.country_code.toUpperCase();
if (!Object.values(upnance_1.Country).includes(country)) {
return undefined;
}
return {
addressLine1: address.address_1,
addressLine2: address.address_2 ?? undefined,
city: address.city,
stateOrCounty: address.province,
postalCode: address.postal_code,
country,
};
}
newPaymentAction(status) {
switch (status) {
case upnance_1.PayInStatus.SUCCESS:
return utils_1.PaymentActions.SUCCESSFUL;
case upnance_1.PayInStatus.AUTHORIZED:
return utils_1.PaymentActions.AUTHORIZED;
case upnance_1.PayInStatus.CREATED:
return utils_1.PaymentActions.PENDING;
case upnance_1.PayInStatus.FAILURE:
return utils_1.PaymentActions.FAILED;
case upnance_1.PayInStatus.CANCELLED:
return utils_1.PaymentActions.CANCELED;
default:
return utils_1.PaymentActions.PENDING;
}
}
}
exports.UpnanceProvider = UpnanceProvider;
UpnanceProvider.identifier = model_1.UPNANCE_IDENTIFIER;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBuYW5jZS1wcm92aWRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9wcm92aWRlcnMvdXBuYW5jZS9zZXJ2aWNlcy91cG5hbmNlLXByb3ZpZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQXdCQSxxREFLbUM7QUFDbkMsZ0VBQXFDO0FBQ3JDLHNEQVNrQztBQUNsQyxvQ0FRa0I7QUFTbEIsTUFBYSxlQUFnQixTQUFRLCtCQUF1QztJQUcxRSxNQUFNLENBQUMsZUFBZSxDQUFDLE9BQXVCO1FBQzVDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDcEIsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFlBQVksRUFDOUIsZ0RBQWdELENBQ2pELENBQUM7UUFDSixDQUFDO1FBRUQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUN2QixNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUM5QixtREFBbUQsQ0FDcEQsQ0FBQztRQUNKLENBQUM7UUFFRCxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3pCLE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQzlCLG9EQUFvRCxDQUNyRCxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFLRCxZQUFZLFNBQWMsRUFBRSxPQUF1QjtRQUNqRCxLQUFLLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBRTFCLE1BQU0sUUFBUSxHQUNaLElBQUksR0FBRyxDQUNMLEVBQUUsRUFDRixPQUFPLENBQUMsV0FBVyxLQUFLLFlBQVk7WUFDbEMsQ0FBQyxDQUFDLDBCQUFrQjtZQUNwQixDQUFDLENBQUMsdUJBQWUsQ0FDcEIsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDO1FBRWYsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLG9CQUFVLENBQ2pDLElBQUksdUJBQWEsQ0FBQztZQUNoQixNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07WUFDdEIsUUFBUTtTQUNULENBQUMsQ0FDSCxDQUFDO1FBQ0YsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7SUFDekIsQ0FBQztJQUVNLEtBQUssQ0FBQyxnQkFBZ0IsQ0FDM0IsSUFBMkI7UUFFM0IsTUFBTSxFQUFFLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxJQUF3QixDQUFDO1FBRTdDLE1BQU0sRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLEdBQ3pCLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFMUQsUUFBUSxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDM0IsS0FBSyxxQkFBVyxDQUFDLE9BQU87Z0JBQ3RCLE9BQU8sRUFBRSxNQUFNLEVBQUUsNEJBQW9CLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbkQsS0FBSyxxQkFBVyxDQUFDLFVBQVU7Z0JBQ3pCLE9BQU8sRUFBRSxNQUFNLEVBQUUsNEJBQW9CLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDckQsS0FBSyxxQkFBVyxDQUFDLE9BQU87Z0JBQ3RCLE9BQU8sRUFBRSxNQUFNLEVBQUUsNEJBQW9CLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDbEQsS0FBSyxxQkFBVyxDQUFDLE9BQU87Z0JBQ3RCLE9BQU8sRUFBRSxNQUFNLEVBQUUsNEJBQW9CLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDaEQsS0FBSyxxQkFBVyxDQUFDLFNBQVM7Z0JBQ3hCLE9BQU8sRUFBRSxNQUFNLEVBQUUsNEJBQW9CLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbkQ7Z0JBQ0UsT0FBTyxFQUFFLE1BQU0sRUFBRSw0QkFBb0IsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNwRCxDQUFDO0lBQ0gsQ0FBQztJQUVNLEtBQUssQ0FBQyxlQUFlLENBQzFCLElBQTBCO1FBRTFCLElBQUksQ0FBQztZQUNILE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFjLENBQUM7WUFFOUQsTUFBTSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsR0FDckIsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLHVCQUF1QixDQUFDO2dCQUMvQyw2QkFBNkIsRUFBRTtvQkFDN0IsU0FBUyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUztvQkFDakMsUUFBUSxFQUFFLGtCQUFRLENBQUMsU0FBUztvQkFDNUIsT0FBTyxFQUFFLGlCQUFPLENBQUMsUUFBUTtvQkFDekIsUUFBUTtvQkFDUixLQUFLLEVBQUUsSUFBSSxzQkFBUyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7eUJBQ3pDLFlBQVksQ0FBQyxHQUFHLENBQUM7eUJBQ2pCLFFBQVEsRUFBRTtvQkFDYixjQUFjLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FDN0IsSUFBSSxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsZUFBZSxJQUFJLFNBQVMsQ0FDckQ7aUJBQ0Y7YUFDRixDQUFDLENBQUM7WUFFTCxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMscUJBQXFCLENBQUM7Z0JBQzdDLEVBQUUsRUFBRSxPQUFPLENBQUMsRUFBRTtnQkFDZCwyQkFBMkIsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRTthQUNsRSxDQUFDLENBQUM7WUFFSCxPQUFPO2dCQUNMLElBQUksRUFBRTtvQkFDSixHQUFHLE9BQU87aUJBQ1g7Z0JBQ0QsRUFBRSxFQUFFLE9BQU8sQ0FBQyxFQUFFO2FBQ2YsQ0FBQztRQUNKLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFDMUIsNENBQTRDLENBQzdDLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUVNLEtBQUssQ0FBQyxnQkFBZ0IsQ0FDM0IsSUFBMkI7UUFFM0IsSUFBSSxDQUFDO1lBQ0gsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQXdCLENBQUM7WUFFM0MsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUV6RCxPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDO1FBQzFCLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFDMUIsNkNBQTZDLENBQzlDLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUVNLEtBQUssQ0FBQyxjQUFjLENBQ3pCLElBQXlCO1FBRXpCLElBQUksQ0FBQztZQUNILE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxJQUF3QixDQUFDO1lBRTNDLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDekQsSUFBSSxNQUFNLEtBQUssNEJBQW9CLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQzdDLE9BQU87b0JBQ0wsSUFBSSxFQUFFLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDO2lCQUMzQyxDQUFDO1lBQ0osQ0FBQztZQUVELE1BQU0sRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLEdBQzNCLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyx1QkFBdUIsQ0FBQztnQkFDL0MsRUFBRSxFQUFFLElBQUksQ0FBQyxFQUFFO2FBQ1osQ0FBQyxDQUFDO1lBRUwsT0FBTztnQkFDTCxJQUFJLEVBQUU7b0JBQ0osR0FBRyxhQUFhO2lCQUNqQjthQUNGLENBQUM7UUFDSixDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQzFCLDJDQUEyQyxDQUM1QyxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFTSxLQUFLLENBQUMsYUFBYSxDQUN4QixJQUF3QjtRQUV4QixJQUFJLENBQUM7WUFDSCxNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQTJCLENBQUM7WUFFbkQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQXdCLENBQUM7WUFDM0MsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsdUJBQXVCLENBQ3ZFO2dCQUNFLEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBRTtnQkFDWCw2QkFBNkIsRUFBRTtvQkFDN0IsS0FBSyxFQUFFLElBQUksc0JBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFO2lCQUN6RDthQUNGLENBQ0YsQ0FBQztZQUVGLE9BQU87Z0JBQ0wsSUFBSSxFQUFFO29CQUNKLEdBQUcsTUFBTTtpQkFDVjthQUNGLENBQUM7UUFDSixDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQzFCLDJDQUEyQyxDQUM1QyxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFTSxLQUFLLENBQUMsYUFBYSxDQUN4QixJQUF3QjtRQUV4QixPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRU0sS0FBSyxDQUFDLGVBQWUsQ0FDMUIsSUFBMEI7UUFFMUIsSUFBSSxDQUFDO1lBQ0gsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQXdCLENBQUM7WUFDM0MsTUFBTSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsR0FDekIsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLHNCQUFzQixDQUFDO2dCQUM5QyxFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUU7YUFDWixDQUFDLENBQUM7WUFFTCxPQUFPO2dCQUNMLElBQUksRUFBRTtvQkFDSixHQUFHLFdBQVc7aUJBQ2Y7YUFDRixDQUFDO1FBQ0osQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUMxQiw0Q0FBNEMsQ0FDN0MsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0lBRU0sS0FBSyxDQUFDLGFBQWEsQ0FDeEIsSUFBd0I7UUFFeEIsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVNLEtBQUssQ0FBQyxhQUFhLENBQ3hCLElBQXdCO1FBRXhCLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFTSxLQUFLLENBQUMsdUJBQXVCLENBQ2xDLElBQXVDO1FBRXZDLElBQ0UsQ0FBQyxJQUFBLHVCQUFlLEVBQ2QsSUFBSSxDQUFDLElBQUksRUFDVCxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxvQ0FBNEIsQ0FBQyxDQUFDLEVBQ2xELElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUMxQixFQUNELENBQUM7WUFDRCxNQUFNLElBQUksbUJBQVcsQ0FBQyxtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztRQUM1RSxDQUFDO1FBRUQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQXNCLENBQUM7UUFFekMsSUFBSSxDQUFDO1lBQ0gsT0FBTztnQkFDTCxNQUFNLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7YUFDM0MsQ0FBQztRQUNKLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsTUFBTSxJQUFJLG1CQUFXLENBQ25CLG1CQUFXLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFDMUIsZ0RBQWdELENBQ2pELENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUVPLFVBQVUsQ0FDaEIsT0FBd0M7UUFFeEMsSUFDRSxDQUFDLE9BQU8sRUFBRSxTQUFTO1lBQ25CLENBQUMsT0FBTyxFQUFFLElBQUk7WUFDZCxDQUFDLE9BQU8sRUFBRSxRQUFRO1lBQ2xCLENBQUMsT0FBTyxFQUFFLFdBQVc7WUFDckIsQ0FBQyxPQUFPLEVBQUUsWUFBWSxFQUN0QixDQUFDO1lBQ0QsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUVELE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFhLENBQUM7UUFFOUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsaUJBQU8sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQzlDLE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7UUFFRCxPQUFPO1lBQ0wsWUFBWSxFQUFFLE9BQU8sQ0FBQyxTQUFTO1lBQy9CLFlBQVksRUFBRSxPQUFPLENBQUMsU0FBUyxJQUFJLFNBQVM7WUFDNUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJO1lBQ2xCLGFBQWEsRUFBRSxPQUFPLENBQUMsUUFBUTtZQUMvQixVQUFVLEVBQUUsT0FBTyxDQUFDLFdBQVc7WUFDL0IsT0FBTztTQUNSLENBQUM7SUFDSixDQUFDO0lBRU8sZ0JBQWdCLENBQUMsTUFBbUI7UUFDMUMsUUFBUSxNQUFNLEVBQUUsQ0FBQztZQUNmLEtBQUsscUJBQVcsQ0FBQyxPQUFPO2dCQUN0QixPQUFPLHNCQUFjLENBQUMsVUFBVSxDQUFDO1lBQ25DLEtBQUsscUJBQVcsQ0FBQyxVQUFVO2dCQUN6QixPQUFPLHNCQUFjLENBQUMsVUFBVSxDQUFDO1lBQ25DLEtBQUsscUJBQVcsQ0FBQyxPQUFPO2dCQUN0QixPQUFPLHNCQUFjLENBQUMsT0FBTyxDQUFDO1lBQ2hDLEtBQUsscUJBQVcsQ0FBQyxPQUFPO2dCQUN0QixPQUFPLHNCQUFjLENBQUMsTUFBTSxDQUFDO1lBQy9CLEtBQUsscUJBQVcsQ0FBQyxTQUFTO2dCQUN4QixPQUFPLHNCQUFjLENBQUMsUUFBUSxDQUFDO1lBQ2pDO2dCQUNFLE9BQU8sc0JBQWMsQ0FBQyxPQUFPLENBQUM7UUFDbEMsQ0FBQztJQUNILENBQUM7O0FBL1NILDBDQWdUQztBQS9TUSwwQkFBVSxHQUFHLDBCQUFrQixDQUFDIn0=