UNPKG

filestack-js

Version:

Official JavaScript library for Filestack

214 lines (212 loc) 30.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); /* * Copyright (c) 2019 by Filestack. * Some rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ var index_1 = require("./index"); var config_1 = require("../../config"); var v = require('../../../../package.json').version; describe('utils:index', function () { describe('resolveCdnUrl', function () { var session = { apikey: 'TEST_API_KEY', cname: 'example.com', urls: config_1.config.urls, }; it('should properly resolve cdn url with hashed handle', function () { var handle = '5aYkEQJSQCmYShsoCnZN'; var result = (0, index_1.resolveCdnUrl)(session, handle); expect(result).toEqual('https://cdn.filestackcontent.com'); }); it('should properly resolve cdn url with src handle', function () { var handle = 'src://test123/test.jpg'; var result = (0, index_1.resolveCdnUrl)(session, handle); expect(result).toEqual('https://cdn.filestackcontent.com/TEST_API_KEY'); }); it('should properly resolve cdn url with hashed handle', function () { var handle = 'https://static1.squarespace.com/static/544eb3cce4b0ef091773611f/t/59ba7ce1bd10f00dcdc80a5f/1505394087367/DSC_0527.jpg'; var result = (0, index_1.resolveCdnUrl)(session, handle); expect(result).toEqual('https://cdn.filestackcontent.com/TEST_API_KEY'); }); it('should throw an error when using src handle or url without apikey', function () { var handle = 'src://test123/test.jpg'; session.apikey = ''; expect(function () { (0, index_1.resolveCdnUrl)(session, handle); }).toThrow('Api key is required when storage alias is provided'); }); }); describe('resolveHost', function () { var hosts = config_1.config.urls; var checkHosts = function (hosts, expected) { Object.keys(hosts).forEach(function (k) { expect(hosts[k].indexOf(expected) > -1).toBeTruthy(); }); }; it('should return proper host', function () { var cname = 'example.com'; var result = (0, index_1.resolveHost)(hosts, cname); checkHosts(result, cname); }); it('should return hosts when cname is an empty string', function () { var cname = ''; var result = (0, index_1.resolveHost)(hosts, cname); checkHosts(result, cname); }); it('should be idempotent', function () { var cname = 'stage.filestackapi.com'; var firstResult = (0, index_1.resolveHost)(hosts, cname); var copiedResult = JSON.parse(JSON.stringify(firstResult)); var secondResult = (0, index_1.resolveHost)(copiedResult, cname); expect(JSON.stringify(firstResult)).toEqual(JSON.stringify(secondResult)); }); }); describe('removeEmpty', function () { it('should remove empty options from an object', function () { var testOb = { test1: true, test2: undefined, test3: false }; expect((0, index_1.removeEmpty)(testOb)).toEqual({ test1: true, test3: false }); }); }); describe('uniqueTime', function () { it('should return unique times', function () { expect((0, index_1.uniqueTime)()).not.toEqual((0, index_1.uniqueTime)()); }); }); describe('uniqueId', function () { it('should get different ids each time', function () { expect((0, index_1.uniqueId)()).not.toEqual((0, index_1.uniqueId)()); }); it('should return id with given length', function () { expect((0, index_1.uniqueId)(12).length).toEqual(12); expect((0, index_1.uniqueId)(4).length).toEqual(4); }); }); describe('md5', function () { it('should return correct md5 value', function () { expect((0, index_1.md5)(Buffer.from('test'))).toEqual('CY9rzUYh03PK3k6DJie09g=='); }); }); describe('getVersion', function () { it('should return correct version from package json', function () { expect((0, index_1.getVersion)()).toEqual("JS-".concat(v)); }); }); describe('b64', function () { it('should return correct b65 value', function () { expect((0, index_1.b64)('testtext')).toEqual('dGVzdHRleHQ='); }); it('should escape chars to make b64 url safe string - char "/"', function () { expect((0, index_1.b64)('*0eijATh#"I$PR)s<uTa}{t>E"LC:L', true)).toEqual('KjBlaWpBVGgjIkkkUFIpczx1VGF9e3Q-RSJMQzpM'); }); it('should escape chars to make b64 url safe string - char ""', function () { expect((0, index_1.b64)('W{wpB@ckYD0O@&?!||9PS)7^+F*H8N', true)).toEqual('V3t3cEJAY2tZRDBPQCY_IXx8OVBTKTdeK0YqSDhO'); }); }); describe('sanitizeName', function () { it('should sanitize file name with extension', function () { expect((0, index_1.sanitizeName)('a\\{%`"~[]#|^<>1.jpg')).toEqual('a-------------1.jpg'); }); it('should sanitize file name without extension', function () { expect((0, index_1.sanitizeName)('123qwe')).toEqual('123qwe'); }); it('should return undefined on empty string', function () { expect((0, index_1.sanitizeName)('')).toEqual('undefined'); }); it('should respect sanitize options as boolean', function () { expect((0, index_1.sanitizeName)('[]#|.jpg', false)).toEqual('[]#|.jpg'); }); it('should not change dots in filename', function () { expect((0, index_1.sanitizeName)('[]#some.tar.gz', false)).toEqual('[]#some.tar.gz'); }); it('should respect sanitize options with provided options', function () { expect((0, index_1.sanitizeName)('[]#|.jpg', { exclude: ['[', ']'], replacement: '_', })).toEqual('__#|.jpg'); }); }); describe('filterObject', function () { it('should filter object', function () { expect((0, index_1.filterObject)({ test: 1, test2: 2, test3: 3, }, ['test', 'test2'])).toEqual({ test: 1, test2: 2, }); }); it('should result the same object on empty requirements', function () { expect((0, index_1.filterObject)({ test: 1, test2: 2, test3: 3, }, [])).toEqual({ test: 1, test2: 2, test3: 3, }); }); it('should not throw on empty filtered object', function () { expect((0, index_1.filterObject)({}, ['test'])).toEqual({}); }); }); describe('extensionToMime', function () { it('should return mimetype if mime is passed', function () { expect((0, index_1.extensionToMime)('')).toEqual(undefined); }); it('should return same mime is passed', function () { expect((0, index_1.extensionToMime)('image/png')).toEqual('image/png'); expect((0, index_1.extensionToMime)('image/jpg')).toEqual('image/jpg'); expect((0, index_1.extensionToMime)('application/pdf')).toEqual('application/pdf'); }); it('it should return correct mimes for ext', function () { expect((0, index_1.extensionToMime)('.png')).toEqual('image/png'); expect((0, index_1.extensionToMime)('.jpg')).toEqual('image/jpeg'); expect((0, index_1.extensionToMime)('.pdf')).toEqual('application/pdf'); expect((0, index_1.extensionToMime)('.key')).toEqual('application/vnd.apple.keynote'); expect((0, index_1.extensionToMime)('.zip')).toEqual('application/zip'); expect((0, index_1.extensionToMime)('.numbers')).toEqual('application/vnd.apple.numbers'); }); it('it should extract extensions form filename or ext with dot', function () { expect((0, index_1.extensionToMime)('test.png')).toEqual('image/png'); expect((0, index_1.extensionToMime)('test.jpg')).toEqual('image/jpeg'); expect((0, index_1.extensionToMime)('test.pdf')).toEqual('application/pdf'); }); }); describe('CleanupCallbacks', function () { it('should set callbacks as undefined and return untouched object', function () { var testObj = { fn: function () { return 1; }, test: { fn2: function () { return 2; }, }, testN: 123, tests: 'string', testObj: { tst: 123, }, }; expect((0, index_1.cleanUpCallbacks)(testObj)).toEqual({ test: {}, testN: 123, tests: 'string', testObj: { tst: 123, }, }); }); }); }); //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvdXRpbHMvaW5kZXguc3BlYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILGlDQUE2SztBQUM3Syx1Q0FBc0M7QUFDdEMsSUFBTSxDQUFDLEdBQUcsT0FBTyxDQUFDLDBCQUEwQixDQUFDLENBQUMsT0FBTyxDQUFDO0FBRXRELFFBQVEsQ0FBQyxhQUFhLEVBQUU7SUFDdEIsUUFBUSxDQUFDLGVBQWUsRUFBRTtRQUV4QixJQUFNLE9BQU8sR0FBRztZQUNkLE1BQU0sRUFBRSxjQUFjO1lBQ3RCLEtBQUssRUFBRSxhQUFhO1lBQ3BCLElBQUksRUFBRSxlQUFNLENBQUMsSUFBSTtTQUNsQixDQUFDO1FBRUYsRUFBRSxDQUFDLG9EQUFvRCxFQUFFO1lBQ3ZELElBQU0sTUFBTSxHQUFHLHNCQUFzQixDQUFDO1lBQ3RDLElBQU0sTUFBTSxHQUFHLElBQUEscUJBQWEsRUFBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDOUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO1FBQzdELENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLGlEQUFpRCxFQUFFO1lBQ3BELElBQU0sTUFBTSxHQUFHLHdCQUF3QixDQUFDO1lBQ3hDLElBQU0sTUFBTSxHQUFHLElBQUEscUJBQWEsRUFBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDOUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQywrQ0FBK0MsQ0FBQyxDQUFDO1FBQzFFLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLG9EQUFvRCxFQUFFO1lBQ3ZELElBQU0sTUFBTSxHQUFHLHVIQUF1SCxDQUFDO1lBQ3ZJLElBQU0sTUFBTSxHQUFHLElBQUEscUJBQWEsRUFBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDOUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxD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LEVBQUU7Z0JBQ1IsS0FBSyxFQUFFLEdBQUc7Z0JBQ1YsS0FBSyxFQUFFLFFBQVE7Z0JBQ2YsT0FBTyxFQUFFO29CQUNQLEdBQUcsRUFBRSxHQUFHO2lCQUNUO2FBQ0YsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwiZmlsZSI6ImxpYi91dGlscy9pbmRleC5zcGVjLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAxOSBieSBGaWxlc3RhY2suXG4gKiBTb21lIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCB7IHJlc29sdmVDZG5VcmwsIHJlc29sdmVIb3N0LCByZW1vdmVFbXB0eSwgdW5pcXVlVGltZSwgdW5pcXVlSWQsIG1kNSwgZXh0ZW5zaW9uVG9NaW1lLCBzYW5pdGl6ZU5hbWUsIGZpbHRlck9iamVjdCwgYjY0LCBnZXRWZXJzaW9uLCBjbGVhblVwQ2FsbGJhY2tzIH0gZnJvbSAnLi9pbmRleCc7XG5pbXBvcnQgeyBjb25maWcgfSBmcm9tICcuLi8uLi9jb25maWcnO1xuY29uc3QgdiA9IHJlcXVpcmUoJy4uLy4uLy4uLy4uL3BhY2thZ2UuanNvbicpLnZlcnNpb247XG5cbmRlc2NyaWJlKCd1dGlsczppbmRleCcsICgpID0+IHtcbiAgZGVzY3JpYmUoJ3Jlc29sdmVDZG5VcmwnLCAoKSA9PiB7XG5cbiAgICBjb25zdCBzZXNzaW9uID0ge1xuICAgICAgYXBpa2V5OiAnVEVTVF9BUElfS0VZJyxcbiAgICAgIGNuYW1lOiAnZXhhbXBsZS5jb20nLFxuICAgICAgdXJsczogY29uZmlnLnVybHMsXG4gICAgfTtcblxuICAgIGl0KCdzaG91bGQgcHJvcGVybHkgcmVzb2x2ZSBjZG4gdXJsIHdpdGggaGFzaGVkIGhhbmRsZScsICgpID0+IHtcbiAgICAgIGNvbnN0IGhhbmRsZSA9ICc1YVlrRVFKU1FDbVlTaHNvQ25aTic7XG4gICAgICBjb25zdCByZXN1bHQgPSByZXNvbHZlQ2RuVXJsKHNlc3Npb24sIGhhbmRsZSk7XG4gICAgICBleHBlY3QocmVzdWx0KS50b0VxdWFsKCdodHRwczovL2Nkbi5maWxlc3RhY2tjb250ZW50LmNvbScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBwcm9wZXJseSByZXNvbHZlIGNkbiB1cmwgd2l0aCBzcmMgaGFuZGxlJywgKCkgPT4ge1xuICAgICAgY29uc3QgaGFuZGxlID0gJ3NyYzovL3Rlc3QxMjMvdGVzdC5qcGcnO1xuICAgICAgY29uc3QgcmVzdWx0ID0gcmVzb2x2ZUNkblVybChzZXNzaW9uLCBoYW5kbGUpO1xuICAgICAgZXhwZWN0KHJlc3VsdCkudG9FcXVhbCgnaHR0cHM6Ly9jZG4uZmlsZXN0YWNrY29udGVudC5jb20vVEVTVF9BUElfS0VZJyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHByb3Blcmx5IHJlc29sdmUgY2RuIHVybCB3aXRoIGhhc2hlZCBoYW5kbGUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBoYW5kbGUgPSAnaHR0cHM6Ly9zdGF0aWMxLnNxdWFyZXNwYWNlLmNvbS9zdGF0aWMvNTQ0ZWIzY2NlNGIwZWYwOTE3NzM2MTFmL3QvNTliYTdjZTFiZDEwZjAwZGNkYzgwYTVmLzE1MDUzOTQwODczNjcvRFNDXzA1MjcuanBnJztcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHJlc29sdmVDZG5Vcmwoc2Vzc2lvbiwgaGFuZGxlKTtcbiAgICAgIGV4cGVjdChyZXN1bHQpLnRvRXF1YWwoJ2h0dHBzOi8vY2RuLmZpbGVzdGFja2NvbnRlbnQuY29tL1RFU1RfQVBJX0tFWScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBhbiBlcnJvciB3aGVuIHVzaW5nIHNyYyBoYW5kbGUgb3IgdXJsIHdpdGhvdXQgYXBpa2V5JywgKCkgPT4ge1xuICAgICAgY29uc3QgaGFuZGxlID0gJ3NyYzovL3Rlc3QxMjMvdGVzdC5qcGcnO1xuICAgICAgc2Vzc2lvbi5hcGlrZXkgPSAnJztcbiAgICAgIGV4cGVjdCgoKSA9PiB7IHJlc29sdmVDZG5Vcmwoc2Vzc2lvbiwgaGFuZGxlKTsgfSkudG9UaHJvdygnQXBpIGtleSBpcyByZXF1aXJlZCB3aGVuIHN0b3JhZ2UgYWxpYXMgaXMgcHJvdmlkZWQnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3Jlc29sdmVIb3N0JywgKCkgPT4ge1xuICAgIGNvbnN0IGhvc3RzID0gY29uZmlnLnVybHM7XG5cbiAgICBjb25zdCBjaGVja0hvc3RzID0gKGhvc3RzLCBleHBlY3RlZCkgPT4ge1xuICAgICAgT2JqZWN0LmtleXMoaG9zdHMpLmZvckVhY2goKGspID0+IHtcbiAgICAgICAgZXhwZWN0KGhvc3RzW2tdLmluZGV4T2YoZXhwZWN0ZWQpID4gLTEpLnRvQmVUcnV0aHkoKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBwcm9wZXIgaG9zdCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGNuYW1lID0gJ2V4YW1wbGUuY29tJztcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHJlc29sdmVIb3N0KGhvc3RzLCBjbmFtZSk7XG4gICAgICBjaGVja0hvc3RzKHJlc3VsdCwgY25hbWUpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gaG9zdHMgd2hlbiBjbmFtZSBpcyBhbiBlbXB0eSBzdHJpbmcnLCAoKSA9PiB7XG4gICAgICBjb25zdCBjbmFtZSA9ICcnO1xuICAgICAgY29uc3QgcmVzdWx0ID0gcmVzb2x2ZUhvc3QoaG9zdHMsIGNuYW1lKTtcbiAgICAgIGNoZWNrSG9zdHMocmVzdWx0LCBjbmFtZSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJlIGlkZW1wb3RlbnQnLCAoKSA9PiB7XG4gICAgICBjb25zdCBjbmFtZSA9ICdzdGFnZS5maWxlc3RhY2thcGkuY29tJztcbiAgICAgIGNvbnN0IGZpcnN0UmVzdWx0ID0gcmVzb2x2ZUhvc3QoaG9zdHMsIGNuYW1lKTtcbiAgICAgIGNvbnN0IGNvcGllZFJlc3VsdCA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZmlyc3RSZXN1bHQpKTtcbiAgICAgIGNvbnN0IHNlY29uZFJlc3VsdCA9IHJlc29sdmVIb3N0KGNvcGllZFJlc3VsdCwgY25hbWUpO1xuXG4gICAgICBleHBlY3QoSlNPTi5zdHJpbmdpZnkoZmlyc3RSZXN1bHQpKS50b0VxdWFsKEpTT04uc3RyaW5naWZ5KHNlY29uZFJlc3VsdCkpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgncmVtb3ZlRW1wdHknLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCByZW1vdmUgZW1wdHkgb3B0aW9ucyBmcm9tIGFuIG9iamVjdCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHRlc3RPYiA9IHsgdGVzdDE6IHRydWUsIHRlc3QyOiB1bmRlZmluZWQsIHRlc3QzOiBmYWxzZSB9O1xuICAgICAgZXhwZWN0KHJlbW92ZUVtcHR5KHRlc3RPYikpLnRvRXF1YWwoeyB0ZXN0MTogdHJ1ZSwgdGVzdDM6IGZhbHNlIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgndW5pcXVlVGltZScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHJldHVybiB1bmlxdWUgdGltZXMnLCAoKSA9PiB7XG4gICAgICBleHBlY3QodW5pcXVlVGltZSgpKS5ub3QudG9FcXVhbCh1bmlxdWVUaW1lKCkpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgndW5pcXVlSWQnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBnZXQgZGlmZmVyZW50IGlkcyBlYWNoIHRpbWUnLCAoKSA9PiB7XG4gICAgICBleHBlY3QodW5pcXVlSWQoKSkubm90LnRvRXF1YWwodW5pcXVlSWQoKSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJldHVybiBpZCB3aXRoIGdpdmVuIGxlbmd0aCcsICgpID0+IHtcbiAgICAgIGV4cGVjdCh1bmlxdWVJZCgxMikubGVuZ3RoKS50b0VxdWFsKDEyKTtcbiAgICAgIGV4cGVjdCh1bmlxdWVJZCg0KS5sZW5ndGgpLnRvRXF1YWwoNCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdtZDUnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gY29ycmVjdCBtZDUgdmFsdWUnLCAoKSA9PiB7XG4gICAgICBleHBlY3QobWQ1KEJ1ZmZlci5mcm9tKCd0ZXN0JykpKS50b0VxdWFsKCdDWTlyelVZaDAzUEszazZESmllMDlnPT0nKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2dldFZlcnNpb24nLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gY29ycmVjdCB2ZXJzaW9uIGZyb20gcGFja2FnZSBqc29uJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGdldFZlcnNpb24oKSkudG9FcXVhbChgSlMtJHt2fWApO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnYjY0JywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIGNvcnJlY3QgYjY1IHZhbHVlJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGI2NCgndGVzdHRleHQnKSkudG9FcXVhbCgnZEdWemRIUmxlSFE9Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGVzY2FwZSBjaGFycyB0byBtYWtlIGI2NCB1cmwgc2FmZSBzdHJpbmcgLSBjaGFyIFwiL1wiJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGI2NCgnKjBlaWpBVGgjXCJJJFBSKXM8dVRhfXt0PkVcIkxDOkwnLCB0cnVlKSkudG9FcXVhbCgnS2pCbGFXcEJWR2dqSWtra1VGSXBjengxVkdGOWUzUS1SU0pNUXpwTScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBlc2NhcGUgY2hhcnMgdG8gbWFrZSBiNjQgdXJsIHNhZmUgc3RyaW5nIC0gY2hhciBcIlwiJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KGI2NCgnV3t3cEJAY2tZRDBPQCY/IXx8OVBTKTdeK0YqSDhOJywgdHJ1ZSkpLnRvRXF1YWwoJ1YzdDNjRUpBWTJ0WlJEQlBRQ1lfSVh4OE9WQlRLVGRlSzBZcVNEaE8nKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ3Nhbml0aXplTmFtZScsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHNhbml0aXplIGZpbGUgbmFtZSB3aXRoIGV4dGVuc2lvbicsICgpID0+IHtcbiAgICAgIGV4cGVjdChzYW5pdGl6ZU5hbWUoJ2FcXFxceyVgXCJ+W10jfF48PjEuanBnJykpLnRvRXF1YWwoJ2EtLS0tLS0tLS0tLS0tMS5qcGcnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc2FuaXRpemUgZmlsZSBuYW1lIHdpdGhvdXQgZXh0ZW5zaW9uJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHNhbml0aXplTmFtZSgnMTIzcXdlJykpLnRvRXF1YWwoJzEyM3F3ZScpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gdW5kZWZpbmVkIG9uIGVtcHR5IHN0cmluZycsICgpID0+IHtcbiAgICAgIGV4cGVjdChzYW5pdGl6ZU5hbWUoJycpKS50b0VxdWFsKCd1bmRlZmluZWQnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcmVzcGVjdCBzYW5pdGl6ZSBvcHRpb25zIGFzIGJvb2xlYW4nLCAoKSA9PiB7XG4gICAgICBleHBlY3Qoc2FuaXRpemVOYW1lKCdbXSN8LmpwZycsIGZhbHNlKSkudG9FcXVhbCgnW10jfC5qcGcnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbm90IGNoYW5nZSBkb3RzIGluIGZpbGVuYW1lJywgKCkgPT4ge1xuICAgICAgZXhwZWN0KHNhbml0aXplTmFtZSgnW10jc29tZS50YXIuZ3onLCBmYWxzZSkpLnRvRXF1YWwoJ1tdI3NvbWUudGFyLmd6Jyk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHJlc3BlY3Qgc2FuaXRpemUgb3B0aW9ucyB3aXRoIHByb3ZpZGVkIG9wdGlvbnMnLCAoKSA9PiB7XG4gICAgICBleHBlY3Qoc2FuaXRpemVOYW1lKCdbXSN8LmpwZycsIHtcbiAgICAgICAgZXhjbHVkZTogWydbJywgJ10nXSxcbiAgICAgICAgcmVwbGFjZW1lbnQ6ICdfJyxcbiAgICAgIH0pKS50b0VxdWFsKCdfXyN8LmpwZycpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnZmlsdGVyT2JqZWN0JywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgZmlsdGVyIG9iamVjdCcsICgpID0+IHtcbiAgICAgIGV4cGVjdChmaWx0ZXJPYmplY3Qoe1xuICAgICAgICB0ZXN0OiAxLFxuICAgICAgICB0ZXN0MjogMixcbiAgICAgICAgdGVzdDM6IDMsXG4gICAgICB9LCBbJ3Rlc3QnLCAndGVzdDInXSkpLnRvRXF1YWwoe1xuICAgICAgICB0ZXN0OiAxLFxuICAgICAgICB0ZXN0MjogMixcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXN1bHQgdGhlIHNhbWUgb2JqZWN0IG9uIGVtcHR5IHJlcXVpcmVtZW50cycsICgpID0+IHtcbiAgICAgIGV4cGVjdChmaWx0ZXJPYmplY3Qoe1xuICAgICAgICB0ZXN0OiAxLFxuICAgICAgICB0ZXN0MjogMixcbiAgICAgICAgdGVzdDM6IDMsXG4gICAgICB9LCBbXSkpLnRvRXF1YWwoe1xuICAgICAgICB0ZXN0OiAxLFxuICAgICAgICB0ZXN0MjogMixcbiAgICAgICAgdGVzdDM6IDMsXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgbm90IHRocm93IG9uIGVtcHR5IGZpbHRlcmVkIG9iamVjdCcsICgpID0+IHtcbiAgICAgIGV4cGVjdChmaWx0ZXJPYmplY3Qoe30sIFsndGVzdCddKSkudG9FcXVhbCh7fSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdleHRlbnNpb25Ub01pbWUnLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gbWltZXR5cGUgaWYgbWltZSBpcyBwYXNzZWQnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoZXh0ZW5zaW9uVG9NaW1lKCcnKSkudG9FcXVhbCh1bmRlZmluZWQpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZXR1cm4gc2FtZSBtaW1lIGlzIHBhc3NlZCcsICgpID0+IHtcbiAgICAgIGV4cGVjdChleHRlbnNpb25Ub01pbWUoJ2ltYWdlL3BuZycpKS50b0VxdWFsKCdpbWFnZS9wbmcnKTtcbiAgICAgIGV4cGVjdChleHRlbnNpb25Ub01pbWUoJ2ltYWdlL2pwZycpKS50b0VxdWFsKCdpbWFnZS9qcGcnKTtcbiAgICAgIGV4cGVjdChleHRlbnNpb25Ub01pbWUoJ2FwcGxpY2F0aW9uL3BkZicpKS50b0VxdWFsKCdhcHBsaWNhdGlvbi9wZGYnKTtcbiAgICB9KTtcblxuICAgIGl0KCdpdCBzaG91bGQgcmV0dXJuIGNvcnJlY3QgbWltZXMgZm9yIGV4dCcsICgpID0+IHtcbiAgICAgIGV4cGVjdChleHRlbnNpb25Ub01pbWUoJy5wbmcnKSkudG9FcXVhbCgnaW1hZ2UvcG5nJyk7XG4gICAgICBleHBlY3QoZXh0ZW5zaW9uVG9NaW1lKCcuanBnJykpLnRvRXF1YWwoJ2ltYWdlL2pwZWcnKTtcbiAgICAgIGV4cGVjdChleHRlbnNpb25Ub01pbWUoJy5wZGYnKSkudG9FcXVhbCgnYXBwbGljYXRpb24vcGRmJyk7XG5cbiAgICAgIGV4cGVjdChleHRlbnNpb25Ub01pbWUoJy5rZXknKSkudG9FcXVhbCgnYXBwbGljYXRpb24vdm5kLmFwcGxlLmtleW5vdGUnKTtcbiAgICAgIGV4cGVjdChleHRlbnNpb25Ub01pbWUoJy56aXAnKSkudG9FcXVhbCgnYXBwbGljYXRpb24vemlwJyk7XG4gICAgICBleHBlY3QoZXh0ZW5zaW9uVG9NaW1lKCcubnVtYmVycycpKS50b0VxdWFsKCdhcHBsaWNhdGlvbi92bmQuYXBwbGUubnVtYmVycycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ2l0IHNob3VsZCBleHRyYWN0IGV4dGVuc2lvbnMgZm9ybSBmaWxlbmFtZSBvciBleHQgd2l0aCBkb3QnLCAoKSA9PiB7XG4gICAgICBleHBlY3QoZXh0ZW5zaW9uVG9NaW1lKCd0ZXN0LnBuZycpKS50b0VxdWFsKCdpbWFnZS9wbmcnKTtcbiAgICAgIGV4cGVjdChleHRlbnNpb25Ub01pbWUoJ3Rlc3QuanBnJykpLnRvRXF1YWwoJ2ltYWdlL2pwZWcnKTtcbiAgICAgIGV4cGVjdChleHRlbnNpb25Ub01pbWUoJ3Rlc3QucGRmJykpLnRvRXF1YWwoJ2FwcGxpY2F0aW9uL3BkZicpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnQ2xlYW51cENhbGxiYWNrcycsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHNldCBjYWxsYmFja3MgYXMgdW5kZWZpbmVkIGFuZCByZXR1cm4gdW50b3VjaGVkIG9iamVjdCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHRlc3RPYmogPSB7XG4gICAgICAgIGZuOiAoKSA9PiAxLFxuICAgICAgICB0ZXN0OiB7XG4gICAgICAgICAgZm4yOiAoKSA9PiAyLFxuICAgICAgICB9LFxuICAgICAgICB0ZXN0TjogMTIzLFxuICAgICAgICB0ZXN0czogJ3N0cmluZycsXG4gICAgICAgIHRlc3RPYmo6IHtcbiAgICAgICAgICB0c3Q6IDEyMyxcbiAgICAgICAgfSxcbiAgICAgIH07XG5cbiAgICAgIGV4cGVjdChjbGVhblVwQ2FsbGJhY2tzKHRlc3RPYmopKS50b0VxdWFsKHtcbiAgICAgICAgdGVzdDoge30sXG4gICAgICAgIHRlc3ROOiAxMjMsXG4gICAgICAgIHRlc3RzOiAnc3RyaW5nJyxcbiAgICAgICAgdGVzdE9iajoge1xuICAgICAgICAgIHRzdDogMTIzLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=