UNPKG

@rudderstack/integrations-lib

Version:
112 lines 13.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const factory_1 = require("../../network/factory"); const config_1 = require("./config"); /** * CriteoAudience SDK for managing audience segments in Criteo * @class */ class CriteoAudience { /** * Creates an instance of CriteoAudience * @param {AuthObject} authObject - Authentication object containing access token and refresh function * @throws {Error} If authObject is invalid or missing required properties */ constructor(authObject) { CriteoAudience.validateAuthObject(authObject); this.authObject = authObject; this.httpClient = factory_1.HttpClientFactory.getHttpClient(factory_1.ClientNames.Axios, { baseURL: config_1.BASE_URL, }); } /** * Validates the authentication object * @param {AuthObject} authObject - Authentication object to validate * @throws {Error} If authObject is invalid or missing required properties * @private */ static validateAuthObject(authObject) { if (!authObject) { throw new Error('authObject is required.'); } const { accessToken, refreshAccessTokenFunc } = authObject; if (!accessToken) { throw new Error('Criteo Audience accessToken is required.'); } if (!refreshAccessTokenFunc) { throw new Error('Criteo Audience a refresh access token function is required.'); } } /** * Refreshes the access token using the provided refresh function * @throws {Error} If token refresh fails * @private */ async refreshToken() { try { const accessToken = await this.authObject.refreshAccessTokenFunc(); this.authObject.accessToken = accessToken; } catch (error) { throw new Error(`Unable to refresh token, with error: ${error}`); } } /** * Gets the request headers with authentication * @returns {RequestConfig} Request configuration with headers * @private */ getHeader() { return { headers: { authorization: `Bearer ${this.authObject.accessToken}`, accept: 'application/json', 'content-type': 'application/json', }, }; } /** * Executes a POST request with token refresh handling * @template T - Response type * @param {string} url - API endpoint URL * @param {object} data - Request payload * @returns {Promise<ApiResponse<T>>} API response * @private */ async executePostRequest(url, data) { const response = await this.httpClient.post(url, data, this.getHeader()); switch (response.type) { case 'application-error': if (response.statusCode === 401 && (response.responseBody.errors[0].code === 'authorization-token-invalid' || response.responseBody.errors[0].code === 'authorization-token-expired')) { await this.refreshToken(); return this.httpClient.post(url, data, this.getHeader()); } return response; default: return response; } } /** * Creates a new audience segment in Criteo * @param {AudienceSegmentBody} audienceSegmentBody - Audience segment data * @returns {Promise<AudienceSegmentData>} Created audience segment data * @throws {Error} If audience segment creation fails */ async createAudienceSegment(audienceSegmentBody) { const createAudienceSegmentResponse = await this.executePostRequest(`/marketing-solutions/audience-segments/create`, audienceSegmentBody); if (createAudienceSegmentResponse.type === 'success') { const { data } = createAudienceSegmentResponse.responseBody; if (data && data.length > 0) { return data[0]; } } const errorMessage = createAudienceSegmentResponse.type === 'client-error' ? createAudienceSegmentResponse.message : JSON.stringify(createAudienceSegmentResponse.responseBody); throw new Error(`Failed to create audience segment, with error: ${errorMessage}`); } } exports.default = CriteoAudience; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JpdGVvQXVkaWVuY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2Rrcy9jcml0ZW9BdWRpZW5jZS9jcml0ZW9BdWRpZW5jZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLG1EQUF1RTtBQUV2RSxxQ0FBb0M7QUFRcEM7OztHQUdHO0FBQ0gsTUFBcUIsY0FBYztJQUtqQzs7OztPQUlHO0lBQ0gsWUFBWSxVQUFzQjtRQUNoQyxjQUFjLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFDN0IsSUFBSSxDQUFDLFVBQVUsR0FBRywyQkFBaUIsQ0FBQyxhQUFhLENBQUMscUJBQVcsQ0FBQyxLQUFLLEVBQUU7WUFDbkUsT0FBTyxFQUFFLGlCQUFRO1NBQ2xCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNLLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxVQUFzQjtRQUN0RCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDaEIsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1FBQzdDLENBQUM7UUFDRCxNQUFNLEVBQUUsV0FBVyxFQUFFLHNCQUFzQixFQUFFLEdBQUcsVUFBVSxDQUFDO1FBQzNELElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLDBDQUEwQyxDQUFDLENBQUM7UUFDOUQsQ0FBQztRQUNELElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1lBQzVCLE1BQU0sSUFBSSxLQUFLLENBQUMsOERBQThELENBQUMsQ0FBQztRQUNsRixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxLQUFLLENBQUMsWUFBWTtRQUN4QixJQUFJLENBQUM7WUFDSCxNQUFNLFdBQVcsR0FBRyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztZQUNuRSxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7UUFDNUMsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixNQUFNLElBQUksS0FBSyxDQUFDLHdDQUF3QyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ25FLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLFNBQVM7UUFDZixPQUFPO1lBQ0wsT0FBTyxFQUFFO2dCQUNQLGFBQWEsRUFBRSxVQUFVLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFO2dCQUN0RCxNQUFNLEVBQUUsa0JBQWtCO2dCQUMxQixjQUFjLEVBQUUsa0JBQWtCO2FBQ25DO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ssS0FBSyxDQUFDLGtCQUFrQixDQUFJLEdBQVcsRUFBRSxJQUFZO1FBQzNELE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUksR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUM1RSxRQUFRLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN0QixLQUFLLG1CQUFtQjtnQkFDdEIsSUFDRSxRQUFRLENBQUMsVUFBVSxLQUFLLEdBQUc7b0JBQzNCLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLDZCQUE2Qjt3QkFDckUsUUFBUSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLDZCQUE2QixDQUFDLEVBQ3pFLENBQUM7b0JBQ0QsTUFBTSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7b0JBQzFCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUksR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztnQkFDOUQsQ0FBQztnQkFDRCxPQUFPLFFBQVEsQ0FBQztZQUNsQjtnQkFDRSxPQUFPLFFBQVEsQ0FBQztRQUNwQixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksS0FBSyxDQUFDLHFCQUFxQixDQUNoQyxtQkFBd0M7UUFFeEMsTUFBTSw2QkFBNkIsR0FBRyxNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FDakUsK0NBQStDLEVBQy9DLG1CQUFtQixDQUNwQixDQUFDO1FBQ0YsSUFBSSw2QkFBNkIsQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDckQsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLDZCQUE2QixDQUFDLFlBQVksQ0FBQztZQUM1RCxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUM1QixPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNqQixDQUFDO1FBQ0gsQ0FBQztRQUVELE1BQU0sWUFBWSxHQUNoQiw2QkFBNkIsQ0FBQyxJQUFJLEtBQUssY0FBYztZQUNuRCxDQUFDLENBQUMsNkJBQTZCLENBQUMsT0FBTztZQUN2QyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyw2QkFBNkIsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUVqRSxNQUFNLElBQUksS0FBSyxDQUFDLGtEQUFrRCxZQUFZLEVBQUUsQ0FBQyxDQUFDO0lBQ3BGLENBQUM7Q0FDRjtBQXZIRCxpQ0F1SEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50RmFjdG9yeSwgQ2xpZW50TmFtZXMgfSBmcm9tICcuLi8uLi9uZXR3b3JrL2ZhY3RvcnknO1xuaW1wb3J0IHsgSHR0cENsaWVudCwgUmVxdWVzdENvbmZpZywgQXBpUmVzcG9uc2UgfSBmcm9tICcuLi8uLi9uZXR3b3JrL2NsaWVudHMvdHlwZXMnO1xuaW1wb3J0IHsgQkFTRV9VUkwgfSBmcm9tICcuL2NvbmZpZyc7XG5pbXBvcnQge1xuICBBdXRoT2JqZWN0LFxuICBBdWRpZW5jZVNlZ21lbnRCb2R5LFxuICBBdWRpZW5jZVNlZ21lbnRSZXNwb25zZSxcbiAgQXVkaWVuY2VTZWdtZW50RGF0YSxcbn0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogQ3JpdGVvQXVkaWVuY2UgU0RLIGZvciBtYW5hZ2luZyBhdWRpZW5jZSBzZWdtZW50cyBpbiBDcml0ZW9cbiAqIEBjbGFzc1xuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDcml0ZW9BdWRpZW5jZSB7XG4gIHByaXZhdGUgYXV0aE9iamVjdDogQXV0aE9iamVjdDtcblxuICBwcml2YXRlIGh0dHBDbGllbnQ6IEh0dHBDbGllbnQ7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgQ3JpdGVvQXVkaWVuY2VcbiAgICogQHBhcmFtIHtBdXRoT2JqZWN0fSBhdXRoT2JqZWN0IC0gQXV0aGVudGljYXRpb24gb2JqZWN0IGNvbnRhaW5pbmcgYWNjZXNzIHRva2VuIGFuZCByZWZyZXNoIGZ1bmN0aW9uXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiBhdXRoT2JqZWN0IGlzIGludmFsaWQgb3IgbWlzc2luZyByZXF1aXJlZCBwcm9wZXJ0aWVzXG4gICAqL1xuICBjb25zdHJ1Y3RvcihhdXRoT2JqZWN0OiBBdXRoT2JqZWN0KSB7XG4gICAgQ3JpdGVvQXVkaWVuY2UudmFsaWRhdGVBdXRoT2JqZWN0KGF1dGhPYmplY3QpO1xuICAgIHRoaXMuYXV0aE9iamVjdCA9IGF1dGhPYmplY3Q7XG4gICAgdGhpcy5odHRwQ2xpZW50ID0gSHR0cENsaWVudEZhY3RvcnkuZ2V0SHR0cENsaWVudChDbGllbnROYW1lcy5BeGlvcywge1xuICAgICAgYmFzZVVSTDogQkFTRV9VUkwsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSBhdXRoZW50aWNhdGlvbiBvYmplY3RcbiAgICogQHBhcmFtIHtBdXRoT2JqZWN0fSBhdXRoT2JqZWN0IC0gQXV0aGVudGljYXRpb24gb2JqZWN0IHRvIHZhbGlkYXRlXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiBhdXRoT2JqZWN0IGlzIGludmFsaWQgb3IgbWlzc2luZyByZXF1aXJlZCBwcm9wZXJ0aWVzXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyB2YWxpZGF0ZUF1dGhPYmplY3QoYXV0aE9iamVjdDogQXV0aE9iamVjdCkge1xuICAgIGlmICghYXV0aE9iamVjdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdhdXRoT2JqZWN0IGlzIHJlcXVpcmVkLicpO1xuICAgIH1cbiAgICBjb25zdCB7IGFjY2Vzc1Rva2VuLCByZWZyZXNoQWNjZXNzVG9rZW5GdW5jIH0gPSBhdXRoT2JqZWN0O1xuICAgIGlmICghYWNjZXNzVG9rZW4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ3JpdGVvIEF1ZGllbmNlIGFjY2Vzc1Rva2VuIGlzIHJlcXVpcmVkLicpO1xuICAgIH1cbiAgICBpZiAoIXJlZnJlc2hBY2Nlc3NUb2tlbkZ1bmMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ3JpdGVvIEF1ZGllbmNlIGEgcmVmcmVzaCBhY2Nlc3MgdG9rZW4gZnVuY3Rpb24gaXMgcmVxdWlyZWQuJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlZnJlc2hlcyB0aGUgYWNjZXNzIHRva2VuIHVzaW5nIHRoZSBwcm92aWRlZCByZWZyZXNoIGZ1bmN0aW9uXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0b2tlbiByZWZyZXNoIGZhaWxzXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlZnJlc2hUb2tlbigpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgYWNjZXNzVG9rZW4gPSBhd2FpdCB0aGlzLmF1dGhPYmplY3QucmVmcmVzaEFjY2Vzc1Rva2VuRnVuYygpO1xuICAgICAgdGhpcy5hdXRoT2JqZWN0LmFjY2Vzc1Rva2VuID0gYWNjZXNzVG9rZW47XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIHJlZnJlc2ggdG9rZW4sIHdpdGggZXJyb3I6ICR7ZXJyb3J9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHJlcXVlc3QgaGVhZGVycyB3aXRoIGF1dGhlbnRpY2F0aW9uXG4gICAqIEByZXR1cm5zIHtSZXF1ZXN0Q29uZmlnfSBSZXF1ZXN0IGNvbmZpZ3VyYXRpb24gd2l0aCBoZWFkZXJzXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGdldEhlYWRlcigpOiBSZXF1ZXN0Q29uZmlnIHtcbiAgICByZXR1cm4ge1xuICAgICAgaGVhZGVyczoge1xuICAgICAgICBhdXRob3JpemF0aW9uOiBgQmVhcmVyICR7dGhpcy5hdXRoT2JqZWN0LmFjY2Vzc1Rva2VufWAsXG4gICAgICAgIGFjY2VwdDogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGVzIGEgUE9TVCByZXF1ZXN0IHdpdGggdG9rZW4gcmVmcmVzaCBoYW5kbGluZ1xuICAgKiBAdGVtcGxhdGUgVCAtIFJlc3BvbnNlIHR5cGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IHVybCAtIEFQSSBlbmRwb2ludCBVUkxcbiAgICogQHBhcmFtIHtvYmplY3R9IGRhdGEgLSBSZXF1ZXN0IHBheWxvYWRcbiAgICogQHJldHVybnMge1Byb21pc2U8QXBpUmVzcG9uc2U8VD4+fSBBUEkgcmVzcG9uc2VcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZXhlY3V0ZVBvc3RSZXF1ZXN0PFQ+KHVybDogc3RyaW5nLCBkYXRhOiBvYmplY3QpOiBQcm9taXNlPEFwaVJlc3BvbnNlPFQ+PiB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmh0dHBDbGllbnQucG9zdDxUPih1cmwsIGRhdGEsIHRoaXMuZ2V0SGVhZGVyKCkpO1xuICAgIHN3aXRjaCAocmVzcG9uc2UudHlwZSkge1xuICAgICAgY2FzZSAnYXBwbGljYXRpb24tZXJyb3InOlxuICAgICAgICBpZiAoXG4gICAgICAgICAgcmVzcG9uc2Uuc3RhdHVzQ29kZSA9PT0gNDAxICYmXG4gICAgICAgICAgKHJlc3BvbnNlLnJlc3BvbnNlQm9keS5lcnJvcnNbMF0uY29kZSA9PT0gJ2F1dGhvcml6YXRpb24tdG9rZW4taW52YWxpZCcgfHxcbiAgICAgICAgICAgIHJlc3BvbnNlLnJlc3BvbnNlQm9keS5lcnJvcnNbMF0uY29kZSA9PT0gJ2F1dGhvcml6YXRpb24tdG9rZW4tZXhwaXJlZCcpXG4gICAgICAgICkge1xuICAgICAgICAgIGF3YWl0IHRoaXMucmVmcmVzaFRva2VuKCk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5wb3N0PFQ+KHVybCwgZGF0YSwgdGhpcy5nZXRIZWFkZXIoKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGF1ZGllbmNlIHNlZ21lbnQgaW4gQ3JpdGVvXG4gICAqIEBwYXJhbSB7QXVkaWVuY2VTZWdtZW50Qm9keX0gYXVkaWVuY2VTZWdtZW50Qm9keSAtIEF1ZGllbmNlIHNlZ21lbnQgZGF0YVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxBdWRpZW5jZVNlZ21lbnREYXRhPn0gQ3JlYXRlZCBhdWRpZW5jZSBzZWdtZW50IGRhdGFcbiAgICogQHRocm93cyB7RXJyb3J9IElmIGF1ZGllbmNlIHNlZ21lbnQgY3JlYXRpb24gZmFpbHNcbiAgICovXG4gIHB1YmxpYyBhc3luYyBjcmVhdGVBdWRpZW5jZVNlZ21lbnQoXG4gICAgYXVkaWVuY2VTZWdtZW50Qm9keTogQXVkaWVuY2VTZWdtZW50Qm9keSxcbiAgKTogUHJvbWlzZTxBdWRpZW5jZVNlZ21lbnREYXRhPiB7XG4gICAgY29uc3QgY3JlYXRlQXVkaWVuY2VTZWdtZW50UmVzcG9uc2UgPSBhd2FpdCB0aGlzLmV4ZWN1dGVQb3N0UmVxdWVzdDxBdWRpZW5jZVNlZ21lbnRSZXNwb25zZT4oXG4gICAgICBgL21hcmtldGluZy1zb2x1dGlvbnMvYXVkaWVuY2Utc2VnbWVudHMvY3JlYXRlYCxcbiAgICAgIGF1ZGllbmNlU2VnbWVudEJvZHksXG4gICAgKTtcbiAgICBpZiAoY3JlYXRlQXVkaWVuY2VTZWdtZW50UmVzcG9uc2UudHlwZSA9PT0gJ3N1Y2Nlc3MnKSB7XG4gICAgICBjb25zdCB7IGRhdGEgfSA9IGNyZWF0ZUF1ZGllbmNlU2VnbWVudFJlc3BvbnNlLnJlc3BvbnNlQm9keTtcbiAgICAgIGlmIChkYXRhICYmIGRhdGEubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gZGF0YVswXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBlcnJvck1lc3NhZ2UgPVxuICAgICAgY3JlYXRlQXVkaWVuY2VTZWdtZW50UmVzcG9uc2UudHlwZSA9PT0gJ2NsaWVudC1lcnJvcidcbiAgICAgICAgPyBjcmVhdGVBdWRpZW5jZVNlZ21lbnRSZXNwb25zZS5tZXNzYWdlXG4gICAgICAgIDogSlNPTi5zdHJpbmdpZnkoY3JlYXRlQXVkaWVuY2VTZWdtZW50UmVzcG9uc2UucmVzcG9uc2VCb2R5KTtcblxuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGNyZWF0ZSBhdWRpZW5jZSBzZWdtZW50LCB3aXRoIGVycm9yOiAke2Vycm9yTWVzc2FnZX1gKTtcbiAgfVxufVxuIl19