master-degree-notes/.obsidian/plugins/local-gpt/main.js

30665 lines
2.3 MiB
JavaScript
Raw Normal View History

2024-10-29 11:16:30 +01:00
/*
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
if you want to view the source, please visit the github repository of this plugin
*/
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __commonJS = (cb, mod) => function __require() {
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
};
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
// If the importer is in node compatibility mode or this is not an ESM
// file that has been converted to a CommonJS file using a Babel-
// compatible transform (i.e. "__esModule" has not been set), then set
// "default" to the CommonJS "module.exports" for node compatibility.
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
mod
));
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
var __publicField = (obj, key, value) => {
__defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
return value;
};
var __accessCheck = (obj, member, msg) => {
if (!member.has(obj))
throw TypeError("Cannot " + msg);
};
var __privateGet = (obj, member, getter) => {
__accessCheck(obj, member, "read from private field");
return getter ? getter.call(obj) : member.get(obj);
};
var __privateAdd = (obj, member, value) => {
if (member.has(obj))
throw TypeError("Cannot add the same private member more than once");
member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
};
var __privateSet = (obj, member, value, setter) => {
__accessCheck(obj, member, "write to private field");
setter ? setter.call(obj, value) : member.set(obj, value);
return value;
};
var __privateWrapper = (obj, member, setter, getter) => ({
set _(value) {
__privateSet(obj, member, value, setter);
},
get _() {
return __privateGet(obj, member, getter);
}
});
var __privateMethod = (obj, member, method) => {
__accessCheck(obj, member, "access private method");
return method;
};
// node_modules/retry/lib/retry_operation.js
var require_retry_operation = __commonJS({
"node_modules/retry/lib/retry_operation.js"(exports, module2) {
function RetryOperation(timeouts, options) {
if (typeof options === "boolean") {
options = { forever: options };
}
this._originalTimeouts = JSON.parse(JSON.stringify(timeouts));
this._timeouts = timeouts;
this._options = options || {};
this._maxRetryTime = options && options.maxRetryTime || Infinity;
this._fn = null;
this._errors = [];
this._attempts = 1;
this._operationTimeout = null;
this._operationTimeoutCb = null;
this._timeout = null;
this._operationStart = null;
this._timer = null;
if (this._options.forever) {
this._cachedTimeouts = this._timeouts.slice(0);
}
}
module2.exports = RetryOperation;
RetryOperation.prototype.reset = function() {
this._attempts = 1;
this._timeouts = this._originalTimeouts.slice(0);
};
RetryOperation.prototype.stop = function() {
if (this._timeout) {
clearTimeout(this._timeout);
}
if (this._timer) {
clearTimeout(this._timer);
}
this._timeouts = [];
this._cachedTimeouts = null;
};
RetryOperation.prototype.retry = function(err) {
if (this._timeout) {
clearTimeout(this._timeout);
}
if (!err) {
return false;
}
var currentTime = new Date().getTime();
if (err && currentTime - this._operationStart >= this._maxRetryTime) {
this._errors.push(err);
this._errors.unshift(new Error("RetryOperation timeout occurred"));
return false;
}
this._errors.push(err);
var timeout = this._timeouts.shift();
if (timeout === void 0) {
if (this._cachedTimeouts) {
this._errors.splice(0, this._errors.length - 1);
timeout = this._cachedTimeouts.slice(-1);
} else {
return false;
}
}
var self = this;
this._timer = setTimeout(function() {
self._attempts++;
if (self._operationTimeoutCb) {
self._timeout = setTimeout(function() {
self._operationTimeoutCb(self._attempts);
}, self._operationTimeout);
if (self._options.unref) {
self._timeout.unref();
}
}
self._fn(self._attempts);
}, timeout);
if (this._options.unref) {
this._timer.unref();
}
return true;
};
RetryOperation.prototype.attempt = function(fn, timeoutOps) {
this._fn = fn;
if (timeoutOps) {
if (timeoutOps.timeout) {
this._operationTimeout = timeoutOps.timeout;
}
if (timeoutOps.cb) {
this._operationTimeoutCb = timeoutOps.cb;
}
}
var self = this;
if (this._operationTimeoutCb) {
this._timeout = setTimeout(function() {
self._operationTimeoutCb();
}, self._operationTimeout);
}
this._operationStart = new Date().getTime();
this._fn(this._attempts);
};
RetryOperation.prototype.try = function(fn) {
console.log("Using RetryOperation.try() is deprecated");
this.attempt(fn);
};
RetryOperation.prototype.start = function(fn) {
console.log("Using RetryOperation.start() is deprecated");
this.attempt(fn);
};
RetryOperation.prototype.start = RetryOperation.prototype.try;
RetryOperation.prototype.errors = function() {
return this._errors;
};
RetryOperation.prototype.attempts = function() {
return this._attempts;
};
RetryOperation.prototype.mainError = function() {
if (this._errors.length === 0) {
return null;
}
var counts = {};
var mainError = null;
var mainErrorCount = 0;
for (var i = 0; i < this._errors.length; i++) {
var error = this._errors[i];
var message = error.message;
var count = (counts[message] || 0) + 1;
counts[message] = count;
if (count >= mainErrorCount) {
mainError = error;
mainErrorCount = count;
}
}
return mainError;
};
}
});
// node_modules/retry/lib/retry.js
var require_retry = __commonJS({
"node_modules/retry/lib/retry.js"(exports) {
var RetryOperation = require_retry_operation();
exports.operation = function(options) {
var timeouts = exports.timeouts(options);
return new RetryOperation(timeouts, {
forever: options && (options.forever || options.retries === Infinity),
unref: options && options.unref,
maxRetryTime: options && options.maxRetryTime
});
};
exports.timeouts = function(options) {
if (options instanceof Array) {
return [].concat(options);
}
var opts = {
retries: 10,
factor: 2,
minTimeout: 1 * 1e3,
maxTimeout: Infinity,
randomize: false
};
for (var key in options) {
opts[key] = options[key];
}
if (opts.minTimeout > opts.maxTimeout) {
throw new Error("minTimeout is greater than maxTimeout");
}
var timeouts = [];
for (var i = 0; i < opts.retries; i++) {
timeouts.push(this.createTimeout(i, opts));
}
if (options && options.forever && !timeouts.length) {
timeouts.push(this.createTimeout(i, opts));
}
timeouts.sort(function(a, b) {
return a - b;
});
return timeouts;
};
exports.createTimeout = function(attempt, opts) {
var random = opts.randomize ? Math.random() + 1 : 1;
var timeout = Math.round(random * Math.max(opts.minTimeout, 1) * Math.pow(opts.factor, attempt));
timeout = Math.min(timeout, opts.maxTimeout);
return timeout;
};
exports.wrap = function(obj, options, methods) {
if (options instanceof Array) {
methods = options;
options = null;
}
if (!methods) {
methods = [];
for (var key in obj) {
if (typeof obj[key] === "function") {
methods.push(key);
}
}
}
for (var i = 0; i < methods.length; i++) {
var method = methods[i];
var original = obj[method];
obj[method] = function retryWrapper(original2) {
var op = exports.operation(options);
var args = Array.prototype.slice.call(arguments, 1);
var callback = args.pop();
args.push(function(err) {
if (op.retry(err)) {
return;
}
if (err) {
arguments[0] = op.mainError();
}
callback.apply(this, arguments);
});
op.attempt(function() {
original2.apply(obj, args);
});
}.bind(obj, original);
obj[method].options = options;
}
};
}
});
// node_modules/retry/index.js
var require_retry2 = __commonJS({
"node_modules/retry/index.js"(exports, module2) {
module2.exports = require_retry();
}
});
// node_modules/p-retry/index.js
var require_p_retry = __commonJS({
"node_modules/p-retry/index.js"(exports, module2) {
"use strict";
var retry = require_retry2();
var networkErrorMsgs = [
"Failed to fetch",
// Chrome
"NetworkError when attempting to fetch resource.",
// Firefox
"The Internet connection appears to be offline.",
// Safari
"Network request failed"
// `cross-fetch`
];
var AbortError = class extends Error {
constructor(message) {
super();
if (message instanceof Error) {
this.originalError = message;
({ message } = message);
} else {
this.originalError = new Error(message);
this.originalError.stack = this.stack;
}
this.name = "AbortError";
this.message = message;
}
};
var decorateErrorWithCounts = (error, attemptNumber, options) => {
const retriesLeft = options.retries - (attemptNumber - 1);
error.attemptNumber = attemptNumber;
error.retriesLeft = retriesLeft;
return error;
};
var isNetworkError = (errorMessage) => networkErrorMsgs.includes(errorMessage);
var pRetry4 = (input, options) => new Promise((resolve, reject) => {
options = {
onFailedAttempt: () => {
},
retries: 10,
...options
};
const operation = retry.operation(options);
operation.attempt(async (attemptNumber) => {
try {
resolve(await input(attemptNumber));
} catch (error) {
if (!(error instanceof Error)) {
reject(new TypeError(`Non-error was thrown: "${error}". You should only throw errors.`));
return;
}
if (error instanceof AbortError) {
operation.stop();
reject(error.originalError);
} else if (error instanceof TypeError && !isNetworkError(error.message)) {
operation.stop();
reject(error);
} else {
decorateErrorWithCounts(error, attemptNumber, options);
try {
await options.onFailedAttempt(error);
} catch (error2) {
reject(error2);
return;
}
if (!operation.retry(error)) {
reject(operation.mainError());
}
}
}
});
});
module2.exports = pRetry4;
module2.exports.default = pRetry4;
module2.exports.AbortError = AbortError;
}
});
// node_modules/decamelize/index.js
var require_decamelize = __commonJS({
"node_modules/decamelize/index.js"(exports, module2) {
"use strict";
module2.exports = function(str, sep) {
if (typeof str !== "string") {
throw new TypeError("Expected a string");
}
sep = typeof sep === "undefined" ? "_" : sep;
return str.replace(/([a-z\d])([A-Z])/g, "$1" + sep + "$2").replace(/([A-Z]+)([A-Z][a-z\d]+)/g, "$1" + sep + "$2").toLowerCase();
};
}
});
// node_modules/camelcase/index.js
var require_camelcase = __commonJS({
"node_modules/camelcase/index.js"(exports, module2) {
"use strict";
var UPPERCASE = /[\p{Lu}]/u;
var LOWERCASE = /[\p{Ll}]/u;
var LEADING_CAPITAL = /^[\p{Lu}](?![\p{Lu}])/gu;
var IDENTIFIER = /([\p{Alpha}\p{N}_]|$)/u;
var SEPARATORS = /[_.\- ]+/;
var LEADING_SEPARATORS = new RegExp("^" + SEPARATORS.source);
var SEPARATORS_AND_IDENTIFIER = new RegExp(SEPARATORS.source + IDENTIFIER.source, "gu");
var NUMBERS_AND_IDENTIFIER = new RegExp("\\d+" + IDENTIFIER.source, "gu");
var preserveCamelCase = (string, toLowerCase, toUpperCase) => {
let isLastCharLower = false;
let isLastCharUpper = false;
let isLastLastCharUpper = false;
for (let i = 0; i < string.length; i++) {
const character = string[i];
if (isLastCharLower && UPPERCASE.test(character)) {
string = string.slice(0, i) + "-" + string.slice(i);
isLastCharLower = false;
isLastLastCharUpper = isLastCharUpper;
isLastCharUpper = true;
i++;
} else if (isLastCharUpper && isLastLastCharUpper && LOWERCASE.test(character)) {
string = string.slice(0, i - 1) + "-" + string.slice(i - 1);
isLastLastCharUpper = isLastCharUpper;
isLastCharUpper = false;
isLastCharLower = true;
} else {
isLastCharLower = toLowerCase(character) === character && toUpperCase(character) !== character;
isLastLastCharUpper = isLastCharUpper;
isLastCharUpper = toUpperCase(character) === character && toLowerCase(character) !== character;
}
}
return string;
};
var preserveConsecutiveUppercase = (input, toLowerCase) => {
LEADING_CAPITAL.lastIndex = 0;
return input.replace(LEADING_CAPITAL, (m1) => toLowerCase(m1));
};
var postProcess = (input, toUpperCase) => {
SEPARATORS_AND_IDENTIFIER.lastIndex = 0;
NUMBERS_AND_IDENTIFIER.lastIndex = 0;
return input.replace(SEPARATORS_AND_IDENTIFIER, (_, identifier) => toUpperCase(identifier)).replace(NUMBERS_AND_IDENTIFIER, (m) => toUpperCase(m));
};
var camelCase2 = (input, options) => {
if (!(typeof input === "string" || Array.isArray(input))) {
throw new TypeError("Expected the input to be `string | string[]`");
}
options = {
pascalCase: false,
preserveConsecutiveUppercase: false,
...options
};
if (Array.isArray(input)) {
input = input.map((x) => x.trim()).filter((x) => x.length).join("-");
} else {
input = input.trim();
}
if (input.length === 0) {
return "";
}
const toLowerCase = options.locale === false ? (string) => string.toLowerCase() : (string) => string.toLocaleLowerCase(options.locale);
const toUpperCase = options.locale === false ? (string) => string.toUpperCase() : (string) => string.toLocaleUpperCase(options.locale);
if (input.length === 1) {
return options.pascalCase ? toUpperCase(input) : toLowerCase(input);
}
const hasUpperCase = input !== toLowerCase(input);
if (hasUpperCase) {
input = preserveCamelCase(input, toLowerCase, toUpperCase);
}
input = input.replace(LEADING_SEPARATORS, "");
if (options.preserveConsecutiveUppercase) {
input = preserveConsecutiveUppercase(input, toLowerCase);
} else {
input = toLowerCase(input);
}
if (options.pascalCase) {
input = toUpperCase(input.charAt(0)) + input.slice(1);
}
return postProcess(input, toUpperCase);
};
module2.exports = camelCase2;
module2.exports.default = camelCase2;
}
});
// node_modules/langchain/node_modules/ansi-styles/index.js
var require_ansi_styles = __commonJS({
"node_modules/langchain/node_modules/ansi-styles/index.js"(exports, module2) {
"use strict";
var ANSI_BACKGROUND_OFFSET = 10;
var wrapAnsi256 = (offset = 0) => (code) => `\x1B[${38 + offset};5;${code}m`;
var wrapAnsi16m = (offset = 0) => (red, green, blue) => `\x1B[${38 + offset};2;${red};${green};${blue}m`;
function assembleStyles() {
const codes = /* @__PURE__ */ new Map();
const styles2 = {
modifier: {
reset: [0, 0],
// 21 isn't widely supported and 22 does the same thing
bold: [1, 22],
dim: [2, 22],
italic: [3, 23],
underline: [4, 24],
overline: [53, 55],
inverse: [7, 27],
hidden: [8, 28],
strikethrough: [9, 29]
},
color: {
black: [30, 39],
red: [31, 39],
green: [32, 39],
yellow: [33, 39],
blue: [34, 39],
magenta: [35, 39],
cyan: [36, 39],
white: [37, 39],
// Bright color
blackBright: [90, 39],
redBright: [91, 39],
greenBright: [92, 39],
yellowBright: [93, 39],
blueBright: [94, 39],
magentaBright: [95, 39],
cyanBright: [96, 39],
whiteBright: [97, 39]
},
bgColor: {
bgBlack: [40, 49],
bgRed: [41, 49],
bgGreen: [42, 49],
bgYellow: [43, 49],
bgBlue: [44, 49],
bgMagenta: [45, 49],
bgCyan: [46, 49],
bgWhite: [47, 49],
// Bright color
bgBlackBright: [100, 49],
bgRedBright: [101, 49],
bgGreenBright: [102, 49],
bgYellowBright: [103, 49],
bgBlueBright: [104, 49],
bgMagentaBright: [105, 49],
bgCyanBright: [106, 49],
bgWhiteBright: [107, 49]
}
};
styles2.color.gray = styles2.color.blackBright;
styles2.bgColor.bgGray = styles2.bgColor.bgBlackBright;
styles2.color.grey = styles2.color.blackBright;
styles2.bgColor.bgGrey = styles2.bgColor.bgBlackBright;
for (const [groupName, group] of Object.entries(styles2)) {
for (const [styleName, style] of Object.entries(group)) {
styles2[styleName] = {
open: `\x1B[${style[0]}m`,
close: `\x1B[${style[1]}m`
};
group[styleName] = styles2[styleName];
codes.set(style[0], style[1]);
}
Object.defineProperty(styles2, groupName, {
value: group,
enumerable: false
});
}
Object.defineProperty(styles2, "codes", {
value: codes,
enumerable: false
});
styles2.color.close = "\x1B[39m";
styles2.bgColor.close = "\x1B[49m";
styles2.color.ansi256 = wrapAnsi256();
styles2.color.ansi16m = wrapAnsi16m();
styles2.bgColor.ansi256 = wrapAnsi256(ANSI_BACKGROUND_OFFSET);
styles2.bgColor.ansi16m = wrapAnsi16m(ANSI_BACKGROUND_OFFSET);
Object.defineProperties(styles2, {
rgbToAnsi256: {
value: (red, green, blue) => {
if (red === green && green === blue) {
if (red < 8) {
return 16;
}
if (red > 248) {
return 231;
}
return Math.round((red - 8) / 247 * 24) + 232;
}
return 16 + 36 * Math.round(red / 255 * 5) + 6 * Math.round(green / 255 * 5) + Math.round(blue / 255 * 5);
},
enumerable: false
},
hexToRgb: {
value: (hex) => {
const matches = /(?<colorString>[a-f\d]{6}|[a-f\d]{3})/i.exec(hex.toString(16));
if (!matches) {
return [0, 0, 0];
}
let { colorString } = matches.groups;
if (colorString.length === 3) {
colorString = colorString.split("").map((character) => character + character).join("");
}
const integer = Number.parseInt(colorString, 16);
return [
integer >> 16 & 255,
integer >> 8 & 255,
integer & 255
];
},
enumerable: false
},
hexToAnsi256: {
value: (hex) => styles2.rgbToAnsi256(...styles2.hexToRgb(hex)),
enumerable: false
}
});
return styles2;
}
Object.defineProperty(module2, "exports", {
enumerable: true,
get: assembleStyles
});
}
});
// node_modules/eventemitter3/index.js
var require_eventemitter3 = __commonJS({
"node_modules/eventemitter3/index.js"(exports, module2) {
"use strict";
var has = Object.prototype.hasOwnProperty;
var prefix = "~";
function Events() {
}
if (Object.create) {
Events.prototype = /* @__PURE__ */ Object.create(null);
if (!new Events().__proto__)
prefix = false;
}
function EE(fn, context, once) {
this.fn = fn;
this.context = context;
this.once = once || false;
}
function addListener(emitter, event, fn, context, once) {
if (typeof fn !== "function") {
throw new TypeError("The listener must be a function");
}
var listener = new EE(fn, context || emitter, once), evt = prefix ? prefix + event : event;
if (!emitter._events[evt])
emitter._events[evt] = listener, emitter._eventsCount++;
else if (!emitter._events[evt].fn)
emitter._events[evt].push(listener);
else
emitter._events[evt] = [emitter._events[evt], listener];
return emitter;
}
function clearEvent(emitter, evt) {
if (--emitter._eventsCount === 0)
emitter._events = new Events();
else
delete emitter._events[evt];
}
function EventEmitter() {
this._events = new Events();
this._eventsCount = 0;
}
EventEmitter.prototype.eventNames = function eventNames() {
var names = [], events, name;
if (this._eventsCount === 0)
return names;
for (name in events = this._events) {
if (has.call(events, name))
names.push(prefix ? name.slice(1) : name);
}
if (Object.getOwnPropertySymbols) {
return names.concat(Object.getOwnPropertySymbols(events));
}
return names;
};
EventEmitter.prototype.listeners = function listeners(event) {
var evt = prefix ? prefix + event : event, handlers = this._events[evt];
if (!handlers)
return [];
if (handlers.fn)
return [handlers.fn];
for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {
ee[i] = handlers[i].fn;
}
return ee;
};
EventEmitter.prototype.listenerCount = function listenerCount(event) {
var evt = prefix ? prefix + event : event, listeners = this._events[evt];
if (!listeners)
return 0;
if (listeners.fn)
return 1;
return listeners.length;
};
EventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {
var evt = prefix ? prefix + event : event;
if (!this._events[evt])
return false;
var listeners = this._events[evt], len = arguments.length, args, i;
if (listeners.fn) {
if (listeners.once)
this.removeListener(event, listeners.fn, void 0, true);
switch (len) {
case 1:
return listeners.fn.call(listeners.context), true;
case 2:
return listeners.fn.call(listeners.context, a1), true;
case 3:
return listeners.fn.call(listeners.context, a1, a2), true;
case 4:
return listeners.fn.call(listeners.context, a1, a2, a3), true;
case 5:
return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;
case 6:
return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;
}
for (i = 1, args = new Array(len - 1); i < len; i++) {
args[i - 1] = arguments[i];
}
listeners.fn.apply(listeners.context, args);
} else {
var length = listeners.length, j;
for (i = 0; i < length; i++) {
if (listeners[i].once)
this.removeListener(event, listeners[i].fn, void 0, true);
switch (len) {
case 1:
listeners[i].fn.call(listeners[i].context);
break;
case 2:
listeners[i].fn.call(listeners[i].context, a1);
break;
case 3:
listeners[i].fn.call(listeners[i].context, a1, a2);
break;
case 4:
listeners[i].fn.call(listeners[i].context, a1, a2, a3);
break;
default:
if (!args)
for (j = 1, args = new Array(len - 1); j < len; j++) {
args[j - 1] = arguments[j];
}
listeners[i].fn.apply(listeners[i].context, args);
}
}
}
return true;
};
EventEmitter.prototype.on = function on(event, fn, context) {
return addListener(this, event, fn, context, false);
};
EventEmitter.prototype.once = function once(event, fn, context) {
return addListener(this, event, fn, context, true);
};
EventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {
var evt = prefix ? prefix + event : event;
if (!this._events[evt])
return this;
if (!fn) {
clearEvent(this, evt);
return this;
}
var listeners = this._events[evt];
if (listeners.fn) {
if (listeners.fn === fn && (!once || listeners.once) && (!context || listeners.context === context)) {
clearEvent(this, evt);
}
} else {
for (var i = 0, events = [], length = listeners.length; i < length; i++) {
if (listeners[i].fn !== fn || once && !listeners[i].once || context && listeners[i].context !== context) {
events.push(listeners[i]);
}
}
if (events.length)
this._events[evt] = events.length === 1 ? events[0] : events;
else
clearEvent(this, evt);
}
return this;
};
EventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {
var evt;
if (event) {
evt = prefix ? prefix + event : event;
if (this._events[evt])
clearEvent(this, evt);
} else {
this._events = new Events();
this._eventsCount = 0;
}
return this;
};
EventEmitter.prototype.off = EventEmitter.prototype.removeListener;
EventEmitter.prototype.addListener = EventEmitter.prototype.on;
EventEmitter.prefixed = prefix;
EventEmitter.EventEmitter = EventEmitter;
if ("undefined" !== typeof module2) {
module2.exports = EventEmitter;
}
}
});
// node_modules/p-finally/index.js
var require_p_finally = __commonJS({
"node_modules/p-finally/index.js"(exports, module2) {
"use strict";
module2.exports = (promise, onFinally) => {
onFinally = onFinally || (() => {
});
return promise.then(
(val) => new Promise((resolve) => {
resolve(onFinally());
}).then(() => val),
(err) => new Promise((resolve) => {
resolve(onFinally());
}).then(() => {
throw err;
})
);
};
}
});
// node_modules/p-timeout/index.js
var require_p_timeout = __commonJS({
"node_modules/p-timeout/index.js"(exports, module2) {
"use strict";
var pFinally = require_p_finally();
var TimeoutError = class extends Error {
constructor(message) {
super(message);
this.name = "TimeoutError";
}
};
var pTimeout = (promise, milliseconds, fallback) => new Promise((resolve, reject) => {
if (typeof milliseconds !== "number" || milliseconds < 0) {
throw new TypeError("Expected `milliseconds` to be a positive number");
}
if (milliseconds === Infinity) {
resolve(promise);
return;
}
const timer = setTimeout(() => {
if (typeof fallback === "function") {
try {
resolve(fallback());
} catch (error) {
reject(error);
}
return;
}
const message = typeof fallback === "string" ? fallback : `Promise timed out after ${milliseconds} milliseconds`;
const timeoutError = fallback instanceof Error ? fallback : new TimeoutError(message);
if (typeof promise.cancel === "function") {
promise.cancel();
}
reject(timeoutError);
}, milliseconds);
pFinally(
// eslint-disable-next-line promise/prefer-await-to-then
promise.then(resolve, reject),
() => {
clearTimeout(timer);
}
);
});
module2.exports = pTimeout;
module2.exports.default = pTimeout;
module2.exports.TimeoutError = TimeoutError;
}
});
// node_modules/p-queue/dist/lower-bound.js
var require_lower_bound = __commonJS({
"node_modules/p-queue/dist/lower-bound.js"(exports) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
function lowerBound(array, value, comparator) {
let first = 0;
let count = array.length;
while (count > 0) {
const step = count / 2 | 0;
let it = first + step;
if (comparator(array[it], value) <= 0) {
first = ++it;
count -= step + 1;
} else {
count = step;
}
}
return first;
}
exports.default = lowerBound;
}
});
// node_modules/p-queue/dist/priority-queue.js
var require_priority_queue = __commonJS({
"node_modules/p-queue/dist/priority-queue.js"(exports) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var lower_bound_1 = require_lower_bound();
var PriorityQueue = class {
constructor() {
this._queue = [];
}
enqueue(run, options) {
options = Object.assign({ priority: 0 }, options);
const element = {
priority: options.priority,
run
};
if (this.size && this._queue[this.size - 1].priority >= options.priority) {
this._queue.push(element);
return;
}
const index = lower_bound_1.default(this._queue, element, (a, b) => b.priority - a.priority);
this._queue.splice(index, 0, element);
}
dequeue() {
const item = this._queue.shift();
return item === null || item === void 0 ? void 0 : item.run;
}
filter(options) {
return this._queue.filter((element) => element.priority === options.priority).map((element) => element.run);
}
get size() {
return this._queue.length;
}
};
exports.default = PriorityQueue;
}
});
// node_modules/p-queue/dist/index.js
var require_dist = __commonJS({
"node_modules/p-queue/dist/index.js"(exports) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var EventEmitter = require_eventemitter3();
var p_timeout_1 = require_p_timeout();
var priority_queue_1 = require_priority_queue();
var empty = () => {
};
var timeoutError = new p_timeout_1.TimeoutError();
var PQueue = class extends EventEmitter {
constructor(options) {
var _a2, _b, _c, _d;
super();
this._intervalCount = 0;
this._intervalEnd = 0;
this._pendingCount = 0;
this._resolveEmpty = empty;
this._resolveIdle = empty;
options = Object.assign({ carryoverConcurrencyCount: false, intervalCap: Infinity, interval: 0, concurrency: Infinity, autoStart: true, queueClass: priority_queue_1.default }, options);
if (!(typeof options.intervalCap === "number" && options.intervalCap >= 1)) {
throw new TypeError(`Expected \`intervalCap\` to be a number from 1 and up, got \`${(_b = (_a2 = options.intervalCap) === null || _a2 === void 0 ? void 0 : _a2.toString()) !== null && _b !== void 0 ? _b : ""}\` (${typeof options.intervalCap})`);
}
if (options.interval === void 0 || !(Number.isFinite(options.interval) && options.interval >= 0)) {
throw new TypeError(`Expected \`interval\` to be a finite number >= 0, got \`${(_d = (_c = options.interval) === null || _c === void 0 ? void 0 : _c.toString()) !== null && _d !== void 0 ? _d : ""}\` (${typeof options.interval})`);
}
this._carryoverConcurrencyCount = options.carryoverConcurrencyCount;
this._isIntervalIgnored = options.intervalCap === Infinity || options.interval === 0;
this._intervalCap = options.intervalCap;
this._interval = options.interval;
this._queue = new options.queueClass();
this._queueClass = options.queueClass;
this.concurrency = options.concurrency;
this._timeout = options.timeout;
this._throwOnTimeout = options.throwOnTimeout === true;
this._isPaused = options.autoStart === false;
}
get _doesIntervalAllowAnother() {
return this._isIntervalIgnored || this._intervalCount < this._intervalCap;
}
get _doesConcurrentAllowAnother() {
return this._pendingCount < this._concurrency;
}
_next() {
this._pendingCount--;
this._tryToStartAnother();
this.emit("next");
}
_resolvePromises() {
this._resolveEmpty();
this._resolveEmpty = empty;
if (this._pendingCount === 0) {
this._resolveIdle();
this._resolveIdle = empty;
this.emit("idle");
}
}
_onResumeInterval() {
this._onInterval();
this._initializeIntervalIfNeeded();
this._timeoutId = void 0;
}
_isIntervalPaused() {
const now = Date.now();
if (this._intervalId === void 0) {
const delay = this._intervalEnd - now;
if (delay < 0) {
this._intervalCount = this._carryoverConcurrencyCount ? this._pendingCount : 0;
} else {
if (this._timeoutId === void 0) {
this._timeoutId = setTimeout(() => {
this._onResumeInterval();
}, delay);
}
return true;
}
}
return false;
}
_tryToStartAnother() {
if (this._queue.size === 0) {
if (this._intervalId) {
clearInterval(this._intervalId);
}
this._intervalId = void 0;
this._resolvePromises();
return false;
}
if (!this._isPaused) {
const canInitializeInterval = !this._isIntervalPaused();
if (this._doesIntervalAllowAnother && this._doesConcurrentAllowAnother) {
const job = this._queue.dequeue();
if (!job) {
return false;
}
this.emit("active");
job();
if (canInitializeInterval) {
this._initializeIntervalIfNeeded();
}
return true;
}
}
return false;
}
_initializeIntervalIfNeeded() {
if (this._isIntervalIgnored || this._intervalId !== void 0) {
return;
}
this._intervalId = setInterval(() => {
this._onInterval();
}, this._interval);
this._intervalEnd = Date.now() + this._interval;
}
_onInterval() {
if (this._intervalCount === 0 && this._pendingCount === 0 && this._intervalId) {
clearInterval(this._intervalId);
this._intervalId = void 0;
}
this._intervalCount = this._carryoverConcurrencyCount ? this._pendingCount : 0;
this._processQueue();
}
/**
Executes all queued functions until it reaches the limit.
*/
_processQueue() {
while (this._tryToStartAnother()) {
}
}
get concurrency() {
return this._concurrency;
}
set concurrency(newConcurrency) {
if (!(typeof newConcurrency === "number" && newConcurrency >= 1)) {
throw new TypeError(`Expected \`concurrency\` to be a number from 1 and up, got \`${newConcurrency}\` (${typeof newConcurrency})`);
}
this._concurrency = newConcurrency;
this._processQueue();
}
/**
Adds a sync or async task to the queue. Always returns a promise.
*/
async add(fn, options = {}) {
return new Promise((resolve, reject) => {
const run = async () => {
this._pendingCount++;
this._intervalCount++;
try {
const operation = this._timeout === void 0 && options.timeout === void 0 ? fn() : p_timeout_1.default(Promise.resolve(fn()), options.timeout === void 0 ? this._timeout : options.timeout, () => {
if (options.throwOnTimeout === void 0 ? this._throwOnTimeout : options.throwOnTimeout) {
reject(timeoutError);
}
return void 0;
});
resolve(await operation);
} catch (error) {
reject(error);
}
this._next();
};
this._queue.enqueue(run, options);
this._tryToStartAnother();
this.emit("add");
});
}
/**
Same as `.add()`, but accepts an array of sync or async functions.
@returns A promise that resolves when all functions are resolved.
*/
async addAll(functions, options) {
return Promise.all(functions.map(async (function_) => this.add(function_, options)));
}
/**
Start (or resume) executing enqueued tasks within concurrency limit. No need to call this if queue is not paused (via `options.autoStart = false` or by `.pause()` method.)
*/
start() {
if (!this._isPaused) {
return this;
}
this._isPaused = false;
this._processQueue();
return this;
}
/**
Put queue execution on hold.
*/
pause() {
this._isPaused = true;
}
/**
Clear the queue.
*/
clear() {
this._queue = new this._queueClass();
}
/**
Can be called multiple times. Useful if you for example add additional items at a later time.
@returns A promise that settles when the queue becomes empty.
*/
async onEmpty() {
if (this._queue.size === 0) {
return;
}
return new Promise((resolve) => {
const existingResolve = this._resolveEmpty;
this._resolveEmpty = () => {
existingResolve();
resolve();
};
});
}
/**
The difference with `.onEmpty` is that `.onIdle` guarantees that all work from the queue has finished. `.onEmpty` merely signals that the queue is empty, but it could mean that some promises haven't completed yet.
@returns A promise that settles when the queue becomes empty, and all promises have completed; `queue.size === 0 && queue.pending === 0`.
*/
async onIdle() {
if (this._pendingCount === 0 && this._queue.size === 0) {
return;
}
return new Promise((resolve) => {
const existingResolve = this._resolveIdle;
this._resolveIdle = () => {
existingResolve();
resolve();
};
});
}
/**
Size of the queue.
*/
get size() {
return this._queue.size;
}
/**
Size of the queue, filtered by the given options.
For example, this can be used to find the number of items remaining in the queue with a specific priority level.
*/
sizeBy(options) {
return this._queue.filter(options).length;
}
/**
Number of pending promises.
*/
get pending() {
return this._pendingCount;
}
/**
Whether the queue is currently paused.
*/
get isPaused() {
return this._isPaused;
}
get timeout() {
return this._timeout;
}
/**
Set the timeout for future operations.
*/
set timeout(milliseconds) {
this._timeout = milliseconds;
}
};
exports.default = PQueue;
}
});
// node_modules/binary-search/index.js
var require_binary_search = __commonJS({
"node_modules/binary-search/index.js"(exports, module2) {
module2.exports = function(haystack, needle, comparator, low, high) {
var mid, cmp;
if (low === void 0)
low = 0;
else {
low = low | 0;
if (low < 0 || low >= haystack.length)
throw new RangeError("invalid lower bound");
}
if (high === void 0)
high = haystack.length - 1;
else {
high = high | 0;
if (high < low || high >= haystack.length)
throw new RangeError("invalid upper bound");
}
while (low <= high) {
mid = low + (high - low >>> 1);
cmp = +comparator(haystack[mid], needle, mid, haystack);
if (cmp < 0)
low = mid + 1;
else if (cmp > 0)
high = mid - 1;
else
return mid;
}
return ~low;
};
}
});
// node_modules/num-sort/index.js
var require_num_sort = __commonJS({
"node_modules/num-sort/index.js"(exports) {
"use strict";
function assertNumber(number) {
if (typeof number !== "number") {
throw new TypeError("Expected a number");
}
}
exports.ascending = (left, right) => {
assertNumber(left);
assertNumber(right);
if (Number.isNaN(left)) {
return -1;
}
if (Number.isNaN(right)) {
return 1;
}
return left - right;
};
exports.descending = (left, right) => {
assertNumber(left);
assertNumber(right);
if (Number.isNaN(left)) {
return 1;
}
if (Number.isNaN(right)) {
return -1;
}
return right - left;
};
}
});
// src/main.ts
var main_exports = {};
__export(main_exports, {
default: () => LocalGPT
});
module.exports = __toCommonJS(main_exports);
var import_obsidian6 = require("obsidian");
// src/LocalGPTSettingTab.ts
var import_obsidian5 = require("obsidian");
// src/defaultSettings.ts
var DEFAULT_SETTINGS = {
providers: {
ollama: {
ollamaUrl: "http://localhost:11434",
defaultModel: "gemma2",
embeddingModel: "",
type: "ollama"
},
ollama_fallback: {
ollamaUrl: "http://localhost:11434",
defaultModel: "gemma2",
embeddingModel: "",
type: "ollama"
},
openaiCompatible: {
url: "http://localhost:8080",
apiKey: "",
embeddingModel: "",
type: "openaiCompatible"
},
openaiCompatible_fallback: {
url: "http://localhost:8080",
apiKey: "",
embeddingModel: "",
type: "openaiCompatible"
}
},
defaults: {
provider: "ollama",
fallbackProvider: "",
creativity: "low"
},
actions: [
{
name: "\u{1FA84} General help",
prompt: "",
system: "You are an assistant helping a user write more content in a document based on a prompt. Output in markdown format. Do not use links. Do not include literal content from the original document."
},
{
name: "\u270D\uFE0F Continue writing",
prompt: "Act as a professional editor with many years of experience as a writer. Carefully finalize the following text, add details, use facts and make sure that the meaning and original style are preserved. Purposely write in detail, with examples, so that your reader is comfortable, even if they don't understand the specifics. Don't use clericalisms, evaluations without proof with facts, passive voice. Use Markdown markup language for formatting. Answer only content and nothing else, no introductory words, only substance.",
system: "You are an AI assistant that follows instruction extremely well. Help as much as you can."
},
{
name: "\u{1F36D} Summarize",
prompt: "Make a concise summary of the key points of the following text.",
system: "You are an AI assistant that follows instruction extremely well. Help as much as you can."
},
{
name: "\u{1F4D6} Fix spelling and grammar",
prompt: "Proofread the below for spelling and grammar.",
system: "You are an AI assistant that follows instruction extremely well. Help as much as you can.",
replace: true
},
{
name: "\u2705 Find action items",
prompt: 'Act as an assistant helping find action items inside a document. An action item is an extracted task or to-do found inside of an unstructured document. Use Markdown checkbox format: each line starts with "- [ ] "',
system: "You are an AI assistant that follows instruction extremely well. Help as much as you can."
},
{
name: "\u{1F9E0} New System Prompt",
prompt: "",
system: `You are a highly skilled AI prompt engineer with expertise in creating tailored prompts for a wide range of professional roles. You have a deep knowledge of how to craft prompts that effectively guide the language model to produce high-quality, contextually appropriate responses.
Your task is to generate a custom system prompt for different roles based on user input. This involves understanding the specific requirements of each role, the context in which the prompt will be used, and the desired output format. You are skilled in structuring prompts that ensure clarity, relevance, and utility.
Create a custom system prompt for an LLM to assist users in generating contextually appropriate and highly effective responses for various roles. The prompt should provide clear instructions to the LLM on how to handle specific scenarios related to the role, including the tone and format of the response.
Start by providing a role "You are..." and context as a summary of the situation or background information relevant to the prompt. Define the main objective, outlining what the LLM needs to accomplish.
Include instructions on the appropriate style and tone (e.g., formal, casual, technical, empathetic) based on the role and audience. Identify the target audience to tailor the LLM's output effectively. Specify the format of the response, whether it should be a narrative, bullet points, step-by-step guide, code, or another format. Avoid using headings or examples; the prompt should read as a continuous, cohesive set of instructions.
ANSWER PROMPT AND NOTHING ELSE!`
}
],
_version: 5
};
var CREATIVITY = {
"": {
temperature: 0
},
low: {
temperature: 0.2
},
medium: {
temperature: 0.5
},
high: {
temperature: 1
}
};
var SELECTION_KEYWORD = "{{=SELECTION=}}";
var CONTEXT_KEYWORD = "{{=CONTEXT=}}";
var CONTEXT_CONDITION_START = "{{=CONTEXT_START=}}";
var CONTEXT_CONDITION_END = "{{=CONTEXT_END=}}";
// src/providers/ollama.ts
var import_obsidian2 = require("obsidian");
// src/request-handler.ts
var import_electron = require("electron");
// src/logger.ts
var Logger = class {
constructor() {
this.logLevel = 0 /* DEBUG */;
this.timers = /* @__PURE__ */ new Map();
this.colorIndex = 0;
this.colors = [
"#FFB3BA",
"#BAFFC9",
"#BAE1FF",
"#FFFFBA",
"#FFDFBA",
"#E0BBE4"
];
this.isDevMode = false;
}
static getInstance() {
if (!Logger.instance) {
Logger.instance = new Logger();
}
return Logger.instance;
}
setLogLevel(level) {
this.logLevel = level;
}
logWithEmoji(level, message, ...args) {
if (this.isDevMode && level >= this.logLevel) {
const emoji = this.getEmojiForLevel(level);
if (args.length === 0) {
console.log(`${emoji} %c${message}`, "font-weight: bold;");
} else {
console.group(`${emoji} %c${message}`, "font-weight: bold;");
this.logArgs(args);
console.groupEnd();
}
}
}
logArgs(args) {
args.forEach((arg) => {
console.log(arg);
});
}
getEmojiForLevel(level) {
switch (level) {
case 0 /* DEBUG */:
return "\u{1F41B}";
case 1 /* INFO */:
return "\u2139\uFE0F";
case 2 /* WARN */:
return "\u26A0\uFE0F";
case 3 /* ERROR */:
return "\u{1F6AB}";
case 4 /* SUCCESS */:
return "\u2705";
default:
return "";
}
}
debug(message, ...args) {
this.logWithEmoji(0 /* DEBUG */, message, ...args);
}
info(message, ...args) {
this.logWithEmoji(1 /* INFO */, message, ...args);
}
warn(message, ...args) {
this.logWithEmoji(2 /* WARN */, message, ...args);
}
error(message, ...args) {
this.logWithEmoji(3 /* ERROR */, message, ...args);
}
success(message, ...args) {
this.logWithEmoji(4 /* SUCCESS */, message, ...args);
}
table(message, ...args) {
if (this.isDevMode && this.logLevel <= 0 /* DEBUG */) {
console.group(`\u{1F4CA} %c${message}`, "font-weight: bold;");
this.logNestedGroups(args);
console.groupEnd();
}
}
logNestedGroups(args) {
args.forEach((arg) => {
if (typeof arg === "object" && arg !== null) {
this.logObjectAsGroups(arg);
} else {
console.log(arg);
}
});
}
logObjectAsGroups(obj) {
Object.entries(obj).forEach(([key, value]) => {
if (typeof value === "object" && value !== null) {
console.group(`${key}:`);
this.logObjectAsGroups(value);
console.groupEnd();
} else {
console.log(`${key}: ${value}`);
}
});
}
time(label) {
if (this.isDevMode && this.logLevel <= 0 /* DEBUG */) {
const color2 = this.getNextColor();
this.timers.set(label, { startTime: performance.now(), color: color2 });
console.log(
`\u23F1\uFE0F %c${label}: timer started`,
`color: black; font-weight: bold; background-color: ${color2}; padding: 2px 5px; border-radius: 3px;`
);
}
}
timeEnd(label) {
if (this.isDevMode && this.logLevel <= 0 /* DEBUG */) {
const timerData = this.timers.get(label);
if (timerData) {
const duration = performance.now() - timerData.startTime;
console.log(
`\u23F1\uFE0F %c${label}: ${duration.toFixed(2)}ms`,
`color: black; font-weight: bold; background-color: ${timerData.color}; padding: 2px 5px; border-radius: 3px;`
);
this.timers.delete(label);
} else {
console.warn(`Timer '${label}' does not exist`);
}
}
}
getNextColor() {
const color2 = this.colors[this.colorIndex];
this.colorIndex = (this.colorIndex + 1) % this.colors.length;
return color2;
}
// Добавляем новый метод для создания разделителя
separator(message = "") {
if (this.isDevMode) {
const lineLength = 20;
const line = "\u2501".repeat(lineLength);
const paddedMessage = message ? ` ${message} ` : "";
const leftPadding = Math.floor(
(lineLength - paddedMessage.length) / 2
);
const rightPadding = lineLength - paddedMessage.length - leftPadding;
const separatorLine = message ? line.slice(0, leftPadding) + paddedMessage + line.slice(lineLength - rightPadding) : line;
console.log(
"\n%c" + separatorLine,
"color: #FF4500; font-weight: bold; font-size: 1.2em;"
);
}
}
};
var logger = Logger.getInstance();
// src/request-handler.ts
var import_obsidian = require("obsidian");
var RequestHandler = class {
constructor() {
this.useRemoteRequest = !import_obsidian.Platform.isMobileApp;
}
static getInstance() {
if (!RequestHandler.instance) {
RequestHandler.instance = new RequestHandler();
}
return RequestHandler.instance;
}
async makeRequest(options, handlers) {
try {
if (this.useRemoteRequest) {
return await this.makeRemoteRequest(options, handlers);
} else {
return await this.makeFetchRequest(options, handlers);
}
} catch (error) {
handlers.onError(error);
}
}
async makeRemoteRequest(options, handlers) {
return new Promise((resolve, reject) => {
const request = import_electron.remote.net.request({
method: options.method,
url: options.url
});
logger.debug("Request url:", options.url);
if (options.abortController.signal.aborted) {
handlers.onError(new Error("Request aborted"));
reject();
return;
}
options.abortController.signal.addEventListener("abort", () => {
logger.warn("Request aborted");
request.abort();
handlers.onError(new Error("Request aborted"));
reject();
});
if (options.headers) {
Object.entries(options.headers).forEach(([key, value]) => {
request.setHeader(key, value);
});
}
request.on("response", (response) => {
logger.table("Response headers:", {
statusCode: response.statusCode,
...response.headers
});
response.on("data", (chunk) => {
if (options.abortController.signal.aborted) {
handlers.onError(new Error("Request aborted"));
reject();
return;
}
handlers.onData(chunk.toString("utf8"));
});
response.on("end", () => {
logger.debug("Response end");
handlers.onEnd();
resolve();
});
});
request.on("error", (error) => {
handlers.onError(error);
reject(error);
});
if (options.body) {
request.write(options.body);
}
request.end();
});
}
async makeFetchRequest(options, handlers) {
var _a2;
try {
const response = await fetch(options.url, {
method: options.method,
headers: options.headers,
body: options.body,
signal: options.abortController.signal
});
const reader = (_a2 = response.body) == null ? void 0 : _a2.getReader();
if (!reader) {
throw new Error("Unable to read response body");
}
while (true) {
const { done, value } = await reader.read();
if (done)
break;
handlers.onData(new TextDecoder().decode(value));
}
handlers.onEnd();
} catch (error) {
handlers.onError(error);
}
}
};
// src/utils.ts
function preparePrompt(prompt = "", selectedText, context) {
if (prompt.includes(SELECTION_KEYWORD)) {
prompt = prompt.replace(SELECTION_KEYWORD, selectedText || "");
} else {
prompt = [prompt, selectedText].filter(Boolean).join("\n\n");
}
if (prompt.includes(CONTEXT_KEYWORD)) {
prompt = prompt.replace(CONTEXT_KEYWORD, context || "");
} else {
if (context.trim()) {
prompt = [prompt, "Context:\n" + context].filter(Boolean).join("\n\n");
}
}
if (prompt.includes(CONTEXT_CONDITION_START) && prompt.includes(CONTEXT_CONDITION_END)) {
const start = prompt.indexOf(CONTEXT_CONDITION_START) - 1;
const end = prompt.indexOf(CONTEXT_CONDITION_END);
if (start !== -1 && end !== -1 && start < end) {
let contextBlock = prompt.substring(
start + CONTEXT_CONDITION_START.length + 1,
end
);
if (!context.trim()) {
contextBlock = "";
}
prompt = prompt.substring(0, start) + contextBlock + prompt.substring(end + CONTEXT_CONDITION_END.length + 1);
}
}
return prompt;
}
// src/providers/ollama.ts
var SYMBOLS_PER_TOKEN = 2.5;
var EMBEDDING_CONTEXT_LENGTH_LIMIT = 2048;
var MODEL_INFO_CACHE = /* @__PURE__ */ new Map();
var OllamaAIProvider = class {
constructor(config) {
this.defaultModel = config.defaultModel;
this.ollamaUrl = config.ollamaUrl;
this.embeddingModel = config.embeddingModel;
this.onUpdate = config.onUpdate;
this.abortController = config.abortController;
}
async process({
text = "",
action,
options,
images = [],
context = ""
}) {
const prompt = preparePrompt(action.prompt, text, context);
logger.debug("Querying prompt", prompt);
const requestBody = {
prompt,
model: action.model || this.defaultModel,
options: { temperature: options.temperature },
stream: true
};
if (action.system)
requestBody.system = action.system;
if (images.length)
requestBody.images = images;
const { contextLength, lastContextLength } = await this.getCachedModelInfo(requestBody.model);
const bodyLengthInTokens = Math.ceil(
JSON.stringify(requestBody).length / SYMBOLS_PER_TOKEN
);
logger.table("Context length", {
model: requestBody.model,
contextLength,
lastContextLength,
bodyLengthInTokens
});
if (contextLength > 0 && requestBody.options) {
if (bodyLengthInTokens > lastContextLength) {
requestBody.options.num_ctx = Math.min(
contextLength,
Math.round(bodyLengthInTokens * 1.2)
);
} else if (bodyLengthInTokens < lastContextLength * 0.5) {
requestBody.options.num_ctx = Math.min(
contextLength,
Math.round(bodyLengthInTokens * 1.2)
);
} else {
requestBody.options.num_ctx = Math.min(
contextLength,
lastContextLength
);
}
this.setModelInfoLastContextLength(
requestBody.model,
requestBody.options.num_ctx
);
}
const url = `${this.ollamaUrl.replace(/\/+$/i, "")}/api/generate`;
return new Promise((resolve, reject) => {
if (this.abortController.signal.aborted) {
return reject();
}
let combined = "";
const requestHandler = RequestHandler.getInstance();
requestHandler.makeRequest(
{
method: "POST",
url,
headers: { "Content-Type": "application/json" },
body: JSON.stringify(requestBody),
abortController: this.abortController
},
{
onData: (chunk) => {
if (this.abortController.signal.aborted) {
return reject();
}
const lines = chunk.split("\n").filter((line) => line.trim() !== "");
for (const line of lines) {
try {
const parsed = JSON.parse(line);
combined += parsed.response || "";
this.onUpdate(combined);
} catch (error) {
console.error(
"Could not JSON parse stream message",
line,
error
);
}
}
},
onError: (error) => {
if (this.abortController.signal.aborted) {
return reject();
}
(0, import_obsidian2.requestUrl)({
url,
method: "POST",
body: JSON.stringify({
...requestBody,
stream: false
})
}).then(({ json }) => resolve(json.response)).catch(reject);
},
onEnd: () => {
this.abortController.signal.aborted ? reject() : resolve(combined);
}
}
);
this.abortController.signal.addEventListener("abort", () => {
reject();
});
});
}
setModelInfoLastContextLength(model, num_ctx) {
const modelInfo = MODEL_INFO_CACHE.get(model);
if (modelInfo) {
modelInfo.lastContextLength = num_ctx;
MODEL_INFO_CACHE.set(model, modelInfo);
}
return modelInfo;
}
async getEmbeddings(texts, updateProgress) {
logger.info("Getting embeddings for texts");
const groupedTexts = [];
let currentGroup = [];
let currentLength = 0;
const { contextLength, lastContextLength } = await this.getCachedModelInfo(this.embeddingModel);
let embeddingContextLength = Math.min(
contextLength,
EMBEDDING_CONTEXT_LENGTH_LIMIT
);
const maxTextLength = Math.max(...texts.map((text) => text.length));
const maxTextLengthInTokens = Math.ceil(
maxTextLength / SYMBOLS_PER_TOKEN
);
if (maxTextLengthInTokens < lastContextLength) {
embeddingContextLength = lastContextLength;
} else if (maxTextLengthInTokens > embeddingContextLength) {
embeddingContextLength = Math.min(
contextLength,
maxTextLengthInTokens * 1.2
);
this.setModelInfoLastContextLength(
this.embeddingModel,
embeddingContextLength
);
}
logger.time("Tokenizing texts");
for (const text of texts) {
const textLengthInTokens = Math.ceil(
text.length / SYMBOLS_PER_TOKEN
);
logger.table("Text length in tokens", {
text,
textLength: text.length,
textLengthInTokens
});
if (currentLength + textLengthInTokens > embeddingContextLength) {
groupedTexts.push(currentGroup);
currentGroup = [];
currentLength = 0;
}
currentGroup.push(text);
currentLength += textLengthInTokens;
}
if (currentGroup.length > 0) {
groupedTexts.push(currentGroup);
}
logger.timeEnd("Tokenizing texts");
const allEmbeddings = [];
for (const group of groupedTexts) {
if (this.abortController.signal.aborted) {
return allEmbeddings;
}
const body = {
input: group,
model: this.embeddingModel,
options: {}
};
if (embeddingContextLength > EMBEDDING_CONTEXT_LENGTH_LIMIT) {
body.options.num_ctx = embeddingContextLength;
}
logger.table("Ollama embeddings request", group);
const { json } = await (0, import_obsidian2.requestUrl)({
url: `${this.ollamaUrl.replace(/\/+$/i, "")}/api/embed`,
method: "POST",
body: JSON.stringify(body)
});
logger.debug("Ollama embeddings for group", {
embeddings: json.embeddings
});
allEmbeddings.push(...json.embeddings);
updateProgress(json.embeddings.length);
}
return allEmbeddings;
}
async getCachedModelInfo(modelName) {
if (MODEL_INFO_CACHE.has(modelName)) {
return MODEL_INFO_CACHE.get(modelName);
}
const { json } = await (0, import_obsidian2.requestUrl)({
url: `${this.ollamaUrl.replace(/\/+$/i, "")}/api/show`,
method: "POST",
body: JSON.stringify({ model: modelName })
});
const modelInfo = {
contextLength: 0,
lastContextLength: 2048
};
const contextLengthKey = Object.keys(json.model_info).find(
(key) => key.endsWith(".context_length")
);
if (!contextLengthKey) {
return modelInfo;
}
modelInfo.contextLength = json.model_info[contextLengthKey];
MODEL_INFO_CACHE.set(modelName, modelInfo);
return modelInfo;
}
static async getModels(providerConfig) {
logger.debug("Fetching Ollama models");
const { json } = await (0, import_obsidian2.requestUrl)({
url: `${providerConfig.ollamaUrl.replace(/\/+$/i, "")}/api/tags`
});
if (!json.models || json.models.length === 0) {
logger.warn("No Ollama models found");
return Promise.reject("No models found");
}
return json.models.reduce(
(acc, el) => {
const name = el.name.replace(":latest", "");
acc[name] = name;
return acc;
},
{}
);
}
};
// src/providers/openai-compatible.ts
var import_obsidian3 = require("obsidian");
var OpenAICompatibleAIProvider = class {
constructor(config) {
this.url = config.url;
this.apiKey = config.apiKey || "";
this.defaultModel = config.defaultModel || "";
this.abortController = config.abortController;
this.onUpdate = config.onUpdate;
this.embeddingModel = config.embeddingModel || "";
}
async process({
text = "",
action,
options,
images = [],
context = ""
}) {
logger.table("Processing request with OpenAI Compatible provider", {
model: action.model || this.defaultModel
});
const prompt = preparePrompt(action.prompt, text, context);
logger.debug("Querying prompt", prompt);
const messages = [
action.system && {
role: "system",
content: action.system
},
!images.length && {
role: "user",
content: prompt
},
images.length && {
role: "user",
content: [
{
type: "text",
text: prompt
},
...images.map((image) => ({
type: "image_url",
image_url: {
url: `data:image/jpeg;base64,${image}`
}
}))
]
}
].filter(Boolean);
const requestBody = {
stream: true,
model: action.model || this.defaultModel,
temperature: options.temperature,
messages
};
const url = `${this.url.replace(/\/+$/i, "")}/v1/chat/completions`;
return new Promise((resolve, reject) => {
if (this.abortController.signal.aborted) {
return reject();
}
let combined = "";
const requestHandler = RequestHandler.getInstance();
const headers = {
"Content-Type": "application/json"
};
if (this.apiKey) {
headers["Authorization"] = `Bearer ${this.apiKey}`;
}
requestHandler.makeRequest(
{
method: "POST",
url,
headers,
body: JSON.stringify(requestBody),
abortController: this.abortController
},
{
onData: (chunk) => {
var _a2, _b;
if (this.abortController.signal.aborted) {
return reject();
}
const lines = chunk.split("\n").filter((line) => line.trim() !== "");
for (const line of lines) {
const message = line.replace(/^data: /, "");
if (message === "[DONE]") {
break;
}
try {
const parsed = JSON.parse(message);
combined += ((_b = (_a2 = parsed.choices[0]) == null ? void 0 : _a2.delta) == null ? void 0 : _b.content) || "";
this.onUpdate(combined);
} catch (error) {
console.error(
"Could not JSON parse stream message",
message,
error
);
}
}
},
onError: (error) => {
if (this.abortController.signal.aborted) {
return reject();
}
(0, import_obsidian3.requestUrl)({
url,
method: "POST",
body: JSON.stringify({
...requestBody,
stream: false
})
}).then(
({ json }) => resolve(json.choices[0].message.content)
).catch(reject);
},
onEnd: () => {
this.abortController.signal.aborted ? reject() : resolve(combined);
}
}
);
this.abortController.signal.addEventListener("abort", () => {
reject();
});
});
}
async getEmbeddings(texts, updateProgress) {
logger.info("Getting embeddings for texts");
const results = [];
for (const text of texts) {
if (this.abortController.signal.aborted) {
return results;
}
try {
logger.table("OpenAI-like embeddings request", text);
const { json } = await (0, import_obsidian3.requestUrl)({
url: `${this.url.replace(/\/+$/i, "")}/v1/embeddings`,
method: "POST",
body: JSON.stringify({
input: [text],
model: this.embeddingModel
})
});
logger.debug("OpenAI compatible embeddings", {
embedding: json.data[0].embedding
});
results.push(json.data[0].embedding);
updateProgress(1);
} catch (error) {
console.error("Error getting embedding:", { error });
throw error;
}
}
logger.debug("OpenAI compatible embeddings results", results);
return results;
}
static async getModels(providerConfig) {
logger.debug("Fetching OpenAI Compatible models");
const { json } = await (0, import_obsidian3.requestUrl)({
url: `${providerConfig.url.replace(/\/+$/i, "")}/v1/models`,
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${providerConfig.apiKey}`
}
});
if (!json.data || json.data.length === 0) {
logger.warn("No OpenAI Compatible models found");
return Promise.reject("No models found");
}
return json.data.reduce(
(acc, el) => {
const name = el.id;
acc[name] = name;
return acc;
},
{}
);
}
};
// src/rag.ts
var import_obsidian4 = require("obsidian");
// node_modules/langchain/node_modules/@langchain/core/dist/documents/document.js
var Document = class {
constructor(fields) {
var _a2;
Object.defineProperty(this, "pageContent", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "metadata", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
this.pageContent = fields.pageContent ? fields.pageContent.toString() : this.pageContent;
this.metadata = (_a2 = fields.metadata) != null ? _a2 : {};
}
};
// node_modules/langchain/node_modules/@langchain/core/dist/runnables/base.js
var import_p_retry3 = __toESM(require_p_retry(), 1);
// node_modules/uuid/dist/esm-browser/rng.js
var getRandomValues;
var rnds8 = new Uint8Array(16);
function rng() {
if (!getRandomValues) {
getRandomValues = typeof crypto !== "undefined" && crypto.getRandomValues && crypto.getRandomValues.bind(crypto);
if (!getRandomValues) {
throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");
}
}
return getRandomValues(rnds8);
}
// node_modules/uuid/dist/esm-browser/regex.js
var regex_default = /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;
// node_modules/uuid/dist/esm-browser/validate.js
function validate(uuid) {
return typeof uuid === "string" && regex_default.test(uuid);
}
var validate_default = validate;
// node_modules/uuid/dist/esm-browser/stringify.js
var byteToHex = [];
for (let i = 0; i < 256; ++i) {
byteToHex.push((i + 256).toString(16).slice(1));
}
function unsafeStringify(arr, offset = 0) {
return byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + "-" + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + "-" + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + "-" + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + "-" + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]];
}
// node_modules/uuid/dist/esm-browser/native.js
var randomUUID = typeof crypto !== "undefined" && crypto.randomUUID && crypto.randomUUID.bind(crypto);
var native_default = {
randomUUID
};
// node_modules/uuid/dist/esm-browser/v4.js
function v4(options, buf, offset) {
if (native_default.randomUUID && !buf && !options) {
return native_default.randomUUID();
}
options = options || {};
const rnds = options.random || (options.rng || rng)();
rnds[6] = rnds[6] & 15 | 64;
rnds[8] = rnds[8] & 63 | 128;
if (buf) {
offset = offset || 0;
for (let i = 0; i < 16; ++i) {
buf[offset + i] = rnds[i];
}
return buf;
}
return unsafeStringify(rnds);
}
var v4_default = v4;
// node_modules/langchain/node_modules/@langchain/core/dist/load/map_keys.js
var import_decamelize = __toESM(require_decamelize(), 1);
var import_camelcase = __toESM(require_camelcase(), 1);
function keyToJson(key, map) {
return (map == null ? void 0 : map[key]) || (0, import_decamelize.default)(key);
}
function mapKeys(fields, mapper, map) {
const mapped = {};
for (const key in fields) {
if (Object.hasOwn(fields, key)) {
mapped[mapper(key, map)] = fields[key];
}
}
return mapped;
}
// node_modules/langchain/node_modules/@langchain/core/dist/load/serializable.js
function shallowCopy(obj) {
return Array.isArray(obj) ? [...obj] : { ...obj };
}
function replaceSecrets(root, secretsMap) {
const result = shallowCopy(root);
for (const [path, secretId] of Object.entries(secretsMap)) {
const [last, ...partsReverse] = path.split(".").reverse();
let current = result;
for (const part of partsReverse.reverse()) {
if (current[part] === void 0) {
break;
}
current[part] = shallowCopy(current[part]);
current = current[part];
}
if (current[last] !== void 0) {
current[last] = {
lc: 1,
type: "secret",
id: [secretId]
};
}
}
return result;
}
function get_lc_unique_name(serializableClass) {
const parentClass = Object.getPrototypeOf(serializableClass);
const lcNameIsSubclassed = typeof serializableClass.lc_name === "function" && (typeof parentClass.lc_name !== "function" || serializableClass.lc_name() !== parentClass.lc_name());
if (lcNameIsSubclassed) {
return serializableClass.lc_name();
} else {
return serializableClass.name;
}
}
var Serializable = class {
/**
* The name of the serializable. Override to provide an alias or
* to preserve the serialized module name in minified environments.
*
* Implemented as a static method to support loading logic.
*/
static lc_name() {
return this.name;
}
/**
* The final serialized identifier for the module.
*/
get lc_id() {
return [
...this.lc_namespace,
get_lc_unique_name(this.constructor)
];
}
/**
* A map of secrets, which will be omitted from serialization.
* Keys are paths to the secret in constructor args, e.g. "foo.bar.baz".
* Values are the secret ids, which will be used when deserializing.
*/
get lc_secrets() {
return void 0;
}
/**
* A map of additional attributes to merge with constructor args.
* Keys are the attribute names, e.g. "foo".
* Values are the attribute values, which will be serialized.
* These attributes need to be accepted by the constructor as arguments.
*/
get lc_attributes() {
return void 0;
}
/**
* A map of aliases for constructor args.
* Keys are the attribute names, e.g. "foo".
* Values are the alias that will replace the key in serialization.
* This is used to eg. make argument names match Python.
*/
get lc_aliases() {
return void 0;
}
constructor(kwargs, ..._args) {
Object.defineProperty(this, "lc_serializable", {
enumerable: true,
configurable: true,
writable: true,
value: false
});
Object.defineProperty(this, "lc_kwargs", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
this.lc_kwargs = kwargs || {};
}
toJSON() {
if (!this.lc_serializable) {
return this.toJSONNotImplemented();
}
if (
// eslint-disable-next-line no-instanceof/no-instanceof
this.lc_kwargs instanceof Serializable || typeof this.lc_kwargs !== "object" || Array.isArray(this.lc_kwargs)
) {
return this.toJSONNotImplemented();
}
const aliases = {};
const secrets = {};
const kwargs = Object.keys(this.lc_kwargs).reduce((acc, key) => {
acc[key] = key in this ? this[key] : this.lc_kwargs[key];
return acc;
}, {});
for (let current = Object.getPrototypeOf(this); current; current = Object.getPrototypeOf(current)) {
Object.assign(aliases, Reflect.get(current, "lc_aliases", this));
Object.assign(secrets, Reflect.get(current, "lc_secrets", this));
Object.assign(kwargs, Reflect.get(current, "lc_attributes", this));
}
Object.keys(secrets).forEach((keyPath) => {
let read = this;
let write = kwargs;
const [last, ...partsReverse] = keyPath.split(".").reverse();
for (const key of partsReverse.reverse()) {
if (!(key in read) || read[key] === void 0)
return;
if (!(key in write) || write[key] === void 0) {
if (typeof read[key] === "object" && read[key] != null) {
write[key] = {};
} else if (Array.isArray(read[key])) {
write[key] = [];
}
}
read = read[key];
write = write[key];
}
if (last in read && read[last] !== void 0) {
write[last] = write[last] || read[last];
}
});
return {
lc: 1,
type: "constructor",
id: this.lc_id,
kwargs: mapKeys(Object.keys(secrets).length ? replaceSecrets(kwargs, secrets) : kwargs, keyToJson, aliases)
};
}
toJSONNotImplemented() {
return {
lc: 1,
type: "not_implemented",
id: this.lc_id
};
}
};
// node_modules/langchain/node_modules/@langchain/core/dist/callbacks/base.js
var BaseCallbackHandlerMethodsClass = class {
};
var BaseCallbackHandler = class extends BaseCallbackHandlerMethodsClass {
get lc_namespace() {
return ["langchain_core", "callbacks", this.name];
}
get lc_secrets() {
return void 0;
}
get lc_attributes() {
return void 0;
}
get lc_aliases() {
return void 0;
}
/**
* The name of the serializable. Override to provide an alias or
* to preserve the serialized module name in minified environments.
*
* Implemented as a static method to support loading logic.
*/
static lc_name() {
return this.name;
}
/**
* The final serialized identifier for the module.
*/
get lc_id() {
return [
...this.lc_namespace,
get_lc_unique_name(this.constructor)
];
}
constructor(input) {
var _a2, _b, _c, _d, _e;
super();
Object.defineProperty(this, "lc_serializable", {
enumerable: true,
configurable: true,
writable: true,
value: false
});
Object.defineProperty(this, "lc_kwargs", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "ignoreLLM", {
enumerable: true,
configurable: true,
writable: true,
value: false
});
Object.defineProperty(this, "ignoreChain", {
enumerable: true,
configurable: true,
writable: true,
value: false
});
Object.defineProperty(this, "ignoreAgent", {
enumerable: true,
configurable: true,
writable: true,
value: false
});
Object.defineProperty(this, "ignoreRetriever", {
enumerable: true,
configurable: true,
writable: true,
value: false
});
Object.defineProperty(this, "awaitHandlers", {
enumerable: true,
configurable: true,
writable: true,
value: typeof process !== "undefined" ? (
// eslint-disable-next-line no-process-env
((_a2 = process.env) == null ? void 0 : _a2.LANGCHAIN_CALLBACKS_BACKGROUND) !== "true"
) : true
});
this.lc_kwargs = input || {};
if (input) {
this.ignoreLLM = (_b = input.ignoreLLM) != null ? _b : this.ignoreLLM;
this.ignoreChain = (_c = input.ignoreChain) != null ? _c : this.ignoreChain;
this.ignoreAgent = (_d = input.ignoreAgent) != null ? _d : this.ignoreAgent;
this.ignoreRetriever = (_e = input.ignoreRetriever) != null ? _e : this.ignoreRetriever;
}
}
copy() {
return new this.constructor(this);
}
toJSON() {
return Serializable.prototype.toJSON.call(this);
}
toJSONNotImplemented() {
return Serializable.prototype.toJSONNotImplemented.call(this);
}
static fromMethods(methods) {
class Handler extends BaseCallbackHandler {
constructor() {
super();
Object.defineProperty(this, "name", {
enumerable: true,
configurable: true,
writable: true,
value: v4_default()
});
Object.assign(this, methods);
}
}
return new Handler();
}
};
// node_modules/langchain/node_modules/@langchain/core/dist/tracers/console.js
var import_ansi_styles = __toESM(require_ansi_styles(), 1);
// node_modules/langchain/node_modules/@langchain/core/dist/tracers/base.js
function _coerceToDict(value, defaultKey) {
return value && !Array.isArray(value) && typeof value === "object" ? value : { [defaultKey]: value };
}
var BaseTracer = class extends BaseCallbackHandler {
constructor(_fields) {
super(...arguments);
Object.defineProperty(this, "runMap", {
enumerable: true,
configurable: true,
writable: true,
value: /* @__PURE__ */ new Map()
});
}
copy() {
return this;
}
_addChildRun(parentRun, childRun) {
parentRun.child_runs.push(childRun);
}
async _startTrace(run) {
var _a2;
if (run.parent_run_id !== void 0) {
const parentRun = this.runMap.get(run.parent_run_id);
if (parentRun) {
this._addChildRun(parentRun, run);
parentRun.child_execution_order = Math.max(parentRun.child_execution_order, run.child_execution_order);
}
}
this.runMap.set(run.id, run);
await ((_a2 = this.onRunCreate) == null ? void 0 : _a2.call(this, run));
}
async _endTrace(run) {
var _a2;
const parentRun = run.parent_run_id !== void 0 && this.runMap.get(run.parent_run_id);
if (parentRun) {
parentRun.child_execution_order = Math.max(parentRun.child_execution_order, run.child_execution_order);
} else {
await this.persistRun(run);
}
this.runMap.delete(run.id);
await ((_a2 = this.onRunUpdate) == null ? void 0 : _a2.call(this, run));
}
_getExecutionOrder(parentRunId) {
const parentRun = parentRunId !== void 0 && this.runMap.get(parentRunId);
if (!parentRun) {
return 1;
}
return parentRun.child_execution_order + 1;
}
async handleLLMStart(llm, prompts, runId, parentRunId, extraParams, tags, metadata, name) {
var _a2;
const execution_order = this._getExecutionOrder(parentRunId);
const start_time = Date.now();
const finalExtraParams = metadata ? { ...extraParams, metadata } : extraParams;
const run = {
id: runId,
name: name != null ? name : llm.id[llm.id.length - 1],
parent_run_id: parentRunId,
start_time,
serialized: llm,
events: [
{
name: "start",
time: new Date(start_time).toISOString()
}
],
inputs: { prompts },
execution_order,
child_runs: [],
child_execution_order: execution_order,
run_type: "llm",
extra: finalExtraParams != null ? finalExtraParams : {},
tags: tags || []
};
await this._startTrace(run);
await ((_a2 = this.onLLMStart) == null ? void 0 : _a2.call(this, run));
return run;
}
async handleChatModelStart(llm, messages, runId, parentRunId, extraParams, tags, metadata, name) {
var _a2;
const execution_order = this._getExecutionOrder(parentRunId);
const start_time = Date.now();
const finalExtraParams = metadata ? { ...extraParams, metadata } : extraParams;
const run = {
id: runId,
name: name != null ? name : llm.id[llm.id.length - 1],
parent_run_id: parentRunId,
start_time,
serialized: llm,
events: [
{
name: "start",
time: new Date(start_time).toISOString()
}
],
inputs: { messages },
execution_order,
child_runs: [],
child_execution_order: execution_order,
run_type: "llm",
extra: finalExtraParams != null ? finalExtraParams : {},
tags: tags || []
};
await this._startTrace(run);
await ((_a2 = this.onLLMStart) == null ? void 0 : _a2.call(this, run));
return run;
}
async handleLLMEnd(output, runId) {
var _a2;
const run = this.runMap.get(runId);
if (!run || (run == null ? void 0 : run.run_type) !== "llm") {
throw new Error("No LLM run to end.");
}
run.end_time = Date.now();
run.outputs = output;
run.events.push({
name: "end",
time: new Date(run.end_time).toISOString()
});
await ((_a2 = this.onLLMEnd) == null ? void 0 : _a2.call(this, run));
await this._endTrace(run);
return run;
}
async handleLLMError(error, runId) {
var _a2;
const run = this.runMap.get(runId);
if (!run || (run == null ? void 0 : run.run_type) !== "llm") {
throw new Error("No LLM run to end.");
}
run.end_time = Date.now();
run.error = error.message;
run.events.push({
name: "error",
time: new Date(run.end_time).toISOString()
});
await ((_a2 = this.onLLMError) == null ? void 0 : _a2.call(this, run));
await this._endTrace(run);
return run;
}
async handleChainStart(chain, inputs, runId, parentRunId, tags, metadata, runType, name) {
var _a2;
const execution_order = this._getExecutionOrder(parentRunId);
const start_time = Date.now();
const run = {
id: runId,
name: name != null ? name : chain.id[chain.id.length - 1],
parent_run_id: parentRunId,
start_time,
serialized: chain,
events: [
{
name: "start",
time: new Date(start_time).toISOString()
}
],
inputs,
execution_order,
child_execution_order: execution_order,
run_type: runType != null ? runType : "chain",
child_runs: [],
extra: metadata ? { metadata } : {},
tags: tags || []
};
await this._startTrace(run);
await ((_a2 = this.onChainStart) == null ? void 0 : _a2.call(this, run));
return run;
}
async handleChainEnd(outputs, runId, _parentRunId, _tags, kwargs) {
var _a2;
const run = this.runMap.get(runId);
if (!run) {
throw new Error("No chain run to end.");
}
run.end_time = Date.now();
run.outputs = _coerceToDict(outputs, "output");
run.events.push({
name: "end",
time: new Date(run.end_time).toISOString()
});
if ((kwargs == null ? void 0 : kwargs.inputs) !== void 0) {
run.inputs = _coerceToDict(kwargs.inputs, "input");
}
await ((_a2 = this.onChainEnd) == null ? void 0 : _a2.call(this, run));
await this._endTrace(run);
return run;
}
async handleChainError(error, runId, _parentRunId, _tags, kwargs) {
var _a2;
const run = this.runMap.get(runId);
if (!run) {
throw new Error("No chain run to end.");
}
run.end_time = Date.now();
run.error = error.message;
run.events.push({
name: "error",
time: new Date(run.end_time).toISOString()
});
if ((kwargs == null ? void 0 : kwargs.inputs) !== void 0) {
run.inputs = _coerceToDict(kwargs.inputs, "input");
}
await ((_a2 = this.onChainError) == null ? void 0 : _a2.call(this, run));
await this._endTrace(run);
return run;
}
async handleToolStart(tool, input, runId, parentRunId, tags, metadata, name) {
var _a2;
const execution_order = this._getExecutionOrder(parentRunId);
const start_time = Date.now();
const run = {
id: runId,
name: name != null ? name : tool.id[tool.id.length - 1],
parent_run_id: parentRunId,
start_time,
serialized: tool,
events: [
{
name: "start",
time: new Date(start_time).toISOString()
}
],
inputs: { input },
execution_order,
child_execution_order: execution_order,
run_type: "tool",
child_runs: [],
extra: metadata ? { metadata } : {},
tags: tags || []
};
await this._startTrace(run);
await ((_a2 = this.onToolStart) == null ? void 0 : _a2.call(this, run));
return run;
}
async handleToolEnd(output, runId) {
var _a2;
const run = this.runMap.get(runId);
if (!run || (run == null ? void 0 : run.run_type) !== "tool") {
throw new Error("No tool run to end");
}
run.end_time = Date.now();
run.outputs = { output };
run.events.push({
name: "end",
time: new Date(run.end_time).toISOString()
});
await ((_a2 = this.onToolEnd) == null ? void 0 : _a2.call(this, run));
await this._endTrace(run);
return run;
}
async handleToolError(error, runId) {
var _a2;
const run = this.runMap.get(runId);
if (!run || (run == null ? void 0 : run.run_type) !== "tool") {
throw new Error("No tool run to end");
}
run.end_time = Date.now();
run.error = error.message;
run.events.push({
name: "error",
time: new Date(run.end_time).toISOString()
});
await ((_a2 = this.onToolError) == null ? void 0 : _a2.call(this, run));
await this._endTrace(run);
return run;
}
async handleAgentAction(action, runId) {
var _a2;
const run = this.runMap.get(runId);
if (!run || (run == null ? void 0 : run.run_type) !== "chain") {
return;
}
const agentRun = run;
agentRun.actions = agentRun.actions || [];
agentRun.actions.push(action);
agentRun.events.push({
name: "agent_action",
time: new Date().toISOString(),
kwargs: { action }
});
await ((_a2 = this.onAgentAction) == null ? void 0 : _a2.call(this, run));
}
async handleAgentEnd(action, runId) {
var _a2;
const run = this.runMap.get(runId);
if (!run || (run == null ? void 0 : run.run_type) !== "chain") {
return;
}
run.events.push({
name: "agent_end",
time: new Date().toISOString(),
kwargs: { action }
});
await ((_a2 = this.onAgentEnd) == null ? void 0 : _a2.call(this, run));
}
async handleRetrieverStart(retriever, query, runId, parentRunId, tags, metadata, name) {
var _a2;
const execution_order = this._getExecutionOrder(parentRunId);
const start_time = Date.now();
const run = {
id: runId,
name: name != null ? name : retriever.id[retriever.id.length - 1],
parent_run_id: parentRunId,
start_time,
serialized: retriever,
events: [
{
name: "start",
time: new Date(start_time).toISOString()
}
],
inputs: { query },
execution_order,
child_execution_order: execution_order,
run_type: "retriever",
child_runs: [],
extra: metadata ? { metadata } : {},
tags: tags || []
};
await this._startTrace(run);
await ((_a2 = this.onRetrieverStart) == null ? void 0 : _a2.call(this, run));
return run;
}
async handleRetrieverEnd(documents, runId) {
var _a2;
const run = this.runMap.get(runId);
if (!run || (run == null ? void 0 : run.run_type) !== "retriever") {
throw new Error("No retriever run to end");
}
run.end_time = Date.now();
run.outputs = { documents };
run.events.push({
name: "end",
time: new Date(run.end_time).toISOString()
});
await ((_a2 = this.onRetrieverEnd) == null ? void 0 : _a2.call(this, run));
await this._endTrace(run);
return run;
}
async handleRetrieverError(error, runId) {
var _a2;
const run = this.runMap.get(runId);
if (!run || (run == null ? void 0 : run.run_type) !== "retriever") {
throw new Error("No retriever run to end");
}
run.end_time = Date.now();
run.error = error.message;
run.events.push({
name: "error",
time: new Date(run.end_time).toISOString()
});
await ((_a2 = this.onRetrieverError) == null ? void 0 : _a2.call(this, run));
await this._endTrace(run);
return run;
}
async handleText(text, runId) {
var _a2;
const run = this.runMap.get(runId);
if (!run || (run == null ? void 0 : run.run_type) !== "chain") {
return;
}
run.events.push({
name: "text",
time: new Date().toISOString(),
kwargs: { text }
});
await ((_a2 = this.onText) == null ? void 0 : _a2.call(this, run));
}
async handleLLMNewToken(token, idx, runId, _parentRunId, _tags, fields) {
var _a2;
const run = this.runMap.get(runId);
if (!run || (run == null ? void 0 : run.run_type) !== "llm") {
throw new Error(`Invalid "runId" provided to "handleLLMNewToken" callback.`);
}
run.events.push({
name: "new_token",
time: new Date().toISOString(),
kwargs: { token, idx, chunk: fields == null ? void 0 : fields.chunk }
});
await ((_a2 = this.onLLMNewToken) == null ? void 0 : _a2.call(this, run, token));
return run;
}
};
// node_modules/langchain/node_modules/@langchain/core/dist/tracers/console.js
function wrap(style, text) {
return `${style.open}${text}${style.close}`;
}
function tryJsonStringify(obj, fallback) {
try {
return JSON.stringify(obj, null, 2);
} catch (err) {
return fallback;
}
}
function elapsed(run) {
if (!run.end_time)
return "";
const elapsed2 = run.end_time - run.start_time;
if (elapsed2 < 1e3) {
return `${elapsed2}ms`;
}
return `${(elapsed2 / 1e3).toFixed(2)}s`;
}
var { color } = import_ansi_styles.default;
var ConsoleCallbackHandler = class extends BaseTracer {
constructor() {
super(...arguments);
Object.defineProperty(this, "name", {
enumerable: true,
configurable: true,
writable: true,
value: "console_callback_handler"
});
}
/**
* Method used to persist the run. In this case, it simply returns a
* resolved promise as there's no persistence logic.
* @param _run The run to persist.
* @returns A resolved promise.
*/
persistRun(_run) {
return Promise.resolve();
}
// utility methods
/**
* Method used to get all the parent runs of a given run.
* @param run The run whose parents are to be retrieved.
* @returns An array of parent runs.
*/
getParents(run) {
const parents = [];
let currentRun = run;
while (currentRun.parent_run_id) {
const parent = this.runMap.get(currentRun.parent_run_id);
if (parent) {
parents.push(parent);
currentRun = parent;
} else {
break;
}
}
return parents;
}
/**
* Method used to get a string representation of the run's lineage, which
* is used in logging.
* @param run The run whose lineage is to be retrieved.
* @returns A string representation of the run's lineage.
*/
getBreadcrumbs(run) {
const parents = this.getParents(run).reverse();
const string = [...parents, run].map((parent, i, arr) => {
const name = `${parent.execution_order}:${parent.run_type}:${parent.name}`;
return i === arr.length - 1 ? wrap(import_ansi_styles.default.bold, name) : name;
}).join(" > ");
return wrap(color.grey, string);
}
// logging methods
/**
* Method used to log the start of a chain run.
* @param run The chain run that has started.
* @returns void
*/
onChainStart(run) {
const crumbs = this.getBreadcrumbs(run);
console.log(`${wrap(color.green, "[chain/start]")} [${crumbs}] Entering Chain run with input: ${tryJsonStringify(run.inputs, "[inputs]")}`);
}
/**
* Method used to log the end of a chain run.
* @param run The chain run that has ended.
* @returns void
*/
onChainEnd(run) {
const crumbs = this.getBreadcrumbs(run);
console.log(`${wrap(color.cyan, "[chain/end]")} [${crumbs}] [${elapsed(run)}] Exiting Chain run with output: ${tryJsonStringify(run.outputs, "[outputs]")}`);
}
/**
* Method used to log any errors of a chain run.
* @param run The chain run that has errored.
* @returns void
*/
onChainError(run) {
const crumbs = this.getBreadcrumbs(run);
console.log(`${wrap(color.red, "[chain/error]")} [${crumbs}] [${elapsed(run)}] Chain run errored with error: ${tryJsonStringify(run.error, "[error]")}`);
}
/**
* Method used to log the start of an LLM run.
* @param run The LLM run that has started.
* @returns void
*/
onLLMStart(run) {
const crumbs = this.getBreadcrumbs(run);
const inputs = "prompts" in run.inputs ? { prompts: run.inputs.prompts.map((p) => p.trim()) } : run.inputs;
console.log(`${wrap(color.green, "[llm/start]")} [${crumbs}] Entering LLM run with input: ${tryJsonStringify(inputs, "[inputs]")}`);
}
/**
* Method used to log the end of an LLM run.
* @param run The LLM run that has ended.
* @returns void
*/
onLLMEnd(run) {
const crumbs = this.getBreadcrumbs(run);
console.log(`${wrap(color.cyan, "[llm/end]")} [${crumbs}] [${elapsed(run)}] Exiting LLM run with output: ${tryJsonStringify(run.outputs, "[response]")}`);
}
/**
* Method used to log any errors of an LLM run.
* @param run The LLM run that has errored.
* @returns void
*/
onLLMError(run) {
const crumbs = this.getBreadcrumbs(run);
console.log(`${wrap(color.red, "[llm/error]")} [${crumbs}] [${elapsed(run)}] LLM run errored with error: ${tryJsonStringify(run.error, "[error]")}`);
}
/**
* Method used to log the start of a tool run.
* @param run The tool run that has started.
* @returns void
*/
onToolStart(run) {
var _a2;
const crumbs = this.getBreadcrumbs(run);
console.log(`${wrap(color.green, "[tool/start]")} [${crumbs}] Entering Tool run with input: "${(_a2 = run.inputs.input) == null ? void 0 : _a2.trim()}"`);
}
/**
* Method used to log the end of a tool run.
* @param run The tool run that has ended.
* @returns void
*/
onToolEnd(run) {
var _a2, _b;
const crumbs = this.getBreadcrumbs(run);
console.log(`${wrap(color.cyan, "[tool/end]")} [${crumbs}] [${elapsed(run)}] Exiting Tool run with output: "${(_b = (_a2 = run.outputs) == null ? void 0 : _a2.output) == null ? void 0 : _b.trim()}"`);
}
/**
* Method used to log any errors of a tool run.
* @param run The tool run that has errored.
* @returns void
*/
onToolError(run) {
const crumbs = this.getBreadcrumbs(run);
console.log(`${wrap(color.red, "[tool/error]")} [${crumbs}] [${elapsed(run)}] Tool run errored with error: ${tryJsonStringify(run.error, "[error]")}`);
}
/**
* Method used to log the start of a retriever run.
* @param run The retriever run that has started.
* @returns void
*/
onRetrieverStart(run) {
const crumbs = this.getBreadcrumbs(run);
console.log(`${wrap(color.green, "[retriever/start]")} [${crumbs}] Entering Retriever run with input: ${tryJsonStringify(run.inputs, "[inputs]")}`);
}
/**
* Method used to log the end of a retriever run.
* @param run The retriever run that has ended.
* @returns void
*/
onRetrieverEnd(run) {
const crumbs = this.getBreadcrumbs(run);
console.log(`${wrap(color.cyan, "[retriever/end]")} [${crumbs}] [${elapsed(run)}] Exiting Retriever run with output: ${tryJsonStringify(run.outputs, "[outputs]")}`);
}
/**
* Method used to log any errors of a retriever run.
* @param run The retriever run that has errored.
* @returns void
*/
onRetrieverError(run) {
const crumbs = this.getBreadcrumbs(run);
console.log(`${wrap(color.red, "[retriever/error]")} [${crumbs}] [${elapsed(run)}] Retriever run errored with error: ${tryJsonStringify(run.error, "[error]")}`);
}
/**
* Method used to log the action selected by the agent.
* @param run The run in which the agent action occurred.
* @returns void
*/
onAgentAction(run) {
const agentRun = run;
const crumbs = this.getBreadcrumbs(run);
console.log(`${wrap(color.blue, "[agent/action]")} [${crumbs}] Agent selected action: ${tryJsonStringify(agentRun.actions[agentRun.actions.length - 1], "[action]")}`);
}
};
// node_modules/langsmith/dist/utils/async_caller.js
var import_p_retry = __toESM(require_p_retry(), 1);
var import_p_queue = __toESM(require_dist(), 1);
var STATUS_NO_RETRY = [
400,
401,
403,
404,
405,
406,
407,
408
// Request Timeout
];
var STATUS_IGNORE = [
409
// Conflict
];
var AsyncCaller = class {
constructor(params) {
var _a2, _b;
Object.defineProperty(this, "maxConcurrency", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "maxRetries", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "queue", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
this.maxConcurrency = (_a2 = params.maxConcurrency) != null ? _a2 : Infinity;
this.maxRetries = (_b = params.maxRetries) != null ? _b : 6;
const PQueue = "default" in import_p_queue.default ? import_p_queue.default.default : import_p_queue.default;
this.queue = new PQueue({ concurrency: this.maxConcurrency });
}
// eslint-disable-next-line @typescript-eslint/no-explicit-any
call(callable, ...args) {
return this.queue.add(() => (0, import_p_retry.default)(() => callable(...args).catch((error) => {
if (error instanceof Error) {
throw error;
} else {
throw new Error(error);
}
}), {
onFailedAttempt(error) {
var _a2;
if (error.message.startsWith("Cancel") || error.message.startsWith("TimeoutError") || error.message.startsWith("AbortError")) {
throw error;
}
if ((error == null ? void 0 : error.code) === "ECONNABORTED") {
throw error;
}
const status = (_a2 = error == null ? void 0 : error.response) == null ? void 0 : _a2.status;
if (status) {
if (STATUS_NO_RETRY.includes(+status)) {
throw error;
} else if (STATUS_IGNORE.includes(+status)) {
return;
}
}
},
// If needed we can change some of the defaults here,
// but they're quite sensible.
retries: this.maxRetries,
randomize: true
}), { throwOnTimeout: true });
}
// eslint-disable-next-line @typescript-eslint/no-explicit-any
callWithOptions(options, callable, ...args) {
if (options.signal) {
return Promise.race([
this.call(callable, ...args),
new Promise((_, reject) => {
var _a2;
(_a2 = options.signal) == null ? void 0 : _a2.addEventListener("abort", () => {
reject(new Error("AbortError"));
});
})
]);
}
return this.call(callable, ...args);
}
fetch(...args) {
return this.call(() => fetch(...args).then((res) => res.ok ? res : Promise.reject(res)));
}
};
// node_modules/langsmith/dist/utils/messages.js
function isLangChainMessage(message) {
return typeof (message == null ? void 0 : message._getType) === "function";
}
function convertLangChainMessageToExample(message) {
const converted = {
type: message._getType(),
data: { content: message.content }
};
if ((message == null ? void 0 : message.additional_kwargs) && Object.keys(message.additional_kwargs).length > 0) {
converted.data.additional_kwargs = { ...message.additional_kwargs };
}
return converted;
}
// node_modules/langsmith/dist/utils/env.js
var globalEnv;
var isBrowser = () => typeof window !== "undefined" && typeof window.document !== "undefined";
var isWebWorker = () => typeof globalThis === "object" && globalThis.constructor && globalThis.constructor.name === "DedicatedWorkerGlobalScope";
var isJsDom = () => typeof window !== "undefined" && window.name === "nodejs" || typeof navigator !== "undefined" && (navigator.userAgent.includes("Node.js") || navigator.userAgent.includes("jsdom"));
var isDeno = () => typeof Deno !== "undefined";
var isNode = () => typeof process !== "undefined" && typeof process.versions !== "undefined" && typeof process.versions.node !== "undefined" && !isDeno();
var getEnv = () => {
if (globalEnv) {
return globalEnv;
}
if (isBrowser()) {
globalEnv = "browser";
} else if (isNode()) {
globalEnv = "node";
} else if (isWebWorker()) {
globalEnv = "webworker";
} else if (isJsDom()) {
globalEnv = "jsdom";
} else if (isDeno()) {
globalEnv = "deno";
} else {
globalEnv = "other";
}
return globalEnv;
};
var runtimeEnvironment;
async function getRuntimeEnvironment() {
if (runtimeEnvironment === void 0) {
const env = getEnv();
const releaseEnv = getShas();
runtimeEnvironment = {
library: "langsmith",
runtime: env,
sdk: "langsmith-js",
sdk_version: __version__,
...releaseEnv
};
}
return runtimeEnvironment;
}
function getLangChainEnvVarsMetadata() {
const allEnvVars = getEnvironmentVariables() || {};
const envVars = {};
const excluded = [
"LANGCHAIN_API_KEY",
"LANGCHAIN_ENDPOINT",
"LANGCHAIN_TRACING_V2",
"LANGCHAIN_PROJECT",
"LANGCHAIN_SESSION"
];
for (const [key, value] of Object.entries(allEnvVars)) {
if (key.startsWith("LANGCHAIN_") && typeof value === "string" && !excluded.includes(key) && !key.toLowerCase().includes("key") && !key.toLowerCase().includes("secret") && !key.toLowerCase().includes("token")) {
if (key === "LANGCHAIN_REVISION_ID") {
envVars["revision_id"] = value;
} else {
envVars[key] = value;
}
}
}
return envVars;
}
function getEnvironmentVariables() {
try {
if (typeof process !== "undefined" && process.env) {
return Object.entries(process.env).reduce((acc, [key, value]) => {
acc[key] = String(value);
return acc;
}, {});
}
return void 0;
} catch (e) {
return void 0;
}
}
function getEnvironmentVariable(name) {
var _a2;
try {
return typeof process !== "undefined" ? (
// eslint-disable-next-line no-process-env
(_a2 = process.env) == null ? void 0 : _a2[name]
) : void 0;
} catch (e) {
return void 0;
}
}
var cachedCommitSHAs;
function getShas() {
if (cachedCommitSHAs !== void 0) {
return cachedCommitSHAs;
}
const common_release_envs = [
"VERCEL_GIT_COMMIT_SHA",
"NEXT_PUBLIC_VERCEL_GIT_COMMIT_SHA",
"COMMIT_REF",
"RENDER_GIT_COMMIT",
"CI_COMMIT_SHA",
"CIRCLE_SHA1",
"CF_PAGES_COMMIT_SHA",
"REACT_APP_GIT_SHA",
"SOURCE_VERSION",
"GITHUB_SHA",
"TRAVIS_COMMIT",
"GIT_COMMIT",
"BUILD_VCS_NUMBER",
"bamboo_planRepository_revision",
"Build.SourceVersion",
"BITBUCKET_COMMIT",
"DRONE_COMMIT_SHA",
"SEMAPHORE_GIT_SHA",
"BUILDKITE_COMMIT"
];
const shas = {};
for (const env of common_release_envs) {
const envVar = getEnvironmentVariable(env);
if (envVar !== void 0) {
shas[env] = envVar;
}
}
cachedCommitSHAs = shas;
return shas;
}
// node_modules/langsmith/dist/client.js
async function mergeRuntimeEnvIntoRunCreates(runs) {
const runtimeEnv = await getRuntimeEnvironment();
const envVars = getLangChainEnvVarsMetadata();
return runs.map((run) => {
var _a2, _b;
const extra = (_a2 = run.extra) != null ? _a2 : {};
const metadata = extra.metadata;
run.extra = {
...extra,
runtime: {
...runtimeEnv,
...extra == null ? void 0 : extra.runtime
},
metadata: {
...envVars,
...envVars.revision_id || run.revision_id ? { revision_id: (_b = run.revision_id) != null ? _b : envVars.revision_id } : {},
...metadata
}
};
return run;
});
}
var getTracingSamplingRate = () => {
const samplingRateStr = getEnvironmentVariable("LANGCHAIN_TRACING_SAMPLING_RATE");
if (samplingRateStr === void 0) {
return void 0;
}
const samplingRate = parseFloat(samplingRateStr);
if (samplingRate < 0 || samplingRate > 1) {
throw new Error(`LANGCHAIN_TRACING_SAMPLING_RATE must be between 0 and 1 if set. Got: ${samplingRate}`);
}
return samplingRate;
};
var isLocalhost = (url) => {
const strippedUrl = url.replace("http://", "").replace("https://", "");
const hostname = strippedUrl.split("/")[0].split(":")[0];
return hostname === "localhost" || hostname === "127.0.0.1" || hostname === "::1";
};
var raiseForStatus = async (response, operation) => {
const body = await response.text();
if (!response.ok) {
throw new Error(`Failed to ${operation}: ${response.status} ${response.statusText} ${body}`);
}
};
async function toArray(iterable) {
const result = [];
for await (const item of iterable) {
result.push(item);
}
return result;
}
function trimQuotes(str) {
if (str === void 0) {
return void 0;
}
return str.trim().replace(/^"(.*)"$/, "$1").replace(/^'(.*)'$/, "$1");
}
function assertUuid(str) {
if (!validate_default(str)) {
throw new Error(`Invalid UUID: ${str}`);
}
}
var Client = class {
constructor(config = {}) {
var _a2, _b, _c, _d, _e, _f, _g, _h, _i, _j;
Object.defineProperty(this, "apiKey", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "apiUrl", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "webUrl", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "caller", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "timeout_ms", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "_tenantId", {
enumerable: true,
configurable: true,
writable: true,
value: null
});
Object.defineProperty(this, "hideInputs", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "hideOutputs", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "tracingSampleRate", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "sampledPostUuids", {
enumerable: true,
configurable: true,
writable: true,
value: /* @__PURE__ */ new Set()
});
Object.defineProperty(this, "autoBatchTracing", {
enumerable: true,
configurable: true,
writable: true,
value: false
});
Object.defineProperty(this, "batchEndpointSupported", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "pendingAutoBatchedRuns", {
enumerable: true,
configurable: true,
writable: true,
value: []
});
Object.defineProperty(this, "pendingAutoBatchedRunLimit", {
enumerable: true,
configurable: true,
writable: true,
value: 100
});
Object.defineProperty(this, "autoBatchTimeout", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "autoBatchInitialDelayMs", {
enumerable: true,
configurable: true,
writable: true,
value: 250
});
Object.defineProperty(this, "autoBatchAggregationDelayMs", {
enumerable: true,
configurable: true,
writable: true,
value: 50
});
const defaultConfig = Client.getDefaultClientConfig();
this.tracingSampleRate = getTracingSamplingRate();
this.apiUrl = (_b = trimQuotes((_a2 = config.apiUrl) != null ? _a2 : defaultConfig.apiUrl)) != null ? _b : "";
this.apiKey = trimQuotes((_c = config.apiKey) != null ? _c : defaultConfig.apiKey);
this.webUrl = trimQuotes((_d = config.webUrl) != null ? _d : defaultConfig.webUrl);
this.validateApiKeyIfHosted();
this.timeout_ms = (_e = config.timeout_ms) != null ? _e : 12e3;
this.caller = new AsyncCaller((_f = config.callerOptions) != null ? _f : {});
this.hideInputs = (_g = config.hideInputs) != null ? _g : defaultConfig.hideInputs;
this.hideOutputs = (_h = config.hideOutputs) != null ? _h : defaultConfig.hideOutputs;
this.autoBatchTracing = (_i = config.autoBatchTracing) != null ? _i : this.autoBatchTracing;
this.pendingAutoBatchedRunLimit = (_j = config.pendingAutoBatchedRunLimit) != null ? _j : this.pendingAutoBatchedRunLimit;
}
static getDefaultClientConfig() {
var _a2;
const apiKey = getEnvironmentVariable("LANGCHAIN_API_KEY");
const apiUrl = (_a2 = getEnvironmentVariable("LANGCHAIN_ENDPOINT")) != null ? _a2 : "https://api.smith.langchain.com";
const hideInputs = getEnvironmentVariable("LANGCHAIN_HIDE_INPUTS") === "true";
const hideOutputs = getEnvironmentVariable("LANGCHAIN_HIDE_OUTPUTS") === "true";
return {
apiUrl,
apiKey,
webUrl: void 0,
hideInputs,
hideOutputs
};
}
validateApiKeyIfHosted() {
const isLocal = isLocalhost(this.apiUrl);
if (!isLocal && !this.apiKey) {
throw new Error("API key must be provided when using hosted LangSmith API");
}
}
getHostUrl() {
if (this.webUrl) {
return this.webUrl;
} else if (isLocalhost(this.apiUrl)) {
this.webUrl = "http://localhost";
return "http://localhost";
} else if (this.apiUrl.includes("/api") && !this.apiUrl.split(".", 1)[0].endsWith("api")) {
this.webUrl = this.apiUrl.replace("/api", "");
return this.webUrl;
} else if (this.apiUrl.split(".", 1)[0].includes("dev")) {
this.webUrl = "https://dev.smith.langchain.com";
return "https://dev.smith.langchain.com";
} else {
this.webUrl = "https://smith.langchain.com";
return "https://smith.langchain.com";
}
}
get headers() {
const headers = {
"User-Agent": `langsmith-js/${__version__}`
};
if (this.apiKey) {
headers["x-api-key"] = `${this.apiKey}`;
}
return headers;
}
processInputs(inputs) {
if (this.hideInputs) {
return {};
}
return inputs;
}
processOutputs(outputs) {
if (this.hideOutputs) {
return {};
}
return outputs;
}
prepareRunCreateOrUpdateInputs(run) {
const runParams = { ...run };
if (runParams.inputs !== void 0) {
runParams.inputs = this.processInputs(runParams.inputs);
}
if (runParams.outputs !== void 0) {
runParams.outputs = this.processOutputs(runParams.outputs);
}
return runParams;
}
async _getResponse(path, queryParams) {
var _a2;
const paramsString = (_a2 = queryParams == null ? void 0 : queryParams.toString()) != null ? _a2 : "";
const url = `${this.apiUrl}${path}?${paramsString}`;
const response = await this.caller.call(fetch, url, {
method: "GET",
headers: this.headers,
signal: AbortSignal.timeout(this.timeout_ms)
});
if (!response.ok) {
throw new Error(`Failed to fetch ${path}: ${response.status} ${response.statusText}`);
}
return response;
}
async _get(path, queryParams) {
const response = await this._getResponse(path, queryParams);
return response.json();
}
async *_getPaginated(path, queryParams = new URLSearchParams()) {
let offset = Number(queryParams.get("offset")) || 0;
const limit = Number(queryParams.get("limit")) || 100;
while (true) {
queryParams.set("offset", String(offset));
queryParams.set("limit", String(limit));
const url = `${this.apiUrl}${path}?${queryParams}`;
const response = await this.caller.call(fetch, url, {
method: "GET",
headers: this.headers,
signal: AbortSignal.timeout(this.timeout_ms)
});
if (!response.ok) {
throw new Error(`Failed to fetch ${path}: ${response.status} ${response.statusText}`);
}
const items = await response.json();
if (items.length === 0) {
break;
}
yield items;
if (items.length < limit) {
break;
}
offset += items.length;
}
}
async *_getCursorPaginatedList(path, body = null, requestMethod = "POST", dataKey = "runs") {
const bodyParams = body ? { ...body } : {};
while (true) {
const response = await this.caller.call(fetch, `${this.apiUrl}${path}`, {
method: requestMethod,
headers: { ...this.headers, "Content-Type": "application/json" },
signal: AbortSignal.timeout(this.timeout_ms),
body: JSON.stringify(bodyParams)
});
const responseBody = await response.json();
if (!responseBody) {
break;
}
if (!responseBody[dataKey]) {
break;
}
yield responseBody[dataKey];
const cursors = responseBody.cursors;
if (!cursors) {
break;
}
if (!cursors.next) {
break;
}
bodyParams.cursor = cursors.next;
}
}
_filterForSampling(runs, patch = false) {
if (this.tracingSampleRate === void 0) {
return runs;
}
if (patch) {
const sampled = [];
for (const run of runs) {
if (this.sampledPostUuids.has(run.id)) {
sampled.push(run);
this.sampledPostUuids.delete(run.id);
}
}
return sampled;
} else {
const sampled = [];
for (const run of runs) {
if (Math.random() < this.tracingSampleRate) {
sampled.push(run);
this.sampledPostUuids.add(run.id);
}
}
return sampled;
}
}
async triggerAutoBatchSend(runs) {
let batch = runs;
if (batch === void 0) {
batch = this.pendingAutoBatchedRuns.slice(0, this.pendingAutoBatchedRunLimit);
this.pendingAutoBatchedRuns = this.pendingAutoBatchedRuns.slice(this.pendingAutoBatchedRunLimit);
}
await this.batchIngestRuns({
runCreates: batch.filter((item) => item.action === "create").map((item) => item.item),
runUpdates: batch.filter((item) => item.action === "update").map((item) => item.item)
});
}
appendRunCreateToAutoBatchQueue(item) {
const oldTimeout = this.autoBatchTimeout;
clearTimeout(this.autoBatchTimeout);
this.autoBatchTimeout = void 0;
this.pendingAutoBatchedRuns.push(item);
while (this.pendingAutoBatchedRuns.length >= this.pendingAutoBatchedRunLimit) {
const batch = this.pendingAutoBatchedRuns.slice(0, this.pendingAutoBatchedRunLimit);
this.pendingAutoBatchedRuns = this.pendingAutoBatchedRuns.slice(this.pendingAutoBatchedRunLimit);
void this.triggerAutoBatchSend(batch);
}
if (this.pendingAutoBatchedRuns.length > 0) {
if (!oldTimeout) {
this.autoBatchTimeout = setTimeout(() => {
this.autoBatchTimeout = void 0;
void this.triggerAutoBatchSend();
}, this.autoBatchInitialDelayMs);
} else {
this.autoBatchTimeout = setTimeout(() => {
this.autoBatchTimeout = void 0;
void this.triggerAutoBatchSend();
}, this.autoBatchAggregationDelayMs);
}
}
}
async batchEndpointIsSupported() {
const response = await fetch(`${this.apiUrl}/info`, {
method: "GET",
headers: { Accept: "application/json" },
signal: AbortSignal.timeout(this.timeout_ms)
});
if (!response.ok) {
await response.text();
return false;
}
return true;
}
async createRun(run) {
var _a2;
if (!this._filterForSampling([run]).length) {
return;
}
const headers = { ...this.headers, "Content-Type": "application/json" };
const session_name = run.project_name;
delete run.project_name;
const runCreate = this.prepareRunCreateOrUpdateInputs({
session_name,
...run,
start_time: (_a2 = run.start_time) != null ? _a2 : Date.now()
});
if (this.autoBatchTracing && runCreate.trace_id !== void 0 && runCreate.dotted_order !== void 0) {
this.appendRunCreateToAutoBatchQueue({
action: "create",
item: runCreate
});
return;
}
const mergedRunCreateParams = await mergeRuntimeEnvIntoRunCreates([
runCreate
]);
const response = await this.caller.call(fetch, `${this.apiUrl}/runs`, {
method: "POST",
headers,
body: JSON.stringify(mergedRunCreateParams[0]),
signal: AbortSignal.timeout(this.timeout_ms)
});
await raiseForStatus(response, "create run");
}
/**
* Batch ingest/upsert multiple runs in the Langsmith system.
* @param runs
*/
async batchIngestRuns({ runCreates, runUpdates }) {
var _a2, _b;
if (runCreates === void 0 && runUpdates === void 0) {
return;
}
let preparedCreateParams = (_a2 = runCreates == null ? void 0 : runCreates.map((create) => this.prepareRunCreateOrUpdateInputs(create))) != null ? _a2 : [];
let preparedUpdateParams = (_b = runUpdates == null ? void 0 : runUpdates.map((update) => this.prepareRunCreateOrUpdateInputs(update))) != null ? _b : [];
if (preparedCreateParams.length > 0 && preparedUpdateParams.length > 0) {
const createById = preparedCreateParams.reduce((params, run) => {
if (!run.id) {
return params;
}
params[run.id] = run;
return params;
}, {});
const standaloneUpdates = [];
for (const updateParam of preparedUpdateParams) {
if (updateParam.id !== void 0 && createById[updateParam.id]) {
createById[updateParam.id] = {
...createById[updateParam.id],
...updateParam
};
} else {
standaloneUpdates.push(updateParam);
}
}
preparedCreateParams = Object.values(createById);
preparedUpdateParams = standaloneUpdates;
}
const body = {
post: this._filterForSampling(preparedCreateParams),
patch: this._filterForSampling(preparedUpdateParams, true)
};
if (!body.post.length && !body.patch.length) {
return;
}
preparedCreateParams = await mergeRuntimeEnvIntoRunCreates(preparedCreateParams);
if (this.batchEndpointSupported === void 0) {
this.batchEndpointSupported = await this.batchEndpointIsSupported();
}
if (!this.batchEndpointSupported) {
this.autoBatchTracing = false;
for (const preparedCreateParam of body.post) {
await this.createRun(preparedCreateParam);
}
for (const preparedUpdateParam of body.patch) {
if (preparedUpdateParam.id !== void 0) {
await this.updateRun(preparedUpdateParam.id, preparedUpdateParam);
}
}
return;
}
const headers = {
...this.headers,
"Content-Type": "application/json",
Accept: "application/json"
};
const response = await this.caller.call(fetch, `${this.apiUrl}/runs/batch`, {
method: "POST",
headers,
body: JSON.stringify(body),
signal: AbortSignal.timeout(this.timeout_ms)
});
await raiseForStatus(response, "batch create run");
}
async updateRun(runId, run) {
assertUuid(runId);
if (run.inputs) {
run.inputs = this.processInputs(run.inputs);
}
if (run.outputs) {
run.outputs = this.processOutputs(run.outputs);
}
const data = { ...run, id: runId };
if (!this._filterForSampling([data], true).length) {
return;
}
if (this.autoBatchTracing && data.trace_id !== void 0 && data.dotted_order !== void 0) {
this.appendRunCreateToAutoBatchQueue({ action: "update", item: data });
return;
}
const headers = { ...this.headers, "Content-Type": "application/json" };
const response = await this.caller.call(fetch, `${this.apiUrl}/runs/${runId}`, {
method: "PATCH",
headers,
body: JSON.stringify(run),
signal: AbortSignal.timeout(this.timeout_ms)
});
await raiseForStatus(response, "update run");
}
async readRun(runId, { loadChildRuns } = { loadChildRuns: false }) {
assertUuid(runId);
let run = await this._get(`/runs/${runId}`);
if (loadChildRuns && run.child_run_ids) {
run = await this._loadChildRuns(run);
}
return run;
}
async getRunUrl({ runId, run, projectOpts }) {
if (run !== void 0) {
let sessionId;
if (run.session_id) {
sessionId = run.session_id;
} else if (projectOpts == null ? void 0 : projectOpts.projectName) {
sessionId = (await this.readProject({ projectName: projectOpts == null ? void 0 : projectOpts.projectName })).id;
} else if (projectOpts == null ? void 0 : projectOpts.projectId) {
sessionId = projectOpts == null ? void 0 : projectOpts.projectId;
} else {
const project = await this.readProject({
projectName: getEnvironmentVariable("LANGCHAIN_PROJECT") || "default"
});
sessionId = project.id;
}
const tenantId = await this._getTenantId();
return `${this.getHostUrl()}/o/${tenantId}/projects/p/${sessionId}/r/${run.id}?poll=true`;
} else if (runId !== void 0) {
const run_ = await this.readRun(runId);
if (!run_.app_path) {
throw new Error(`Run ${runId} has no app_path`);
}
const baseUrl = this.getHostUrl();
return `${baseUrl}${run_.app_path}`;
} else {
throw new Error("Must provide either runId or run");
}
}
async _loadChildRuns(run) {
const childRuns = await toArray(this.listRuns({ id: run.child_run_ids }));
const treemap = {};
const runs = {};
childRuns.sort((a, b) => {
var _a2, _b;
return ((_a2 = a == null ? void 0 : a.dotted_order) != null ? _a2 : "").localeCompare((_b = b == null ? void 0 : b.dotted_order) != null ? _b : "");
});
for (const childRun of childRuns) {
if (childRun.parent_run_id === null || childRun.parent_run_id === void 0) {
throw new Error(`Child run ${childRun.id} has no parent`);
}
if (!(childRun.parent_run_id in treemap)) {
treemap[childRun.parent_run_id] = [];
}
treemap[childRun.parent_run_id].push(childRun);
runs[childRun.id] = childRun;
}
run.child_runs = treemap[run.id] || [];
for (const runId in treemap) {
if (runId !== run.id) {
runs[runId].child_runs = treemap[runId];
}
}
return run;
}
async *listRuns({ projectId, projectName, parentRunId, traceId, referenceExampleId, startTime, executionOrder, runType, error, id, query, filter, limit }) {
let projectIds = [];
if (projectId) {
projectIds = Array.isArray(projectId) ? projectId : [projectId];
}
if (projectName) {
const projectNames = Array.isArray(projectName) ? projectName : [projectName];
const projectIds_ = await Promise.all(projectNames.map((name) => this.readProject({ projectName: name }).then((project) => project.id)));
projectIds.push(...projectIds_);
}
const body = {
session: projectIds.length ? projectIds : null,
run_type: runType,
reference_example: referenceExampleId,
query,
filter,
execution_order: executionOrder,
parent_run: parentRunId ? [parentRunId] : null,
start_time: startTime ? startTime.toISOString() : null,
error,
id,
limit,
trace: traceId
};
for await (const runs of this._getCursorPaginatedList("/runs/query", body)) {
yield* runs;
}
}
async shareRun(runId, { shareId } = {}) {
const data = {
run_id: runId,
share_token: shareId || v4_default()
};
assertUuid(runId);
const response = await this.caller.call(fetch, `${this.apiUrl}/runs/${runId}/share`, {
method: "PUT",
headers: this.headers,
body: JSON.stringify(data),
signal: AbortSignal.timeout(this.timeout_ms)
});
const result = await response.json();
if (result === null || !("share_token" in result)) {
throw new Error("Invalid response from server");
}
return `${this.getHostUrl()}/public/${result["share_token"]}/r`;
}
async unshareRun(runId) {
assertUuid(runId);
const response = await this.caller.call(fetch, `${this.apiUrl}/runs/${runId}/share`, {
method: "DELETE",
headers: this.headers,
signal: AbortSignal.timeout(this.timeout_ms)
});
await raiseForStatus(response, "unshare run");
}
async readRunSharedLink(runId) {
assertUuid(runId);
const response = await this.caller.call(fetch, `${this.apiUrl}/runs/${runId}/share`, {
method: "GET",
headers: this.headers,
signal: AbortSignal.timeout(this.timeout_ms)
});
const result = await response.json();
if (result === null || !("share_token" in result)) {
return void 0;
}
return `${this.getHostUrl()}/public/${result["share_token"]}/r`;
}
async listSharedRuns(shareToken, { runIds } = {}) {
const queryParams = new URLSearchParams({
share_token: shareToken
});
if (runIds !== void 0) {
for (const runId of runIds) {
queryParams.append("id", runId);
}
}
assertUuid(shareToken);
const response = await this.caller.call(fetch, `${this.apiUrl}/public/${shareToken}/runs${queryParams}`, {
method: "GET",
headers: this.headers,
signal: AbortSignal.timeout(this.timeout_ms)
});
const runs = await response.json();
return runs;
}
async readDatasetSharedSchema(datasetId, datasetName) {
if (!datasetId && !datasetName) {
throw new Error("Either datasetId or datasetName must be given");
}
if (!datasetId) {
const dataset = await this.readDataset({ datasetName });
datasetId = dataset.id;
}
assertUuid(datasetId);
const response = await this.caller.call(fetch, `${this.apiUrl}/datasets/${datasetId}/share`, {
method: "GET",
headers: this.headers,
signal: AbortSignal.timeout(this.timeout_ms)
});
const shareSchema = await response.json();
shareSchema.url = `${this.getHostUrl()}/public/${shareSchema.share_token}/d`;
return shareSchema;
}
async shareDataset(datasetId, datasetName) {
if (!datasetId && !datasetName) {
throw new Error("Either datasetId or datasetName must be given");
}
if (!datasetId) {
const dataset = await this.readDataset({ datasetName });
datasetId = dataset.id;
}
const data = {
dataset_id: datasetId
};
assertUuid(datasetId);
const response = await this.caller.call(fetch, `${this.apiUrl}/datasets/${datasetId}/share`, {
method: "PUT",
headers: this.headers,
body: JSON.stringify(data),
signal: AbortSignal.timeout(this.timeout_ms)
});
const shareSchema = await response.json();
shareSchema.url = `${this.getHostUrl()}/public/${shareSchema.share_token}/d`;
return shareSchema;
}
async unshareDataset(datasetId) {
assertUuid(datasetId);
const response = await this.caller.call(fetch, `${this.apiUrl}/datasets/${datasetId}/share`, {
method: "DELETE",
headers: this.headers,
signal: AbortSignal.timeout(this.timeout_ms)
});
await raiseForStatus(response, "unshare dataset");
}
async readSharedDataset(shareToken) {
assertUuid(shareToken);
const response = await this.caller.call(fetch, `${this.apiUrl}/public/${shareToken}/datasets`, {
method: "GET",
headers: this.headers,
signal: AbortSignal.timeout(this.timeout_ms)
});
const dataset = await response.json();
return dataset;
}
async createProject({ projectName, description = null, metadata = null, upsert = false, projectExtra = null, referenceDatasetId = null }) {
const upsert_ = upsert ? `?upsert=true` : "";
const endpoint = `${this.apiUrl}/sessions${upsert_}`;
const extra = projectExtra || {};
if (metadata) {
extra["metadata"] = metadata;
}
const body = {
name: projectName,
extra,
description
};
if (referenceDatasetId !== null) {
body["reference_dataset_id"] = referenceDatasetId;
}
const response = await this.caller.call(fetch, endpoint, {
method: "POST",
headers: { ...this.headers, "Content-Type": "application/json" },
body: JSON.stringify(body),
signal: AbortSignal.timeout(this.timeout_ms)
});
const result = await response.json();
if (!response.ok) {
throw new Error(`Failed to create session ${projectName}: ${response.status} ${response.statusText}`);
}
return result;
}
async updateProject(projectId, { name = null, description = null, metadata = null, projectExtra = null, endTime = null }) {
const endpoint = `${this.apiUrl}/sessions/${projectId}`;
let extra = projectExtra;
if (metadata) {
extra = { ...extra || {}, metadata };
}
const body = {
name,
extra,
description,
end_time: endTime ? new Date(endTime).toISOString() : null
};
const response = await this.caller.call(fetch, endpoint, {
method: "PATCH",
headers: { ...this.headers, "Content-Type": "application/json" },
body: JSON.stringify(body),
signal: AbortSignal.timeout(this.timeout_ms)
});
const result = await response.json();
if (!response.ok) {
throw new Error(`Failed to update project ${projectId}: ${response.status} ${response.statusText}`);
}
return result;
}
async hasProject({ projectId, projectName }) {
let path = "/sessions";
const params = new URLSearchParams();
if (projectId !== void 0 && projectName !== void 0) {
throw new Error("Must provide either projectName or projectId, not both");
} else if (projectId !== void 0) {
assertUuid(projectId);
path += `/${projectId}`;
} else if (projectName !== void 0) {
params.append("name", projectName);
} else {
throw new Error("Must provide projectName or projectId");
}
const response = await this.caller.call(fetch, `${this.apiUrl}${path}?${params}`, {
method: "GET",
headers: this.headers,
signal: AbortSignal.timeout(this.timeout_ms)
});
try {
const result = await response.json();
if (!response.ok) {
return false;
}
if (Array.isArray(result)) {
return result.length > 0;
}
return true;
} catch (e) {
return false;
}
}
async readProject({ projectId, projectName, includeStats }) {
let path = "/sessions";
const params = new URLSearchParams();
if (projectId !== void 0 && projectName !== void 0) {
throw new Error("Must provide either projectName or projectId, not both");
} else if (projectId !== void 0) {
assertUuid(projectId);
path += `/${projectId}`;
} else if (projectName !== void 0) {
params.append("name", projectName);
} else {
throw new Error("Must provide projectName or projectId");
}
if (includeStats !== void 0) {
params.append("include_stats", includeStats.toString());
}
const response = await this._get(path, params);
let result;
if (Array.isArray(response)) {
if (response.length === 0) {
throw new Error(`Project[id=${projectId}, name=${projectName}] not found`);
}
result = response[0];
} else {
result = response;
}
return result;
}
async _getTenantId() {
if (this._tenantId !== null) {
return this._tenantId;
}
const queryParams = new URLSearchParams({ limit: "1" });
for await (const projects of this._getPaginated("/sessions", queryParams)) {
this._tenantId = projects[0].tenant_id;
return projects[0].tenant_id;
}
throw new Error("No projects found to resolve tenant.");
}
async *listProjects({ projectIds, name, nameContains, referenceDatasetId, referenceDatasetName, referenceFree } = {}) {
const params = new URLSearchParams();
if (projectIds !== void 0) {
for (const projectId of projectIds) {
params.append("id", projectId);
}
}
if (name !== void 0) {
params.append("name", name);
}
if (nameContains !== void 0) {
params.append("name_contains", nameContains);
}
if (referenceDatasetId !== void 0) {
params.append("reference_dataset", referenceDatasetId);
} else if (referenceDatasetName !== void 0) {
const dataset = await this.readDataset({
datasetName: referenceDatasetName
});
params.append("reference_dataset", dataset.id);
}
if (referenceFree !== void 0) {
params.append("reference_free", referenceFree.toString());
}
for await (const projects of this._getPaginated("/sessions", params)) {
yield* projects;
}
}
async deleteProject({ projectId, projectName }) {
let projectId_;
if (projectId === void 0 && projectName === void 0) {
throw new Error("Must provide projectName or projectId");
} else if (projectId !== void 0 && projectName !== void 0) {
throw new Error("Must provide either projectName or projectId, not both");
} else if (projectId === void 0) {
projectId_ = (await this.readProject({ projectName })).id;
} else {
projectId_ = projectId;
}
assertUuid(projectId_);
const response = await this.caller.call(fetch, `${this.apiUrl}/sessions/${projectId_}`, {
method: "DELETE",
headers: this.headers,
signal: AbortSignal.timeout(this.timeout_ms)
});
await raiseForStatus(response, `delete session ${projectId_} (${projectName})`);
}
async uploadCsv({ csvFile, fileName, inputKeys, outputKeys, description, dataType, name }) {
const url = `${this.apiUrl}/datasets/upload`;
const formData = new FormData();
formData.append("file", csvFile, fileName);
inputKeys.forEach((key) => {
formData.append("input_keys", key);
});
outputKeys.forEach((key) => {
formData.append("output_keys", key);
});
if (description) {
formData.append("description", description);
}
if (dataType) {
formData.append("data_type", dataType);
}
if (name) {
formData.append("name", name);
}
const response = await this.caller.call(fetch, url, {
method: "POST",
headers: this.headers,
body: formData,
signal: AbortSignal.timeout(this.timeout_ms)
});
if (!response.ok) {
const result2 = await response.json();
if (result2.detail && result2.detail.includes("already exists")) {
throw new Error(`Dataset ${fileName} already exists`);
}
throw new Error(`Failed to upload CSV: ${response.status} ${response.statusText}`);
}
const result = await response.json();
return result;
}
async createDataset(name, { description, dataType } = {}) {
const body = {
name,
description
};
if (dataType) {
body.data_type = dataType;
}
const response = await this.caller.call(fetch, `${this.apiUrl}/datasets`, {
method: "POST",
headers: { ...this.headers, "Content-Type": "application/json" },
body: JSON.stringify(body),
signal: AbortSignal.timeout(this.timeout_ms)
});
if (!response.ok) {
const result2 = await response.json();
if (result2.detail && result2.detail.includes("already exists")) {
throw new Error(`Dataset ${name} already exists`);
}
throw new Error(`Failed to create dataset ${response.status} ${response.statusText}`);
}
const result = await response.json();
return result;
}
async readDataset({ datasetId, datasetName }) {
let path = "/datasets";
const params = new URLSearchParams({ limit: "1" });
if (datasetId !== void 0 && datasetName !== void 0) {
throw new Error("Must provide either datasetName or datasetId, not both");
} else if (datasetId !== void 0) {
assertUuid(datasetId);
path += `/${datasetId}`;
} else if (datasetName !== void 0) {
params.append("name", datasetName);
} else {
throw new Error("Must provide datasetName or datasetId");
}
const response = await this._get(path, params);
let result;
if (Array.isArray(response)) {
if (response.length === 0) {
throw new Error(`Dataset[id=${datasetId}, name=${datasetName}] not found`);
}
result = response[0];
} else {
result = response;
}
return result;
}
async readDatasetOpenaiFinetuning({ datasetId, datasetName }) {
const path = "/datasets";
if (datasetId !== void 0) {
} else if (datasetName !== void 0) {
datasetId = (await this.readDataset({ datasetName })).id;
} else {
throw new Error("Must provide datasetName or datasetId");
}
const response = await this._getResponse(`${path}/${datasetId}/openai_ft`);
const datasetText = await response.text();
const dataset = datasetText.trim().split("\n").map((line) => JSON.parse(line));
return dataset;
}
async *listDatasets({ limit = 100, offset = 0, datasetIds, datasetName, datasetNameContains } = {}) {
const path = "/datasets";
const params = new URLSearchParams({
limit: limit.toString(),
offset: offset.toString()
});
if (datasetIds !== void 0) {
for (const id_ of datasetIds) {
params.append("id", id_);
}
}
if (datasetName !== void 0) {
params.append("name", datasetName);
}
if (datasetNameContains !== void 0) {
params.append("name_contains", datasetNameContains);
}
for await (const datasets of this._getPaginated(path, params)) {
yield* datasets;
}
}
async deleteDataset({ datasetId, datasetName }) {
let path = "/datasets";
let datasetId_ = datasetId;
if (datasetId !== void 0 && datasetName !== void 0) {
throw new Error("Must provide either datasetName or datasetId, not both");
} else if (datasetName !== void 0) {
const dataset = await this.readDataset({ datasetName });
datasetId_ = dataset.id;
}
if (datasetId_ !== void 0) {
assertUuid(datasetId_);
path += `/${datasetId_}`;
} else {
throw new Error("Must provide datasetName or datasetId");
}
const response = await this.caller.call(fetch, this.apiUrl + path, {
method: "DELETE",
headers: this.headers,
signal: AbortSignal.timeout(this.timeout_ms)
});
if (!response.ok) {
throw new Error(`Failed to delete ${path}: ${response.status} ${response.statusText}`);
}
await response.json();
}
async createExample(inputs, outputs, { datasetId, datasetName, createdAt, exampleId }) {
let datasetId_ = datasetId;
if (datasetId_ === void 0 && datasetName === void 0) {
throw new Error("Must provide either datasetName or datasetId");
} else if (datasetId_ !== void 0 && datasetName !== void 0) {
throw new Error("Must provide either datasetName or datasetId, not both");
} else if (datasetId_ === void 0) {
const dataset = await this.readDataset({ datasetName });
datasetId_ = dataset.id;
}
const createdAt_ = createdAt || new Date();
const data = {
dataset_id: datasetId_,
inputs,
outputs,
created_at: createdAt_ == null ? void 0 : createdAt_.toISOString(),
id: exampleId
};
const response = await this.caller.call(fetch, `${this.apiUrl}/examples`, {
method: "POST",
headers: { ...this.headers, "Content-Type": "application/json" },
body: JSON.stringify(data),
signal: AbortSignal.timeout(this.timeout_ms)
});
if (!response.ok) {
throw new Error(`Failed to create example: ${response.status} ${response.statusText}`);
}
const result = await response.json();
return result;
}
async createExamples(props) {
const { inputs, outputs, sourceRunIds, exampleIds, datasetId, datasetName } = props;
let datasetId_ = datasetId;
if (datasetId_ === void 0 && datasetName === void 0) {
throw new Error("Must provide either datasetName or datasetId");
} else if (datasetId_ !== void 0 && datasetName !== void 0) {
throw new Error("Must provide either datasetName or datasetId, not both");
} else if (datasetId_ === void 0) {
const dataset = await this.readDataset({ datasetName });
datasetId_ = dataset.id;
}
const formattedExamples = inputs.map((input, idx) => {
return {
dataset_id: datasetId_,
inputs: input,
outputs: outputs ? outputs[idx] : void 0,
id: exampleIds ? exampleIds[idx] : void 0,
source_run_id: sourceRunIds ? sourceRunIds[idx] : void 0
};
});
const response = await this.caller.call(fetch, `${this.apiUrl}/examples/bulk`, {
method: "POST",
headers: { ...this.headers, "Content-Type": "application/json" },
body: JSON.stringify(formattedExamples),
signal: AbortSignal.timeout(this.timeout_ms)
});
if (!response.ok) {
throw new Error(`Failed to create examples: ${response.status} ${response.statusText}`);
}
const result = await response.json();
return result;
}
async createLLMExample(input, generation, options) {
return this.createExample({ input }, { output: generation }, options);
}
async createChatExample(input, generations, options) {
const finalInput = input.map((message) => {
if (isLangChainMessage(message)) {
return convertLangChainMessageToExample(message);
}
return message;
});
const finalOutput = isLangChainMessage(generations) ? convertLangChainMessageToExample(generations) : generations;
return this.createExample({ input: finalInput }, { output: finalOutput }, options);
}
async readExample(exampleId) {
assertUuid(exampleId);
const path = `/examples/${exampleId}`;
return await this._get(path);
}
async *listExamples({ datasetId, datasetName, exampleIds } = {}) {
let datasetId_;
if (datasetId !== void 0 && datasetName !== void 0) {
throw new Error("Must provide either datasetName or datasetId, not both");
} else if (datasetId !== void 0) {
datasetId_ = datasetId;
} else if (datasetName !== void 0) {
const dataset = await this.readDataset({ datasetName });
datasetId_ = dataset.id;
} else {
throw new Error("Must provide a datasetName or datasetId");
}
const params = new URLSearchParams({ dataset: datasetId_ });
if (exampleIds !== void 0) {
for (const id_ of exampleIds) {
params.append("id", id_);
}
}
for await (const examples of this._getPaginated("/examples", params)) {
yield* examples;
}
}
async deleteExample(exampleId) {
assertUuid(exampleId);
const path = `/examples/${exampleId}`;
const response = await this.caller.call(fetch, this.apiUrl + path, {
method: "DELETE",
headers: this.headers,
signal: AbortSignal.timeout(this.timeout_ms)
});
if (!response.ok) {
throw new Error(`Failed to delete ${path}: ${response.status} ${response.statusText}`);
}
await response.json();
}
async updateExample(exampleId, update) {
assertUuid(exampleId);
const response = await this.caller.call(fetch, `${this.apiUrl}/examples/${exampleId}`, {
method: "PATCH",
headers: { ...this.headers, "Content-Type": "application/json" },
body: JSON.stringify(update),
signal: AbortSignal.timeout(this.timeout_ms)
});
if (!response.ok) {
throw new Error(`Failed to update example ${exampleId}: ${response.status} ${response.statusText}`);
}
const result = await response.json();
return result;
}
async evaluateRun(run, evaluator, { sourceInfo, loadChildRuns, referenceExample } = { loadChildRuns: false }) {
var _a2;
let run_;
if (typeof run === "string") {
run_ = await this.readRun(run, { loadChildRuns });
} else if (typeof run === "object" && "id" in run) {
run_ = run;
} else {
throw new Error(`Invalid run type: ${typeof run}`);
}
if (run_.reference_example_id !== null && run_.reference_example_id !== void 0) {
referenceExample = await this.readExample(run_.reference_example_id);
}
const feedbackResult = await evaluator.evaluateRun(run_, referenceExample);
let sourceInfo_ = sourceInfo != null ? sourceInfo : {};
if (feedbackResult.evaluatorInfo) {
sourceInfo_ = { ...sourceInfo_, ...feedbackResult.evaluatorInfo };
}
const runId = (_a2 = feedbackResult.targetRunId) != null ? _a2 : run_.id;
return await this.createFeedback(runId, feedbackResult.key, {
score: feedbackResult == null ? void 0 : feedbackResult.score,
value: feedbackResult == null ? void 0 : feedbackResult.value,
comment: feedbackResult == null ? void 0 : feedbackResult.comment,
correction: feedbackResult == null ? void 0 : feedbackResult.correction,
sourceInfo: sourceInfo_,
feedbackSourceType: "model",
sourceRunId: feedbackResult == null ? void 0 : feedbackResult.sourceRunId
});
}
async createFeedback(runId, key, { score, value, correction, comment, sourceInfo, feedbackSourceType = "api", sourceRunId, feedbackId, eager = false }) {
var _a2;
const feedback_source = {
type: feedbackSourceType != null ? feedbackSourceType : "api",
metadata: sourceInfo != null ? sourceInfo : {}
};
if (sourceRunId !== void 0 && (feedback_source == null ? void 0 : feedback_source.metadata) !== void 0 && !feedback_source.metadata["__run"]) {
feedback_source.metadata["__run"] = { run_id: sourceRunId };
}
if ((feedback_source == null ? void 0 : feedback_source.metadata) !== void 0 && ((_a2 = feedback_source.metadata["__run"]) == null ? void 0 : _a2.run_id) !== void 0) {
assertUuid(feedback_source.metadata["__run"].run_id);
}
const feedback = {
id: feedbackId != null ? feedbackId : v4_default(),
run_id: runId,
key,
score,
value,
correction,
comment,
feedback_source
};
const url = `${this.apiUrl}/feedback` + (eager ? "/eager" : "");
const response = await this.caller.call(fetch, url, {
method: "POST",
headers: { ...this.headers, "Content-Type": "application/json" },
body: JSON.stringify(feedback),
signal: AbortSignal.timeout(this.timeout_ms)
});
await raiseForStatus(response, "create feedback");
return feedback;
}
async updateFeedback(feedbackId, { score, value, correction, comment }) {
const feedbackUpdate = {};
if (score !== void 0 && score !== null) {
feedbackUpdate["score"] = score;
}
if (value !== void 0 && value !== null) {
feedbackUpdate["value"] = value;
}
if (correction !== void 0 && correction !== null) {
feedbackUpdate["correction"] = correction;
}
if (comment !== void 0 && comment !== null) {
feedbackUpdate["comment"] = comment;
}
assertUuid(feedbackId);
const response = await this.caller.call(fetch, `${this.apiUrl}/feedback/${feedbackId}`, {
method: "PATCH",
headers: { ...this.headers, "Content-Type": "application/json" },
body: JSON.stringify(feedbackUpdate),
signal: AbortSignal.timeout(this.timeout_ms)
});
await raiseForStatus(response, "update feedback");
}
async readFeedback(feedbackId) {
assertUuid(feedbackId);
const path = `/feedback/${feedbackId}`;
const response = await this._get(path);
return response;
}
async deleteFeedback(feedbackId) {
assertUuid(feedbackId);
const path = `/feedback/${feedbackId}`;
const response = await this.caller.call(fetch, this.apiUrl + path, {
method: "DELETE",
headers: this.headers,
signal: AbortSignal.timeout(this.timeout_ms)
});
if (!response.ok) {
throw new Error(`Failed to delete ${path}: ${response.status} ${response.statusText}`);
}
await response.json();
}
async *listFeedback({ runIds, feedbackKeys, feedbackSourceTypes } = {}) {
const queryParams = new URLSearchParams();
if (runIds) {
queryParams.append("run", runIds.join(","));
}
if (feedbackKeys) {
for (const key of feedbackKeys) {
queryParams.append("key", key);
}
}
if (feedbackSourceTypes) {
for (const type of feedbackSourceTypes) {
queryParams.append("source", type);
}
}
for await (const feedbacks of this._getPaginated("/feedback", queryParams)) {
yield* feedbacks;
}
}
};
// node_modules/langsmith/dist/index.js
var __version__ = "0.0.70";
// node_modules/langchain/node_modules/@langchain/core/dist/utils/env.js
var isBrowser2 = () => typeof window !== "undefined" && typeof window.document !== "undefined";
var isWebWorker2 = () => typeof globalThis === "object" && globalThis.constructor && globalThis.constructor.name === "DedicatedWorkerGlobalScope";
var isJsDom2 = () => typeof window !== "undefined" && window.name === "nodejs" || typeof navigator !== "undefined" && (navigator.userAgent.includes("Node.js") || navigator.userAgent.includes("jsdom"));
var isDeno2 = () => typeof Deno !== "undefined";
var isNode2 = () => typeof process !== "undefined" && typeof process.versions !== "undefined" && typeof process.versions.node !== "undefined" && !isDeno2();
var getEnv2 = () => {
let env;
if (isBrowser2()) {
env = "browser";
} else if (isNode2()) {
env = "node";
} else if (isWebWorker2()) {
env = "webworker";
} else if (isJsDom2()) {
env = "jsdom";
} else if (isDeno2()) {
env = "deno";
} else {
env = "other";
}
return env;
};
var runtimeEnvironment2;
async function getRuntimeEnvironment2() {
if (runtimeEnvironment2 === void 0) {
const env = getEnv2();
runtimeEnvironment2 = {
library: "langchain-js",
runtime: env
};
}
return runtimeEnvironment2;
}
function getEnvironmentVariable2(name) {
var _a2;
try {
return typeof process !== "undefined" ? (
// eslint-disable-next-line no-process-env
(_a2 = process.env) == null ? void 0 : _a2[name]
) : void 0;
} catch (e) {
return void 0;
}
}
// node_modules/langchain/node_modules/@langchain/core/dist/tracers/tracer_langchain.js
var LangChainTracer = class extends BaseTracer {
constructor(fields = {}) {
var _a2;
super(fields);
Object.defineProperty(this, "name", {
enumerable: true,
configurable: true,
writable: true,
value: "langchain_tracer"
});
Object.defineProperty(this, "projectName", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "exampleId", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "client", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
const { exampleId, projectName, client } = fields;
this.projectName = (_a2 = projectName != null ? projectName : getEnvironmentVariable2("LANGCHAIN_PROJECT")) != null ? _a2 : getEnvironmentVariable2("LANGCHAIN_SESSION");
this.exampleId = exampleId;
this.client = client != null ? client : new Client({});
}
async _convertToCreate(run, example_id = void 0) {
return {
...run,
extra: {
...run.extra,
runtime: await getRuntimeEnvironment2()
},
child_runs: void 0,
session_name: this.projectName,
reference_example_id: run.parent_run_id ? void 0 : example_id
};
}
async persistRun(_run) {
}
async _persistRunSingle(run) {
const persistedRun = await this._convertToCreate(run, this.exampleId);
await this.client.createRun(persistedRun);
}
async _updateRunSingle(run) {
const runUpdate = {
end_time: run.end_time,
error: run.error,
outputs: run.outputs,
events: run.events,
inputs: run.inputs
};
await this.client.updateRun(run.id, runUpdate);
}
async onRetrieverStart(run) {
await this._persistRunSingle(run);
}
async onRetrieverEnd(run) {
await this._updateRunSingle(run);
}
async onRetrieverError(run) {
await this._updateRunSingle(run);
}
async onLLMStart(run) {
await this._persistRunSingle(run);
}
async onLLMEnd(run) {
await this._updateRunSingle(run);
}
async onLLMError(run) {
await this._updateRunSingle(run);
}
async onChainStart(run) {
await this._persistRunSingle(run);
}
async onChainEnd(run) {
await this._updateRunSingle(run);
}
async onChainError(run) {
await this._updateRunSingle(run);
}
async onToolStart(run) {
await this._persistRunSingle(run);
}
async onToolEnd(run) {
await this._updateRunSingle(run);
}
async onToolError(run) {
await this._updateRunSingle(run);
}
};
// node_modules/langchain/node_modules/@langchain/core/dist/messages/index.js
function getBufferString(messages, humanPrefix = "Human", aiPrefix = "AI") {
const string_messages = [];
for (const m of messages) {
let role;
if (m._getType() === "human") {
role = humanPrefix;
} else if (m._getType() === "ai") {
role = aiPrefix;
} else if (m._getType() === "system") {
role = "System";
} else if (m._getType() === "function") {
role = "Function";
} else if (m._getType() === "tool") {
role = "Tool";
} else if (m._getType() === "generic") {
role = m.role;
} else {
throw new Error(`Got unsupported message type: ${m._getType()}`);
}
const nameStr = m.name ? `${m.name}, ` : "";
string_messages.push(`${role}: ${nameStr}${m.content}`);
}
return string_messages.join("\n");
}
// node_modules/langchain/node_modules/@langchain/core/dist/tracers/tracer_langchain_v1.js
var LangChainTracerV1 = class extends BaseTracer {
constructor() {
super();
Object.defineProperty(this, "name", {
enumerable: true,
configurable: true,
writable: true,
value: "langchain_tracer"
});
Object.defineProperty(this, "endpoint", {
enumerable: true,
configurable: true,
writable: true,
value: getEnvironmentVariable2("LANGCHAIN_ENDPOINT") || "http://localhost:1984"
});
Object.defineProperty(this, "headers", {
enumerable: true,
configurable: true,
writable: true,
value: {
"Content-Type": "application/json"
}
});
Object.defineProperty(this, "session", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
const apiKey = getEnvironmentVariable2("LANGCHAIN_API_KEY");
if (apiKey) {
this.headers["x-api-key"] = apiKey;
}
}
async newSession(sessionName) {
const sessionCreate = {
start_time: Date.now(),
name: sessionName
};
const session = await this.persistSession(sessionCreate);
this.session = session;
return session;
}
async loadSession(sessionName) {
const endpoint = `${this.endpoint}/sessions?name=${sessionName}`;
return this._handleSessionResponse(endpoint);
}
async loadDefaultSession() {
const endpoint = `${this.endpoint}/sessions?name=default`;
return this._handleSessionResponse(endpoint);
}
async convertV2RunToRun(run) {
var _a2, _b;
const session = (_a2 = this.session) != null ? _a2 : await this.loadDefaultSession();
const serialized = run.serialized;
let runResult;
if (run.run_type === "llm") {
const prompts = run.inputs.prompts ? run.inputs.prompts : run.inputs.messages.map((x) => getBufferString(x));
const llmRun = {
uuid: run.id,
start_time: run.start_time,
end_time: run.end_time,
execution_order: run.execution_order,
child_execution_order: run.child_execution_order,
serialized,
type: run.run_type,
session_id: session.id,
prompts,
response: run.outputs
};
runResult = llmRun;
} else if (run.run_type === "chain") {
const child_runs = await Promise.all(run.child_runs.map((child_run) => this.convertV2RunToRun(child_run)));
const chainRun = {
uuid: run.id,
start_time: run.start_time,
end_time: run.end_time,
execution_order: run.execution_order,
child_execution_order: run.child_execution_order,
serialized,
type: run.run_type,
session_id: session.id,
inputs: run.inputs,
outputs: run.outputs,
child_llm_runs: child_runs.filter((child_run) => child_run.type === "llm"),
child_chain_runs: child_runs.filter((child_run) => child_run.type === "chain"),
child_tool_runs: child_runs.filter((child_run) => child_run.type === "tool")
};
runResult = chainRun;
} else if (run.run_type === "tool") {
const child_runs = await Promise.all(run.child_runs.map((child_run) => this.convertV2RunToRun(child_run)));
const toolRun = {
uuid: run.id,
start_time: run.start_time,
end_time: run.end_time,
execution_order: run.execution_order,
child_execution_order: run.child_execution_order,
serialized,
type: run.run_type,
session_id: session.id,
tool_input: run.inputs.input,
output: (_b = run.outputs) == null ? void 0 : _b.output,
action: JSON.stringify(serialized),
child_llm_runs: child_runs.filter((child_run) => child_run.type === "llm"),
child_chain_runs: child_runs.filter((child_run) => child_run.type === "chain"),
child_tool_runs: child_runs.filter((child_run) => child_run.type === "tool")
};
runResult = toolRun;
} else {
throw new Error(`Unknown run type: ${run.run_type}`);
}
return runResult;
}
async persistRun(run) {
let endpoint;
let v1Run;
if (run.run_type !== void 0) {
v1Run = await this.convertV2RunToRun(run);
} else {
v1Run = run;
}
if (v1Run.type === "llm") {
endpoint = `${this.endpoint}/llm-runs`;
} else if (v1Run.type === "chain") {
endpoint = `${this.endpoint}/chain-runs`;
} else {
endpoint = `${this.endpoint}/tool-runs`;
}
const response = await fetch(endpoint, {
method: "POST",
headers: this.headers,
body: JSON.stringify(v1Run)
});
if (!response.ok) {
console.error(`Failed to persist run: ${response.status} ${response.statusText}`);
}
}
async persistSession(sessionCreate) {
const endpoint = `${this.endpoint}/sessions`;
const response = await fetch(endpoint, {
method: "POST",
headers: this.headers,
body: JSON.stringify(sessionCreate)
});
if (!response.ok) {
console.error(`Failed to persist session: ${response.status} ${response.statusText}, using default session.`);
return {
id: 1,
...sessionCreate
};
}
return {
id: (await response.json()).id,
...sessionCreate
};
}
async _handleSessionResponse(endpoint) {
const response = await fetch(endpoint, {
method: "GET",
headers: this.headers
});
let tracerSession;
if (!response.ok) {
console.error(`Failed to load session: ${response.status} ${response.statusText}`);
tracerSession = {
id: 1,
start_time: Date.now()
};
this.session = tracerSession;
return tracerSession;
}
const resp = await response.json();
if (resp.length === 0) {
tracerSession = {
id: 1,
start_time: Date.now()
};
this.session = tracerSession;
return tracerSession;
}
[tracerSession] = resp;
this.session = tracerSession;
return tracerSession;
}
};
// node_modules/langchain/node_modules/@langchain/core/dist/tracers/initialize.js
async function getTracingCallbackHandler(session) {
const tracer = new LangChainTracerV1();
if (session) {
await tracer.loadSession(session);
} else {
await tracer.loadDefaultSession();
}
return tracer;
}
async function getTracingV2CallbackHandler() {
return new LangChainTracer();
}
// node_modules/langchain/node_modules/@langchain/core/dist/callbacks/promises.js
var import_p_queue2 = __toESM(require_dist(), 1);
var queue;
function createQueue() {
const PQueue = "default" in import_p_queue2.default ? import_p_queue2.default.default : import_p_queue2.default;
return new PQueue({
autoStart: true,
concurrency: 1
});
}
async function consumeCallback(promiseFn, wait) {
if (wait === true) {
await promiseFn();
} else {
if (typeof queue === "undefined") {
queue = createQueue();
}
void queue.add(promiseFn);
}
}
// node_modules/langchain/node_modules/@langchain/core/dist/callbacks/manager.js
function parseCallbackConfigArg(arg) {
if (!arg) {
return {};
} else if (Array.isArray(arg) || "name" in arg) {
return { callbacks: arg };
} else {
return arg;
}
}
var BaseCallbackManager = class {
setHandler(handler) {
return this.setHandlers([handler]);
}
};
var BaseRunManager = class {
constructor(runId, handlers, inheritableHandlers, tags, inheritableTags, metadata, inheritableMetadata, _parentRunId) {
Object.defineProperty(this, "runId", {
enumerable: true,
configurable: true,
writable: true,
value: runId
});
Object.defineProperty(this, "handlers", {
enumerable: true,
configurable: true,
writable: true,
value: handlers
});
Object.defineProperty(this, "inheritableHandlers", {
enumerable: true,
configurable: true,
writable: true,
value: inheritableHandlers
});
Object.defineProperty(this, "tags", {
enumerable: true,
configurable: true,
writable: true,
value: tags
});
Object.defineProperty(this, "inheritableTags", {
enumerable: true,
configurable: true,
writable: true,
value: inheritableTags
});
Object.defineProperty(this, "metadata", {
enumerable: true,
configurable: true,
writable: true,
value: metadata
});
Object.defineProperty(this, "inheritableMetadata", {
enumerable: true,
configurable: true,
writable: true,
value: inheritableMetadata
});
Object.defineProperty(this, "_parentRunId", {
enumerable: true,
configurable: true,
writable: true,
value: _parentRunId
});
}
async handleText(text) {
await Promise.all(this.handlers.map((handler) => consumeCallback(async () => {
var _a2;
try {
await ((_a2 = handler.handleText) == null ? void 0 : _a2.call(handler, text, this.runId, this._parentRunId, this.tags));
} catch (err) {
console.error(`Error in handler ${handler.constructor.name}, handleText: ${err}`);
}
}, handler.awaitHandlers)));
}
};
var CallbackManagerForRetrieverRun = class extends BaseRunManager {
getChild(tag) {
const manager = new CallbackManager(this.runId);
manager.setHandlers(this.inheritableHandlers);
manager.addTags(this.inheritableTags);
manager.addMetadata(this.inheritableMetadata);
if (tag) {
manager.addTags([tag], false);
}
return manager;
}
async handleRetrieverEnd(documents) {
await Promise.all(this.handlers.map((handler) => consumeCallback(async () => {
var _a2;
if (!handler.ignoreRetriever) {
try {
await ((_a2 = handler.handleRetrieverEnd) == null ? void 0 : _a2.call(handler, documents, this.runId, this._parentRunId, this.tags));
} catch (err) {
console.error(`Error in handler ${handler.constructor.name}, handleRetriever`);
}
}
}, handler.awaitHandlers)));
}
async handleRetrieverError(err) {
await Promise.all(this.handlers.map((handler) => consumeCallback(async () => {
var _a2;
if (!handler.ignoreRetriever) {
try {
await ((_a2 = handler.handleRetrieverError) == null ? void 0 : _a2.call(handler, err, this.runId, this._parentRunId, this.tags));
} catch (error) {
console.error(`Error in handler ${handler.constructor.name}, handleRetrieverError: ${error}`);
}
}
}, handler.awaitHandlers)));
}
};
var CallbackManagerForLLMRun = class extends BaseRunManager {
async handleLLMNewToken(token, idx, _runId, _parentRunId, _tags, fields) {
await Promise.all(this.handlers.map((handler) => consumeCallback(async () => {
var _a2;
if (!handler.ignoreLLM) {
try {
await ((_a2 = handler.handleLLMNewToken) == null ? void 0 : _a2.call(handler, token, idx != null ? idx : { prompt: 0, completion: 0 }, this.runId, this._parentRunId, this.tags, fields));
} catch (err) {
console.error(`Error in handler ${handler.constructor.name}, handleLLMNewToken: ${err}`);
}
}
}, handler.awaitHandlers)));
}
async handleLLMError(err) {
await Promise.all(this.handlers.map((handler) => consumeCallback(async () => {
var _a2;
if (!handler.ignoreLLM) {
try {
await ((_a2 = handler.handleLLMError) == null ? void 0 : _a2.call(handler, err, this.runId, this._parentRunId, this.tags));
} catch (err2) {
console.error(`Error in handler ${handler.constructor.name}, handleLLMError: ${err2}`);
}
}
}, handler.awaitHandlers)));
}
async handleLLMEnd(output) {
await Promise.all(this.handlers.map((handler) => consumeCallback(async () => {
var _a2;
if (!handler.ignoreLLM) {
try {
await ((_a2 = handler.handleLLMEnd) == null ? void 0 : _a2.call(handler, output, this.runId, this._parentRunId, this.tags));
} catch (err) {
console.error(`Error in handler ${handler.constructor.name}, handleLLMEnd: ${err}`);
}
}
}, handler.awaitHandlers)));
}
};
var CallbackManagerForChainRun = class extends BaseRunManager {
getChild(tag) {
const manager = new CallbackManager(this.runId);
manager.setHandlers(this.inheritableHandlers);
manager.addTags(this.inheritableTags);
manager.addMetadata(this.inheritableMetadata);
if (tag) {
manager.addTags([tag], false);
}
return manager;
}
async handleChainError(err, _runId, _parentRunId, _tags, kwargs) {
await Promise.all(this.handlers.map((handler) => consumeCallback(async () => {
var _a2;
if (!handler.ignoreChain) {
try {
await ((_a2 = handler.handleChainError) == null ? void 0 : _a2.call(handler, err, this.runId, this._parentRunId, this.tags, kwargs));
} catch (err2) {
console.error(`Error in handler ${handler.constructor.name}, handleChainError: ${err2}`);
}
}
}, handler.awaitHandlers)));
}
async handleChainEnd(output, _runId, _parentRunId, _tags, kwargs) {
await Promise.all(this.handlers.map((handler) => consumeCallback(async () => {
var _a2;
if (!handler.ignoreChain) {
try {
await ((_a2 = handler.handleChainEnd) == null ? void 0 : _a2.call(handler, output, this.runId, this._parentRunId, this.tags, kwargs));
} catch (err) {
console.error(`Error in handler ${handler.constructor.name}, handleChainEnd: ${err}`);
}
}
}, handler.awaitHandlers)));
}
async handleAgentAction(action) {
await Promise.all(this.handlers.map((handler) => consumeCallback(async () => {
var _a2;
if (!handler.ignoreAgent) {
try {
await ((_a2 = handler.handleAgentAction) == null ? void 0 : _a2.call(handler, action, this.runId, this._parentRunId, this.tags));
} catch (err) {
console.error(`Error in handler ${handler.constructor.name}, handleAgentAction: ${err}`);
}
}
}, handler.awaitHandlers)));
}
async handleAgentEnd(action) {
await Promise.all(this.handlers.map((handler) => consumeCallback(async () => {
var _a2;
if (!handler.ignoreAgent) {
try {
await ((_a2 = handler.handleAgentEnd) == null ? void 0 : _a2.call(handler, action, this.runId, this._parentRunId, this.tags));
} catch (err) {
console.error(`Error in handler ${handler.constructor.name}, handleAgentEnd: ${err}`);
}
}
}, handler.awaitHandlers)));
}
};
var CallbackManagerForToolRun = class extends BaseRunManager {
getChild(tag) {
const manager = new CallbackManager(this.runId);
manager.setHandlers(this.inheritableHandlers);
manager.addTags(this.inheritableTags);
manager.addMetadata(this.inheritableMetadata);
if (tag) {
manager.addTags([tag], false);
}
return manager;
}
async handleToolError(err) {
await Promise.all(this.handlers.map((handler) => consumeCallback(async () => {
var _a2;
if (!handler.ignoreAgent) {
try {
await ((_a2 = handler.handleToolError) == null ? void 0 : _a2.call(handler, err, this.runId, this._parentRunId, this.tags));
} catch (err2) {
console.error(`Error in handler ${handler.constructor.name}, handleToolError: ${err2}`);
}
}
}, handler.awaitHandlers)));
}
async handleToolEnd(output) {
await Promise.all(this.handlers.map((handler) => consumeCallback(async () => {
var _a2;
if (!handler.ignoreAgent) {
try {
await ((_a2 = handler.handleToolEnd) == null ? void 0 : _a2.call(handler, output, this.runId, this._parentRunId, this.tags));
} catch (err) {
console.error(`Error in handler ${handler.constructor.name}, handleToolEnd: ${err}`);
}
}
}, handler.awaitHandlers)));
}
};
var CallbackManager = class extends BaseCallbackManager {
constructor(parentRunId, options) {
var _a2, _b, _c, _d, _e, _f;
super();
Object.defineProperty(this, "handlers", {
enumerable: true,
configurable: true,
writable: true,
value: []
});
Object.defineProperty(this, "inheritableHandlers", {
enumerable: true,
configurable: true,
writable: true,
value: []
});
Object.defineProperty(this, "tags", {
enumerable: true,
configurable: true,
writable: true,
value: []
});
Object.defineProperty(this, "inheritableTags", {
enumerable: true,
configurable: true,
writable: true,
value: []
});
Object.defineProperty(this, "metadata", {
enumerable: true,
configurable: true,
writable: true,
value: {}
});
Object.defineProperty(this, "inheritableMetadata", {
enumerable: true,
configurable: true,
writable: true,
value: {}
});
Object.defineProperty(this, "name", {
enumerable: true,
configurable: true,
writable: true,
value: "callback_manager"
});
Object.defineProperty(this, "_parentRunId", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
this.handlers = (_a2 = options == null ? void 0 : options.handlers) != null ? _a2 : this.handlers;
this.inheritableHandlers = (_b = options == null ? void 0 : options.inheritableHandlers) != null ? _b : this.inheritableHandlers;
this.tags = (_c = options == null ? void 0 : options.tags) != null ? _c : this.tags;
this.inheritableTags = (_d = options == null ? void 0 : options.inheritableTags) != null ? _d : this.inheritableTags;
this.metadata = (_e = options == null ? void 0 : options.metadata) != null ? _e : this.metadata;
this.inheritableMetadata = (_f = options == null ? void 0 : options.inheritableMetadata) != null ? _f : this.inheritableMetadata;
this._parentRunId = parentRunId;
}
async handleLLMStart(llm, prompts, _runId = void 0, _parentRunId = void 0, extraParams = void 0, _tags = void 0, _metadata = void 0, runName = void 0) {
return Promise.all(prompts.map(async (prompt) => {
const runId = v4_default();
await Promise.all(this.handlers.map((handler) => consumeCallback(async () => {
var _a2;
if (!handler.ignoreLLM) {
try {
await ((_a2 = handler.handleLLMStart) == null ? void 0 : _a2.call(handler, llm, [prompt], runId, this._parentRunId, extraParams, this.tags, this.metadata, runName));
} catch (err) {
console.error(`Error in handler ${handler.constructor.name}, handleLLMStart: ${err}`);
}
}
}, handler.awaitHandlers)));
return new CallbackManagerForLLMRun(runId, this.handlers, this.inheritableHandlers, this.tags, this.inheritableTags, this.metadata, this.inheritableMetadata, this._parentRunId);
}));
}
async handleChatModelStart(llm, messages, _runId = void 0, _parentRunId = void 0, extraParams = void 0, _tags = void 0, _metadata = void 0, runName = void 0) {
return Promise.all(messages.map(async (messageGroup) => {
const runId = v4_default();
await Promise.all(this.handlers.map((handler) => consumeCallback(async () => {
var _a2, _b;
if (!handler.ignoreLLM) {
try {
if (handler.handleChatModelStart) {
await ((_a2 = handler.handleChatModelStart) == null ? void 0 : _a2.call(handler, llm, [messageGroup], runId, this._parentRunId, extraParams, this.tags, this.metadata, runName));
} else if (handler.handleLLMStart) {
const messageString = getBufferString(messageGroup);
await ((_b = handler.handleLLMStart) == null ? void 0 : _b.call(handler, llm, [messageString], runId, this._parentRunId, extraParams, this.tags, this.metadata, runName));
}
} catch (err) {
console.error(`Error in handler ${handler.constructor.name}, handleLLMStart: ${err}`);
}
}
}, handler.awaitHandlers)));
return new CallbackManagerForLLMRun(runId, this.handlers, this.inheritableHandlers, this.tags, this.inheritableTags, this.metadata, this.inheritableMetadata, this._parentRunId);
}));
}
async handleChainStart(chain, inputs, runId = v4_default(), runType = void 0, _tags = void 0, _metadata = void 0, runName = void 0) {
await Promise.all(this.handlers.map((handler) => consumeCallback(async () => {
var _a2;
if (!handler.ignoreChain) {
try {
await ((_a2 = handler.handleChainStart) == null ? void 0 : _a2.call(handler, chain, inputs, runId, this._parentRunId, this.tags, this.metadata, runType, runName));
} catch (err) {
console.error(`Error in handler ${handler.constructor.name}, handleChainStart: ${err}`);
}
}
}, handler.awaitHandlers)));
return new CallbackManagerForChainRun(runId, this.handlers, this.inheritableHandlers, this.tags, this.inheritableTags, this.metadata, this.inheritableMetadata, this._parentRunId);
}
async handleToolStart(tool, input, runId = v4_default(), _parentRunId = void 0, _tags = void 0, _metadata = void 0, runName = void 0) {
await Promise.all(this.handlers.map((handler) => consumeCallback(async () => {
var _a2;
if (!handler.ignoreAgent) {
try {
await ((_a2 = handler.handleToolStart) == null ? void 0 : _a2.call(handler, tool, input, runId, this._parentRunId, this.tags, this.metadata, runName));
} catch (err) {
console.error(`Error in handler ${handler.constructor.name}, handleToolStart: ${err}`);
}
}
}, handler.awaitHandlers)));
return new CallbackManagerForToolRun(runId, this.handlers, this.inheritableHandlers, this.tags, this.inheritableTags, this.metadata, this.inheritableMetadata, this._parentRunId);
}
async handleRetrieverStart(retriever, query, runId = v4_default(), _parentRunId = void 0, _tags = void 0, _metadata = void 0, runName = void 0) {
await Promise.all(this.handlers.map((handler) => consumeCallback(async () => {
var _a2;
if (!handler.ignoreRetriever) {
try {
await ((_a2 = handler.handleRetrieverStart) == null ? void 0 : _a2.call(handler, retriever, query, runId, this._parentRunId, this.tags, this.metadata, runName));
} catch (err) {
console.error(`Error in handler ${handler.constructor.name}, handleRetrieverStart: ${err}`);
}
}
}, handler.awaitHandlers)));
return new CallbackManagerForRetrieverRun(runId, this.handlers, this.inheritableHandlers, this.tags, this.inheritableTags, this.metadata, this.inheritableMetadata, this._parentRunId);
}
addHandler(handler, inherit = true) {
this.handlers.push(handler);
if (inherit) {
this.inheritableHandlers.push(handler);
}
}
removeHandler(handler) {
this.handlers = this.handlers.filter((_handler) => _handler !== handler);
this.inheritableHandlers = this.inheritableHandlers.filter((_handler) => _handler !== handler);
}
setHandlers(handlers, inherit = true) {
this.handlers = [];
this.inheritableHandlers = [];
for (const handler of handlers) {
this.addHandler(handler, inherit);
}
}
addTags(tags, inherit = true) {
this.removeTags(tags);
this.tags.push(...tags);
if (inherit) {
this.inheritableTags.push(...tags);
}
}
removeTags(tags) {
this.tags = this.tags.filter((tag) => !tags.includes(tag));
this.inheritableTags = this.inheritableTags.filter((tag) => !tags.includes(tag));
}
addMetadata(metadata, inherit = true) {
this.metadata = { ...this.metadata, ...metadata };
if (inherit) {
this.inheritableMetadata = { ...this.inheritableMetadata, ...metadata };
}
}
removeMetadata(metadata) {
for (const key of Object.keys(metadata)) {
delete this.metadata[key];
delete this.inheritableMetadata[key];
}
}
copy(additionalHandlers = [], inherit = true) {
const manager = new CallbackManager(this._parentRunId);
for (const handler of this.handlers) {
const inheritable = this.inheritableHandlers.includes(handler);
manager.addHandler(handler, inheritable);
}
for (const tag of this.tags) {
const inheritable = this.inheritableTags.includes(tag);
manager.addTags([tag], inheritable);
}
for (const key of Object.keys(this.metadata)) {
const inheritable = Object.keys(this.inheritableMetadata).includes(key);
manager.addMetadata({ [key]: this.metadata[key] }, inheritable);
}
for (const handler of additionalHandlers) {
if (
// Prevent multiple copies of console_callback_handler
manager.handlers.filter((h) => h.name === "console_callback_handler").some((h) => h.name === handler.name)
) {
continue;
}
manager.addHandler(handler, inherit);
}
return manager;
}
static fromHandlers(handlers) {
class Handler extends BaseCallbackHandler {
constructor() {
super();
Object.defineProperty(this, "name", {
enumerable: true,
configurable: true,
writable: true,
value: v4_default()
});
Object.assign(this, handlers);
}
}
const manager = new this();
manager.addHandler(new Handler());
return manager;
}
static async configure(inheritableHandlers, localHandlers, inheritableTags, localTags, inheritableMetadata, localMetadata, options) {
var _a2, _b;
let callbackManager;
if (inheritableHandlers || localHandlers) {
if (Array.isArray(inheritableHandlers) || !inheritableHandlers) {
callbackManager = new CallbackManager();
callbackManager.setHandlers((_a2 = inheritableHandlers == null ? void 0 : inheritableHandlers.map(ensureHandler)) != null ? _a2 : [], true);
} else {
callbackManager = inheritableHandlers;
}
callbackManager = callbackManager.copy(Array.isArray(localHandlers) ? localHandlers.map(ensureHandler) : localHandlers == null ? void 0 : localHandlers.handlers, false);
}
const verboseEnabled = getEnvironmentVariable2("LANGCHAIN_VERBOSE") === "true" || (options == null ? void 0 : options.verbose);
const tracingV2Enabled = getEnvironmentVariable2("LANGCHAIN_TRACING_V2") === "true";
const tracingEnabled = tracingV2Enabled || ((_b = getEnvironmentVariable2("LANGCHAIN_TRACING")) != null ? _b : false);
if (verboseEnabled || tracingEnabled) {
if (!callbackManager) {
callbackManager = new CallbackManager();
}
if (verboseEnabled && !callbackManager.handlers.some((handler) => handler.name === ConsoleCallbackHandler.prototype.name)) {
const consoleHandler = new ConsoleCallbackHandler();
callbackManager.addHandler(consoleHandler, true);
}
if (tracingEnabled && !callbackManager.handlers.some((handler) => handler.name === "langchain_tracer")) {
if (tracingV2Enabled) {
callbackManager.addHandler(await getTracingV2CallbackHandler(), true);
} else {
const session = getEnvironmentVariable2("LANGCHAIN_PROJECT") && getEnvironmentVariable2("LANGCHAIN_SESSION");
callbackManager.addHandler(await getTracingCallbackHandler(session), true);
}
}
}
if (inheritableTags || localTags) {
if (callbackManager) {
callbackManager.addTags(inheritableTags != null ? inheritableTags : []);
callbackManager.addTags(localTags != null ? localTags : [], false);
}
}
if (inheritableMetadata || localMetadata) {
if (callbackManager) {
callbackManager.addMetadata(inheritableMetadata != null ? inheritableMetadata : {});
callbackManager.addMetadata(localMetadata != null ? localMetadata : {}, false);
}
}
return callbackManager;
}
};
function ensureHandler(handler) {
if ("name" in handler) {
return handler;
}
return BaseCallbackHandler.fromMethods(handler);
}
// node_modules/langchain/node_modules/@langchain/core/dist/utils/fast-json-patch/src/core.js
var core_exports = {};
__export(core_exports, {
JsonPatchError: () => JsonPatchError,
_areEquals: () => _areEquals,
applyOperation: () => applyOperation,
applyPatch: () => applyPatch,
applyReducer: () => applyReducer,
deepClone: () => deepClone,
getValueByPointer: () => getValueByPointer,
validate: () => validate2,
validator: () => validator
});
// node_modules/langchain/node_modules/@langchain/core/dist/utils/fast-json-patch/src/helpers.js
var _hasOwnProperty = Object.prototype.hasOwnProperty;
function hasOwnProperty(obj, key) {
return _hasOwnProperty.call(obj, key);
}
function _objectKeys(obj) {
if (Array.isArray(obj)) {
const keys2 = new Array(obj.length);
for (let k = 0; k < keys2.length; k++) {
keys2[k] = "" + k;
}
return keys2;
}
if (Object.keys) {
return Object.keys(obj);
}
let keys = [];
for (let i in obj) {
if (hasOwnProperty(obj, i)) {
keys.push(i);
}
}
return keys;
}
function _deepClone(obj) {
switch (typeof obj) {
case "object":
return JSON.parse(JSON.stringify(obj));
case "undefined":
return null;
default:
return obj;
}
}
function isInteger(str) {
let i = 0;
const len = str.length;
let charCode;
while (i < len) {
charCode = str.charCodeAt(i);
if (charCode >= 48 && charCode <= 57) {
i++;
continue;
}
return false;
}
return true;
}
function escapePathComponent(path) {
if (path.indexOf("/") === -1 && path.indexOf("~") === -1)
return path;
return path.replace(/~/g, "~0").replace(/\//g, "~1");
}
function unescapePathComponent(path) {
return path.replace(/~1/g, "/").replace(/~0/g, "~");
}
function hasUndefined(obj) {
if (obj === void 0) {
return true;
}
if (obj) {
if (Array.isArray(obj)) {
for (let i2 = 0, len = obj.length; i2 < len; i2++) {
if (hasUndefined(obj[i2])) {
return true;
}
}
} else if (typeof obj === "object") {
const objKeys = _objectKeys(obj);
const objKeysLength = objKeys.length;
for (var i = 0; i < objKeysLength; i++) {
if (hasUndefined(obj[objKeys[i]])) {
return true;
}
}
}
}
return false;
}
function patchErrorMessageFormatter(message, args) {
const messageParts = [message];
for (const key in args) {
const value = typeof args[key] === "object" ? JSON.stringify(args[key], null, 2) : args[key];
if (typeof value !== "undefined") {
messageParts.push(`${key}: ${value}`);
}
}
return messageParts.join("\n");
}
var PatchError = class extends Error {
constructor(message, name, index, operation, tree) {
super(patchErrorMessageFormatter(message, { name, index, operation, tree }));
Object.defineProperty(this, "name", {
enumerable: true,
configurable: true,
writable: true,
value: name
});
Object.defineProperty(this, "index", {
enumerable: true,
configurable: true,
writable: true,
value: index
});
Object.defineProperty(this, "operation", {
enumerable: true,
configurable: true,
writable: true,
value: operation
});
Object.defineProperty(this, "tree", {
enumerable: true,
configurable: true,
writable: true,
value: tree
});
Object.setPrototypeOf(this, new.target.prototype);
this.message = patchErrorMessageFormatter(message, {
name,
index,
operation,
tree
});
}
};
// node_modules/langchain/node_modules/@langchain/core/dist/utils/fast-json-patch/src/core.js
var JsonPatchError = PatchError;
var deepClone = _deepClone;
var objOps = {
add: function(obj, key, document2) {
obj[key] = this.value;
return { newDocument: document2 };
},
remove: function(obj, key, document2) {
var removed = obj[key];
delete obj[key];
return { newDocument: document2, removed };
},
replace: function(obj, key, document2) {
var removed = obj[key];
obj[key] = this.value;
return { newDocument: document2, removed };
},
move: function(obj, key, document2) {
let removed = getValueByPointer(document2, this.path);
if (removed) {
removed = _deepClone(removed);
}
const originalValue = applyOperation(document2, {
op: "remove",
path: this.from
}).removed;
applyOperation(document2, {
op: "add",
path: this.path,
value: originalValue
});
return { newDocument: document2, removed };
},
copy: function(obj, key, document2) {
const valueToCopy = getValueByPointer(document2, this.from);
applyOperation(document2, {
op: "add",
path: this.path,
value: _deepClone(valueToCopy)
});
return { newDocument: document2 };
},
test: function(obj, key, document2) {
return { newDocument: document2, test: _areEquals(obj[key], this.value) };
},
_get: function(obj, key, document2) {
this.value = obj[key];
return { newDocument: document2 };
}
};
var arrOps = {
add: function(arr, i, document2) {
if (isInteger(i)) {
arr.splice(i, 0, this.value);
} else {
arr[i] = this.value;
}
return { newDocument: document2, index: i };
},
remove: function(arr, i, document2) {
var removedList = arr.splice(i, 1);
return { newDocument: document2, removed: removedList[0] };
},
replace: function(arr, i, document2) {
var removed = arr[i];
arr[i] = this.value;
return { newDocument: document2, removed };
},
move: objOps.move,
copy: objOps.copy,
test: objOps.test,
_get: objOps._get
};
function getValueByPointer(document2, pointer) {
if (pointer == "") {
return document2;
}
var getOriginalDestination = { op: "_get", path: pointer };
applyOperation(document2, getOriginalDestination);
return getOriginalDestination.value;
}
function applyOperation(document2, operation, validateOperation = false, mutateDocument = true, banPrototypeModifications = true, index = 0) {
if (validateOperation) {
if (typeof validateOperation == "function") {
validateOperation(operation, 0, document2, operation.path);
} else {
validator(operation, 0);
}
}
if (operation.path === "") {
let returnValue = { newDocument: document2 };
if (operation.op === "add") {
returnValue.newDocument = operation.value;
return returnValue;
} else if (operation.op === "replace") {
returnValue.newDocument = operation.value;
returnValue.removed = document2;
return returnValue;
} else if (operation.op === "move" || operation.op === "copy") {
returnValue.newDocument = getValueByPointer(document2, operation.from);
if (operation.op === "move") {
returnValue.removed = document2;
}
return returnValue;
} else if (operation.op === "test") {
returnValue.test = _areEquals(document2, operation.value);
if (returnValue.test === false) {
throw new JsonPatchError("Test operation failed", "TEST_OPERATION_FAILED", index, operation, document2);
}
returnValue.newDocument = document2;
return returnValue;
} else if (operation.op === "remove") {
returnValue.removed = document2;
returnValue.newDocument = null;
return returnValue;
} else if (operation.op === "_get") {
operation.value = document2;
return returnValue;
} else {
if (validateOperation) {
throw new JsonPatchError("Operation `op` property is not one of operations defined in RFC-6902", "OPERATION_OP_INVALID", index, operation, document2);
} else {
return returnValue;
}
}
} else {
if (!mutateDocument) {
document2 = _deepClone(document2);
}
const path = operation.path || "";
const keys = path.split("/");
let obj = document2;
let t = 1;
let len = keys.length;
let existingPathFragment = void 0;
let key;
let validateFunction;
if (typeof validateOperation == "function") {
validateFunction = validateOperation;
} else {
validateFunction = validator;
}
while (true) {
key = keys[t];
if (key && key.indexOf("~") != -1) {
key = unescapePathComponent(key);
}
if (banPrototypeModifications && (key == "__proto__" || key == "prototype" && t > 0 && keys[t - 1] == "constructor")) {
throw new TypeError("JSON-Patch: modifying `__proto__` or `constructor/prototype` prop is banned for security reasons, if this was on purpose, please set `banPrototypeModifications` flag false and pass it to this function. More info in fast-json-patch README");
}
if (validateOperation) {
if (existingPathFragment === void 0) {
if (obj[key] === void 0) {
existingPathFragment = keys.slice(0, t).join("/");
} else if (t == len - 1) {
existingPathFragment = operation.path;
}
if (existingPathFragment !== void 0) {
validateFunction(operation, 0, document2, existingPathFragment);
}
}
}
t++;
if (Array.isArray(obj)) {
if (key === "-") {
key = obj.length;
} else {
if (validateOperation && !isInteger(key)) {
throw new JsonPatchError("Expected an unsigned base-10 integer value, making the new referenced value the array element with the zero-based index", "OPERATION_PATH_ILLEGAL_ARRAY_INDEX", index, operation, document2);
} else if (isInteger(key)) {
key = ~~key;
}
}
if (t >= len) {
if (validateOperation && operation.op === "add" && key > obj.length) {
throw new JsonPatchError("The specified index MUST NOT be greater than the number of elements in the array", "OPERATION_VALUE_OUT_OF_BOUNDS", index, operation, document2);
}
const returnValue = arrOps[operation.op].call(operation, obj, key, document2);
if (returnValue.test === false) {
throw new JsonPatchError("Test operation failed", "TEST_OPERATION_FAILED", index, operation, document2);
}
return returnValue;
}
} else {
if (t >= len) {
const returnValue = objOps[operation.op].call(operation, obj, key, document2);
if (returnValue.test === false) {
throw new JsonPatchError("Test operation failed", "TEST_OPERATION_FAILED", index, operation, document2);
}
return returnValue;
}
}
obj = obj[key];
if (validateOperation && t < len && (!obj || typeof obj !== "object")) {
throw new JsonPatchError("Cannot perform operation at the desired path", "OPERATION_PATH_UNRESOLVABLE", index, operation, document2);
}
}
}
}
function applyPatch(document2, patch, validateOperation, mutateDocument = true, banPrototypeModifications = true) {
if (validateOperation) {
if (!Array.isArray(patch)) {
throw new JsonPatchError("Patch sequence must be an array", "SEQUENCE_NOT_AN_ARRAY");
}
}
if (!mutateDocument) {
document2 = _deepClone(document2);
}
const results = new Array(patch.length);
for (let i = 0, length = patch.length; i < length; i++) {
results[i] = applyOperation(document2, patch[i], validateOperation, true, banPrototypeModifications, i);
document2 = results[i].newDocument;
}
results.newDocument = document2;
return results;
}
function applyReducer(document2, operation, index) {
const operationResult = applyOperation(document2, operation);
if (operationResult.test === false) {
throw new JsonPatchError("Test operation failed", "TEST_OPERATION_FAILED", index, operation, document2);
}
return operationResult.newDocument;
}
function validator(operation, index, document2, existingPathFragment) {
if (typeof operation !== "object" || operation === null || Array.isArray(operation)) {
throw new JsonPatchError("Operation is not an object", "OPERATION_NOT_AN_OBJECT", index, operation, document2);
} else if (!objOps[operation.op]) {
throw new JsonPatchError("Operation `op` property is not one of operations defined in RFC-6902", "OPERATION_OP_INVALID", index, operation, document2);
} else if (typeof operation.path !== "string") {
throw new JsonPatchError("Operation `path` property is not a string", "OPERATION_PATH_INVALID", index, operation, document2);
} else if (operation.path.indexOf("/") !== 0 && operation.path.length > 0) {
throw new JsonPatchError('Operation `path` property must start with "/"', "OPERATION_PATH_INVALID", index, operation, document2);
} else if ((operation.op === "move" || operation.op === "copy") && typeof operation.from !== "string") {
throw new JsonPatchError("Operation `from` property is not present (applicable in `move` and `copy` operations)", "OPERATION_FROM_REQUIRED", index, operation, document2);
} else if ((operation.op === "add" || operation.op === "replace" || operation.op === "test") && operation.value === void 0) {
throw new JsonPatchError("Operation `value` property is not present (applicable in `add`, `replace` and `test` operations)", "OPERATION_VALUE_REQUIRED", index, operation, document2);
} else if ((operation.op === "add" || operation.op === "replace" || operation.op === "test") && hasUndefined(operation.value)) {
throw new JsonPatchError("Operation `value` property is not present (applicable in `add`, `replace` and `test` operations)", "OPERATION_VALUE_CANNOT_CONTAIN_UNDEFINED", index, operation, document2);
} else if (document2) {
if (operation.op == "add") {
var pathLen = operation.path.split("/").length;
var existingPathLen = existingPathFragment.split("/").length;
if (pathLen !== existingPathLen + 1 && pathLen !== existingPathLen) {
throw new JsonPatchError("Cannot perform an `add` operation at the desired path", "OPERATION_PATH_CANNOT_ADD", index, operation, document2);
}
} else if (operation.op === "replace" || operation.op === "remove" || operation.op === "_get") {
if (operation.path !== existingPathFragment) {
throw new JsonPatchError("Cannot perform the operation at a path that does not exist", "OPERATION_PATH_UNRESOLVABLE", index, operation, document2);
}
} else if (operation.op === "move" || operation.op === "copy") {
var existingValue = {
op: "_get",
path: operation.from,
value: void 0
};
var error = validate2([existingValue], document2);
if (error && error.name === "OPERATION_PATH_UNRESOLVABLE") {
throw new JsonPatchError("Cannot perform the operation from a path that does not exist", "OPERATION_FROM_UNRESOLVABLE", index, operation, document2);
}
}
}
}
function validate2(sequence, document2, externalValidator) {
try {
if (!Array.isArray(sequence)) {
throw new JsonPatchError("Patch sequence must be an array", "SEQUENCE_NOT_AN_ARRAY");
}
if (document2) {
applyPatch(_deepClone(document2), _deepClone(sequence), externalValidator || true);
} else {
externalValidator = externalValidator || validator;
for (var i = 0; i < sequence.length; i++) {
externalValidator(sequence[i], i, document2, void 0);
}
}
} catch (e) {
if (e instanceof JsonPatchError) {
return e;
} else {
throw e;
}
}
}
function _areEquals(a, b) {
if (a === b)
return true;
if (a && b && typeof a == "object" && typeof b == "object") {
var arrA = Array.isArray(a), arrB = Array.isArray(b), i, length, key;
if (arrA && arrB) {
length = a.length;
if (length != b.length)
return false;
for (i = length; i-- !== 0; )
if (!_areEquals(a[i], b[i]))
return false;
return true;
}
if (arrA != arrB)
return false;
var keys = Object.keys(a);
length = keys.length;
if (length !== Object.keys(b).length)
return false;
for (i = length; i-- !== 0; )
if (!b.hasOwnProperty(keys[i]))
return false;
for (i = length; i-- !== 0; ) {
key = keys[i];
if (!_areEquals(a[key], b[key]))
return false;
}
return true;
}
return a !== a && b !== b;
}
// node_modules/langchain/node_modules/@langchain/core/dist/utils/fast-json-patch/index.js
var fast_json_patch_default = {
...core_exports,
// ...duplex,
JsonPatchError: PatchError,
deepClone: _deepClone,
escapePathComponent,
unescapePathComponent
};
// node_modules/langchain/node_modules/@langchain/core/dist/utils/stream.js
var IterableReadableStream = class extends ReadableStream {
constructor() {
super(...arguments);
Object.defineProperty(this, "reader", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
}
ensureReader() {
if (!this.reader) {
this.reader = this.getReader();
}
}
async next() {
this.ensureReader();
try {
const result = await this.reader.read();
if (result.done)
this.reader.releaseLock();
return {
done: result.done,
value: result.value
// Cloudflare Workers typing fix
};
} catch (e) {
this.reader.releaseLock();
throw e;
}
}
async return() {
this.ensureReader();
if (this.locked) {
const cancelPromise = this.reader.cancel();
this.reader.releaseLock();
await cancelPromise;
}
return { done: true, value: void 0 };
}
[Symbol.asyncIterator]() {
return this;
}
static fromReadableStream(stream) {
const reader = stream.getReader();
return new IterableReadableStream({
start(controller) {
return pump();
function pump() {
return reader.read().then(({ done, value }) => {
if (done) {
controller.close();
return;
}
controller.enqueue(value);
return pump();
});
}
},
cancel() {
reader.releaseLock();
}
});
}
static fromAsyncGenerator(generator) {
return new IterableReadableStream({
async pull(controller) {
const { value, done } = await generator.next();
if (done) {
controller.close();
}
controller.enqueue(value);
}
});
}
};
// node_modules/langchain/node_modules/@langchain/core/dist/tracers/log_stream.js
var RunLogPatch = class {
constructor(fields) {
Object.defineProperty(this, "ops", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
this.ops = fields.ops;
}
concat(other) {
const ops = this.ops.concat(other.ops);
const states = applyPatch({}, ops);
return new RunLog({
ops,
state: states[states.length - 1].newDocument
});
}
};
var RunLog = class extends RunLogPatch {
constructor(fields) {
super(fields);
Object.defineProperty(this, "state", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
this.state = fields.state;
}
concat(other) {
const ops = this.ops.concat(other.ops);
const states = applyPatch(this.state, other.ops);
return new RunLog({ ops, state: states[states.length - 1].newDocument });
}
};
var LogStreamCallbackHandler = class extends BaseTracer {
constructor(fields) {
var _a2;
super(fields);
Object.defineProperty(this, "autoClose", {
enumerable: true,
configurable: true,
writable: true,
value: true
});
Object.defineProperty(this, "includeNames", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "includeTypes", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "includeTags", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "excludeNames", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "excludeTypes", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "excludeTags", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "keyMapByRunId", {
enumerable: true,
configurable: true,
writable: true,
value: {}
});
Object.defineProperty(this, "counterMapByRunName", {
enumerable: true,
configurable: true,
writable: true,
value: {}
});
Object.defineProperty(this, "transformStream", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "writer", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "receiveStream", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "name", {
enumerable: true,
configurable: true,
writable: true,
value: "log_stream_tracer"
});
this.autoClose = (_a2 = fields == null ? void 0 : fields.autoClose) != null ? _a2 : true;
this.includeNames = fields == null ? void 0 : fields.includeNames;
this.includeTypes = fields == null ? void 0 : fields.includeTypes;
this.includeTags = fields == null ? void 0 : fields.includeTags;
this.excludeNames = fields == null ? void 0 : fields.excludeNames;
this.excludeTypes = fields == null ? void 0 : fields.excludeTypes;
this.excludeTags = fields == null ? void 0 : fields.excludeTags;
this.transformStream = new TransformStream();
this.writer = this.transformStream.writable.getWriter();
this.receiveStream = IterableReadableStream.fromReadableStream(this.transformStream.readable);
}
[Symbol.asyncIterator]() {
return this.receiveStream;
}
async persistRun(_run) {
}
_includeRun(run) {
var _a2;
if (run.parent_run_id === void 0) {
return false;
}
const runTags = (_a2 = run.tags) != null ? _a2 : [];
let include = this.includeNames === void 0 && this.includeTags === void 0 && this.includeTypes === void 0;
if (this.includeNames !== void 0) {
include = include || this.includeNames.includes(run.name);
}
if (this.includeTypes !== void 0) {
include = include || this.includeTypes.includes(run.run_type);
}
if (this.includeTags !== void 0) {
include = include || runTags.find((tag) => {
var _a3;
return (_a3 = this.includeTags) == null ? void 0 : _a3.includes(tag);
}) !== void 0;
}
if (this.excludeNames !== void 0) {
include = include && !this.excludeNames.includes(run.name);
}
if (this.excludeTypes !== void 0) {
include = include && !this.excludeTypes.includes(run.run_type);
}
if (this.excludeTags !== void 0) {
include = include && runTags.every((tag) => {
var _a3;
return !((_a3 = this.excludeTags) == null ? void 0 : _a3.includes(tag));
});
}
return include;
}
async onRunCreate(run) {
var _a2, _b, _c;
if (run.parent_run_id === void 0) {
await this.writer.write(new RunLogPatch({
ops: [
{
op: "replace",
path: "",
value: {
id: run.id,
streamed_output: [],
final_output: void 0,
logs: {}
}
}
]
}));
}
if (!this._includeRun(run)) {
return;
}
if (this.counterMapByRunName[run.name] === void 0) {
this.counterMapByRunName[run.name] = 0;
}
this.counterMapByRunName[run.name] += 1;
const count = this.counterMapByRunName[run.name];
this.keyMapByRunId[run.id] = count === 1 ? run.name : `${run.name}:${count}`;
const logEntry = {
id: run.id,
name: run.name,
type: run.run_type,
tags: (_a2 = run.tags) != null ? _a2 : [],
metadata: (_c = (_b = run.extra) == null ? void 0 : _b.metadata) != null ? _c : {},
start_time: new Date(run.start_time).toISOString(),
streamed_output_str: [],
final_output: void 0,
end_time: void 0
};
await this.writer.write(new RunLogPatch({
ops: [
{
op: "add",
path: `/logs/${this.keyMapByRunId[run.id]}`,
value: logEntry
}
]
}));
}
async onRunUpdate(run) {
try {
const runName = this.keyMapByRunId[run.id];
if (runName === void 0) {
return;
}
const ops = [
{
op: "add",
path: `/logs/${runName}/final_output`,
value: run.outputs
}
];
if (run.end_time !== void 0) {
ops.push({
op: "add",
path: `/logs/${runName}/end_time`,
value: new Date(run.end_time).toISOString()
});
}
const patch = new RunLogPatch({ ops });
await this.writer.write(patch);
} finally {
if (run.parent_run_id === void 0) {
const patch = new RunLogPatch({
ops: [
{
op: "replace",
path: "/final_output",
value: run.outputs
}
]
});
await this.writer.write(patch);
if (this.autoClose) {
await this.writer.close();
}
}
}
}
async onLLMNewToken(run, token) {
const runName = this.keyMapByRunId[run.id];
if (runName === void 0) {
return;
}
const patch = new RunLogPatch({
ops: [
{
op: "add",
path: `/logs/${runName}/streamed_output_str/-`,
value: token
}
]
});
await this.writer.write(patch);
}
};
// node_modules/langchain/node_modules/@langchain/core/dist/runnables/config.js
async function getCallbackMangerForConfig(config) {
return CallbackManager.configure(config == null ? void 0 : config.callbacks, void 0, config == null ? void 0 : config.tags, void 0, config == null ? void 0 : config.metadata);
}
function mergeConfigs(config, options) {
var _a2, _b, _c, _d;
const copy = { ...config };
if (options) {
for (const key of Object.keys(options)) {
if (key === "metadata") {
copy[key] = { ...copy[key], ...options[key] };
} else if (key === "tags") {
copy[key] = ((_a2 = copy[key]) != null ? _a2 : []).concat((_b = options[key]) != null ? _b : []);
} else if (key === "callbacks") {
const baseCallbacks = copy.callbacks;
const providedCallbacks = (_c = options.callbacks) != null ? _c : config.callbacks;
if (Array.isArray(providedCallbacks)) {
if (!baseCallbacks) {
copy.callbacks = providedCallbacks;
} else if (Array.isArray(baseCallbacks)) {
copy.callbacks = baseCallbacks.concat(providedCallbacks);
} else {
const manager = baseCallbacks.copy();
for (const callback of providedCallbacks) {
manager.addHandler(callback, true);
}
copy.callbacks = manager;
}
} else if (providedCallbacks) {
if (!baseCallbacks) {
copy.callbacks = providedCallbacks;
} else if (Array.isArray(baseCallbacks)) {
const manager = providedCallbacks.copy();
for (const callback of baseCallbacks) {
manager.addHandler(callback, true);
}
copy.callbacks = manager;
} else {
copy.callbacks = new CallbackManager(providedCallbacks.parentRunId, {
handlers: baseCallbacks.handlers.concat(providedCallbacks.handlers),
inheritableHandlers: baseCallbacks.inheritableHandlers.concat(providedCallbacks.inheritableHandlers),
tags: Array.from(new Set(baseCallbacks.tags.concat(providedCallbacks.tags))),
inheritableTags: Array.from(new Set(baseCallbacks.inheritableTags.concat(providedCallbacks.inheritableTags))),
metadata: {
...baseCallbacks.metadata,
...providedCallbacks.metadata
}
});
}
}
} else {
copy[key] = (_d = options[key]) != null ? _d : copy[key];
}
}
}
return copy;
}
// node_modules/langchain/node_modules/@langchain/core/dist/utils/async_caller.js
var import_p_retry2 = __toESM(require_p_retry(), 1);
var import_p_queue3 = __toESM(require_dist(), 1);
var STATUS_NO_RETRY2 = [
400,
401,
402,
403,
404,
405,
406,
407,
408,
409
// Conflict
];
var defaultFailedAttemptHandler = (error) => {
var _a2, _b, _c;
if (error.message.startsWith("Cancel") || error.message.startsWith("TimeoutError") || error.name === "TimeoutError" || error.message.startsWith("AbortError") || error.name === "AbortError") {
throw error;
}
if ((error == null ? void 0 : error.code) === "ECONNABORTED") {
throw error;
}
const status = (
// eslint-disable-next-line @typescript-eslint/no-explicit-any
(_b = (_a2 = error == null ? void 0 : error.response) == null ? void 0 : _a2.status) != null ? _b : error == null ? void 0 : error.status
);
if (status && STATUS_NO_RETRY2.includes(+status)) {
throw error;
}
if (((_c = error == null ? void 0 : error.error) == null ? void 0 : _c.code) === "insufficient_quota") {
const err = new Error(error == null ? void 0 : error.message);
err.name = "InsufficientQuotaError";
throw err;
}
};
var AsyncCaller2 = class {
constructor(params) {
var _a2, _b, _c;
Object.defineProperty(this, "maxConcurrency", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "maxRetries", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "onFailedAttempt", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "queue", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
this.maxConcurrency = (_a2 = params.maxConcurrency) != null ? _a2 : Infinity;
this.maxRetries = (_b = params.maxRetries) != null ? _b : 6;
this.onFailedAttempt = (_c = params.onFailedAttempt) != null ? _c : defaultFailedAttemptHandler;
const PQueue = "default" in import_p_queue3.default ? import_p_queue3.default.default : import_p_queue3.default;
this.queue = new PQueue({ concurrency: this.maxConcurrency });
}
// eslint-disable-next-line @typescript-eslint/no-explicit-any
call(callable, ...args) {
return this.queue.add(() => (0, import_p_retry2.default)(() => callable(...args).catch((error) => {
if (error instanceof Error) {
throw error;
} else {
throw new Error(error);
}
}), {
onFailedAttempt: this.onFailedAttempt,
retries: this.maxRetries,
randomize: true
// If needed we can change some of the defaults here,
// but they're quite sensible.
}), { throwOnTimeout: true });
}
// eslint-disable-next-line @typescript-eslint/no-explicit-any
callWithOptions(options, callable, ...args) {
if (options.signal) {
return Promise.race([
this.call(callable, ...args),
new Promise((_, reject) => {
var _a2;
(_a2 = options.signal) == null ? void 0 : _a2.addEventListener("abort", () => {
reject(new Error("AbortError"));
});
})
]);
}
return this.call(callable, ...args);
}
fetch(...args) {
return this.call(() => fetch(...args).then((res) => res.ok ? res : Promise.reject(res)));
}
};
// node_modules/langchain/node_modules/@langchain/core/dist/tracers/root_listener.js
var RootListenersTracer = class extends BaseTracer {
constructor({ config, onStart, onEnd, onError }) {
super();
Object.defineProperty(this, "name", {
enumerable: true,
configurable: true,
writable: true,
value: "RootListenersTracer"
});
Object.defineProperty(this, "rootId", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "config", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "argOnStart", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "argOnEnd", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "argOnError", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
this.config = config;
this.argOnStart = onStart;
this.argOnEnd = onEnd;
this.argOnError = onError;
}
/**
* This is a legacy method only called once for an entire run tree
* therefore not useful here
* @param {Run} _ Not used
*/
persistRun(_) {
return Promise.resolve();
}
async onRunCreate(run) {
if (this.rootId) {
return;
}
this.rootId = run.id;
if (this.argOnStart) {
if (this.argOnStart.length === 1) {
await this.argOnStart(run);
} else if (this.argOnStart.length === 2) {
await this.argOnStart(run, this.config);
}
}
}
async onRunUpdate(run) {
if (run.id !== this.rootId) {
return;
}
if (!run.error) {
if (this.argOnEnd) {
if (this.argOnEnd.length === 1) {
await this.argOnEnd(run);
} else if (this.argOnEnd.length === 2) {
await this.argOnEnd(run, this.config);
}
}
} else if (this.argOnError) {
if (this.argOnError.length === 1) {
await this.argOnError(run);
} else if (this.argOnError.length === 2) {
await this.argOnError(run, this.config);
}
}
}
};
// node_modules/langchain/node_modules/@langchain/core/dist/runnables/base.js
function _coerceToDict2(value, defaultKey) {
return value && !Array.isArray(value) && typeof value === "object" ? value : { [defaultKey]: value };
}
var Runnable = class extends Serializable {
constructor() {
super(...arguments);
Object.defineProperty(this, "lc_runnable", {
enumerable: true,
configurable: true,
writable: true,
value: true
});
}
/**
* Bind arguments to a Runnable, returning a new Runnable.
* @param kwargs
* @returns A new RunnableBinding that, when invoked, will apply the bound args.
*/
bind(kwargs) {
return new RunnableBinding({ bound: this, kwargs, config: {} });
}
/**
* Return a new Runnable that maps a list of inputs to a list of outputs,
* by calling invoke() with each input.
*/
map() {
return new RunnableEach({ bound: this });
}
/**
* Add retry logic to an existing runnable.
* @param kwargs
* @returns A new RunnableRetry that, when invoked, will retry according to the parameters.
*/
withRetry(fields) {
return new RunnableRetry({
bound: this,
kwargs: {},
config: {},
maxAttemptNumber: fields == null ? void 0 : fields.stopAfterAttempt,
...fields
});
}
/**
* Bind config to a Runnable, returning a new Runnable.
* @param config New configuration parameters to attach to the new runnable.
* @returns A new RunnableBinding with a config matching what's passed.
*/
withConfig(config) {
return new RunnableBinding({
bound: this,
config,
kwargs: {}
});
}
/**
* Create a new runnable from the current one that will try invoking
* other passed fallback runnables if the initial invocation fails.
* @param fields.fallbacks Other runnables to call if the runnable errors.
* @returns A new RunnableWithFallbacks.
*/
withFallbacks(fields) {
return new RunnableWithFallbacks({
runnable: this,
fallbacks: fields.fallbacks
});
}
_getOptionsList(options, length = 0) {
if (Array.isArray(options)) {
if (options.length !== length) {
throw new Error(`Passed "options" must be an array with the same length as the inputs, but got ${options.length} options for ${length} inputs`);
}
return options;
}
return Array.from({ length }, () => options);
}
async batch(inputs, options, batchOptions) {
const configList = this._getOptionsList(options != null ? options : {}, inputs.length);
const caller = new AsyncCaller2({
maxConcurrency: batchOptions == null ? void 0 : batchOptions.maxConcurrency,
onFailedAttempt: (e) => {
throw e;
}
});
const batchCalls = inputs.map((input, i) => caller.call(async () => {
try {
const result = await this.invoke(input, configList[i]);
return result;
} catch (e) {
if (batchOptions == null ? void 0 : batchOptions.returnExceptions) {
return e;
}
throw e;
}
}));
return Promise.all(batchCalls);
}
/**
* Default streaming implementation.
* Subclasses should override this method if they support streaming output.
* @param input
* @param options
*/
async *_streamIterator(input, options) {
yield this.invoke(input, options);
}
/**
* Stream output in chunks.
* @param input
* @param options
* @returns A readable stream that is also an iterable.
*/
async stream(input, options) {
return IterableReadableStream.fromAsyncGenerator(this._streamIterator(input, options));
}
_separateRunnableConfigFromCallOptions(options = {}) {
const runnableConfig = {
callbacks: options.callbacks,
tags: options.tags,
metadata: options.metadata,
runName: options.runName
};
const callOptions = { ...options };
delete callOptions.callbacks;
delete callOptions.tags;
delete callOptions.metadata;
delete callOptions.runName;
return [runnableConfig, callOptions];
}
async _callWithConfig(func, input, options) {
const callbackManager_ = await getCallbackMangerForConfig(options);
const runManager = await (callbackManager_ == null ? void 0 : callbackManager_.handleChainStart(this.toJSON(), _coerceToDict2(input, "input"), void 0, options == null ? void 0 : options.runType, void 0, void 0, options == null ? void 0 : options.runName));
let output;
try {
output = await func.bind(this)(input, options, runManager);
} catch (e) {
await (runManager == null ? void 0 : runManager.handleChainError(e));
throw e;
}
await (runManager == null ? void 0 : runManager.handleChainEnd(_coerceToDict2(output, "output")));
return output;
}
/**
* Internal method that handles batching and configuration for a runnable
* It takes a function, input values, and optional configuration, and
* returns a promise that resolves to the output values.
* @param func The function to be executed for each input value.
* @param input The input values to be processed.
* @param config Optional configuration for the function execution.
* @returns A promise that resolves to the output values.
*/
async _batchWithConfig(func, inputs, options, batchOptions) {
const optionsList = this._getOptionsList(options != null ? options : {}, inputs.length);
const callbackManagers = await Promise.all(optionsList.map(getCallbackMangerForConfig));
const runManagers = await Promise.all(callbackManagers.map((callbackManager, i) => callbackManager == null ? void 0 : callbackManager.handleChainStart(this.toJSON(), _coerceToDict2(inputs[i], "input"), void 0, optionsList[i].runType, void 0, void 0, optionsList[i].runName)));
let outputs;
try {
outputs = await func(inputs, optionsList, runManagers, batchOptions);
} catch (e) {
await Promise.all(runManagers.map((runManager) => runManager == null ? void 0 : runManager.handleChainError(e)));
throw e;
}
await Promise.all(runManagers.map((runManager) => runManager == null ? void 0 : runManager.handleChainEnd(_coerceToDict2(outputs, "output"))));
return outputs;
}
/**
* Helper method to transform an Iterator of Input values into an Iterator of
* Output values, with callbacks.
* Use this to implement `stream()` or `transform()` in Runnable subclasses.
*/
async *_transformStreamWithConfig(inputGenerator, transformer, options) {
let finalInput;
let finalInputSupported = true;
let finalOutput;
let finalOutputSupported = true;
const callbackManager_ = await getCallbackMangerForConfig(options);
let runManager;
const serializedRepresentation = this.toJSON();
async function* wrapInputForTracing() {
for await (const chunk of inputGenerator) {
if (!runManager) {
runManager = await (callbackManager_ == null ? void 0 : callbackManager_.handleChainStart(serializedRepresentation, { input: "" }, void 0, options == null ? void 0 : options.runType, void 0, void 0, options == null ? void 0 : options.runName));
}
if (finalInputSupported) {
if (finalInput === void 0) {
finalInput = chunk;
} else {
try {
finalInput = finalInput.concat(chunk);
} catch (e) {
finalInput = void 0;
finalInputSupported = false;
}
}
}
yield chunk;
}
}
const wrappedInputGenerator = wrapInputForTracing();
try {
const outputIterator = transformer(wrappedInputGenerator, runManager, options);
for await (const chunk of outputIterator) {
yield chunk;
if (finalOutputSupported) {
if (finalOutput === void 0) {
finalOutput = chunk;
} else {
try {
finalOutput = finalOutput.concat(chunk);
} catch (e) {
finalOutput = void 0;
finalOutputSupported = false;
}
}
}
}
} catch (e) {
await (runManager == null ? void 0 : runManager.handleChainError(e, void 0, void 0, void 0, {
inputs: _coerceToDict2(finalInput, "input")
}));
throw e;
}
await (runManager == null ? void 0 : runManager.handleChainEnd(finalOutput != null ? finalOutput : {}, void 0, void 0, void 0, { inputs: _coerceToDict2(finalInput, "input") }));
}
_patchConfig(config = {}, callbackManager = void 0) {
const newConfig = { ...config };
if (callbackManager !== void 0) {
delete newConfig.runName;
return { ...newConfig, callbacks: callbackManager };
}
return newConfig;
}
/**
* Create a new runnable sequence that runs each individual runnable in series,
* piping the output of one runnable into another runnable or runnable-like.
* @param coerceable A runnable, function, or object whose values are functions or runnables.
* @returns A new runnable sequence.
*/
pipe(coerceable) {
return new RunnableSequence({
first: this,
last: _coerceToRunnable(coerceable)
});
}
/**
* Default implementation of transform, which buffers input and then calls stream.
* Subclasses should override this method if they can start producing output while
* input is still being generated.
* @param generator
* @param options
*/
async *transform(generator, options) {
let finalChunk;
for await (const chunk of generator) {
if (finalChunk === void 0) {
finalChunk = chunk;
} else {
finalChunk = finalChunk.concat(chunk);
}
}
yield* this._streamIterator(finalChunk, options);
}
/**
* Stream all output from a runnable, as reported to the callback system.
* This includes all inner runs of LLMs, Retrievers, Tools, etc.
* Output is streamed as Log objects, which include a list of
* jsonpatch ops that describe how the state of the run has changed in each
* step, and the final state of the run.
* The jsonpatch ops can be applied in order to construct state.
* @param input
* @param options
* @param streamOptions
*/
async *streamLog(input, options, streamOptions) {
const stream = new LogStreamCallbackHandler({
...streamOptions,
autoClose: false
});
const config = options != null ? options : {};
const { callbacks } = config;
if (callbacks === void 0) {
config.callbacks = [stream];
} else if (Array.isArray(callbacks)) {
config.callbacks = callbacks.concat([stream]);
} else {
const copiedCallbacks = callbacks.copy();
copiedCallbacks.inheritableHandlers.push(stream);
config.callbacks = copiedCallbacks;
}
const runnableStream = await this.stream(input, config);
async function consumeRunnableStream() {
try {
for await (const chunk of runnableStream) {
const patch = new RunLogPatch({
ops: [
{
op: "add",
path: "/streamed_output/-",
value: chunk
}
]
});
await stream.writer.write(patch);
}
} finally {
await stream.writer.close();
}
}
const runnableStreamPromise = consumeRunnableStream();
try {
for await (const log of stream) {
yield log;
}
} finally {
await runnableStreamPromise;
}
}
// eslint-disable-next-line @typescript-eslint/no-explicit-any
static isRunnable(thing) {
return thing ? thing.lc_runnable : false;
}
/**
* Bind lifecycle listeners to a Runnable, returning a new Runnable.
* The Run object contains information about the run, including its id,
* type, input, output, error, startTime, endTime, and any tags or metadata
* added to the run.
*
* @param {Object} params - The object containing the callback functions.
* @param {(run: Run) => void} params.onStart - Called before the runnable starts running, with the Run object.
* @param {(run: Run) => void} params.onEnd - Called after the runnable finishes running, with the Run object.
* @param {(run: Run) => void} params.onError - Called if the runnable throws an error, with the Run object.
*/
withListeners({ onStart, onEnd, onError }) {
return new RunnableBinding({
bound: this,
config: {},
configFactories: [
(config) => ({
callbacks: [
new RootListenersTracer({
config,
onStart,
onEnd,
onError
})
]
})
]
});
}
};
var RunnableBinding = class extends Runnable {
static lc_name() {
return "RunnableBinding";
}
constructor(fields) {
super(fields);
Object.defineProperty(this, "lc_namespace", {
enumerable: true,
configurable: true,
writable: true,
value: ["langchain_core", "runnables"]
});
Object.defineProperty(this, "lc_serializable", {
enumerable: true,
configurable: true,
writable: true,
value: true
});
Object.defineProperty(this, "bound", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "config", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "kwargs", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "configFactories", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
this.bound = fields.bound;
this.kwargs = fields.kwargs;
this.config = fields.config;
this.configFactories = fields.configFactories;
}
async _mergeConfig(options) {
const config = mergeConfigs(this.config, options);
return mergeConfigs(config, ...this.configFactories ? await Promise.all(this.configFactories.map(async (configFactory) => await configFactory(config))) : []);
}
bind(kwargs) {
return this.constructor({
bound: this.bound,
kwargs: { ...this.kwargs, ...kwargs },
config: this.config
});
}
withConfig(config) {
return this.constructor({
bound: this.bound,
kwargs: this.kwargs,
config: { ...this.config, ...config }
});
}
withRetry(fields) {
return this.constructor({
bound: this.bound.withRetry(fields),
kwargs: this.kwargs,
config: this.config
});
}
async invoke(input, options) {
return this.bound.invoke(input, await this._mergeConfig({ ...options, ...this.kwargs }));
}
async batch(inputs, options, batchOptions) {
const mergedOptions = Array.isArray(options) ? await Promise.all(options.map(async (individualOption) => this._mergeConfig({
...individualOption,
...this.kwargs
}))) : await this._mergeConfig({ ...options, ...this.kwargs });
return this.bound.batch(inputs, mergedOptions, batchOptions);
}
async *_streamIterator(input, options) {
yield* this.bound._streamIterator(input, await this._mergeConfig({ ...options, ...this.kwargs }));
}
async stream(input, options) {
return this.bound.stream(input, await this._mergeConfig({ ...options, ...this.kwargs }));
}
async *transform(generator, options) {
yield* this.bound.transform(generator, await this._mergeConfig({ ...options, ...this.kwargs }));
}
static isRunnableBinding(thing) {
return thing.bound && Runnable.isRunnable(thing.bound);
}
/**
* Bind lifecycle listeners to a Runnable, returning a new Runnable.
* The Run object contains information about the run, including its id,
* type, input, output, error, startTime, endTime, and any tags or metadata
* added to the run.
*
* @param {Object} params - The object containing the callback functions.
* @param {(run: Run) => void} params.onStart - Called before the runnable starts running, with the Run object.
* @param {(run: Run) => void} params.onEnd - Called after the runnable finishes running, with the Run object.
* @param {(run: Run) => void} params.onError - Called if the runnable throws an error, with the Run object.
*/
withListeners({ onStart, onEnd, onError }) {
return new RunnableBinding({
bound: this.bound,
kwargs: this.kwargs,
config: this.config,
configFactories: [
(config) => ({
callbacks: [
new RootListenersTracer({
config,
onStart,
onEnd,
onError
})
]
})
]
});
}
};
var RunnableEach = class extends Runnable {
static lc_name() {
return "RunnableEach";
}
constructor(fields) {
super(fields);
Object.defineProperty(this, "lc_serializable", {
enumerable: true,
configurable: true,
writable: true,
value: true
});
Object.defineProperty(this, "lc_namespace", {
enumerable: true,
configurable: true,
writable: true,
value: ["langchain_core", "runnables"]
});
Object.defineProperty(this, "bound", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
this.bound = fields.bound;
}
/**
* Binds the runnable with the specified arguments.
* @param args The arguments to bind the runnable with.
* @returns A new instance of the `RunnableEach` class that is bound with the specified arguments.
*/
bind(kwargs) {
return new RunnableEach({
bound: this.bound.bind(kwargs)
});
}
/**
* Invokes the runnable with the specified input and configuration.
* @param input The input to invoke the runnable with.
* @param config The configuration to invoke the runnable with.
* @returns A promise that resolves to the output of the runnable.
*/
async invoke(inputs, config) {
return this._callWithConfig(this._invoke, inputs, config);
}
/**
* A helper method that is used to invoke the runnable with the specified input and configuration.
* @param input The input to invoke the runnable with.
* @param config The configuration to invoke the runnable with.
* @returns A promise that resolves to the output of the runnable.
*/
async _invoke(inputs, config, runManager) {
return this.bound.batch(inputs, this._patchConfig(config, runManager == null ? void 0 : runManager.getChild()));
}
/**
* Bind lifecycle listeners to a Runnable, returning a new Runnable.
* The Run object contains information about the run, including its id,
* type, input, output, error, startTime, endTime, and any tags or metadata
* added to the run.
*
* @param {Object} params - The object containing the callback functions.
* @param {(run: Run) => void} params.onStart - Called before the runnable starts running, with the Run object.
* @param {(run: Run) => void} params.onEnd - Called after the runnable finishes running, with the Run object.
* @param {(run: Run) => void} params.onError - Called if the runnable throws an error, with the Run object.
*/
withListeners({ onStart, onEnd, onError }) {
return new RunnableEach({
bound: this.bound.withListeners({ onStart, onEnd, onError })
});
}
};
var RunnableRetry = class extends RunnableBinding {
static lc_name() {
return "RunnableRetry";
}
constructor(fields) {
var _a2, _b;
super(fields);
Object.defineProperty(this, "lc_namespace", {
enumerable: true,
configurable: true,
writable: true,
value: ["langchain_core", "runnables"]
});
Object.defineProperty(this, "maxAttemptNumber", {
enumerable: true,
configurable: true,
writable: true,
value: 3
});
Object.defineProperty(this, "onFailedAttempt", {
enumerable: true,
configurable: true,
writable: true,
value: () => {
}
});
this.maxAttemptNumber = (_a2 = fields.maxAttemptNumber) != null ? _a2 : this.maxAttemptNumber;
this.onFailedAttempt = (_b = fields.onFailedAttempt) != null ? _b : this.onFailedAttempt;
}
_patchConfigForRetry(attempt, config, runManager) {
const tag = attempt > 1 ? `retry:attempt:${attempt}` : void 0;
return this._patchConfig(config, runManager == null ? void 0 : runManager.getChild(tag));
}
async _invoke(input, config, runManager) {
return (0, import_p_retry3.default)((attemptNumber) => super.invoke(input, this._patchConfigForRetry(attemptNumber, config, runManager)), {
onFailedAttempt: this.onFailedAttempt,
retries: Math.max(this.maxAttemptNumber - 1, 0),
randomize: true
});
}
/**
* Method that invokes the runnable with the specified input, run manager,
* and config. It handles the retry logic by catching any errors and
* recursively invoking itself with the updated config for the next retry
* attempt.
* @param input The input for the runnable.
* @param runManager The run manager for the runnable.
* @param config The config for the runnable.
* @returns A promise that resolves to the output of the runnable.
*/
async invoke(input, config) {
return this._callWithConfig(this._invoke, input, config);
}
async _batch(inputs, configs, runManagers, batchOptions) {
const resultsMap = {};
try {
await (0, import_p_retry3.default)(async (attemptNumber) => {
const remainingIndexes = inputs.map((_, i) => i).filter((i) => resultsMap[i.toString()] === void 0 || // eslint-disable-next-line no-instanceof/no-instanceof
resultsMap[i.toString()] instanceof Error);
const remainingInputs = remainingIndexes.map((i) => inputs[i]);
const patchedConfigs = remainingIndexes.map((i) => this._patchConfigForRetry(attemptNumber, configs == null ? void 0 : configs[i], runManagers == null ? void 0 : runManagers[i]));
const results = await super.batch(remainingInputs, patchedConfigs, {
...batchOptions,
returnExceptions: true
});
let firstException;
for (let i = 0; i < results.length; i += 1) {
const result = results[i];
const resultMapIndex = remainingIndexes[i];
if (result instanceof Error) {
if (firstException === void 0) {
firstException = result;
}
}
resultsMap[resultMapIndex.toString()] = result;
}
if (firstException) {
throw firstException;
}
return results;
}, {
onFailedAttempt: this.onFailedAttempt,
retries: Math.max(this.maxAttemptNumber - 1, 0),
randomize: true
});
} catch (e) {
if ((batchOptions == null ? void 0 : batchOptions.returnExceptions) !== true) {
throw e;
}
}
return Object.keys(resultsMap).sort((a, b) => parseInt(a, 10) - parseInt(b, 10)).map((key) => resultsMap[parseInt(key, 10)]);
}
async batch(inputs, options, batchOptions) {
return this._batchWithConfig(this._batch.bind(this), inputs, options, batchOptions);
}
};
var RunnableSequence = class extends Runnable {
static lc_name() {
return "RunnableSequence";
}
constructor(fields) {
var _a2;
super(fields);
Object.defineProperty(this, "first", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "middle", {
enumerable: true,
configurable: true,
writable: true,
value: []
});
Object.defineProperty(this, "last", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "lc_serializable", {
enumerable: true,
configurable: true,
writable: true,
value: true
});
Object.defineProperty(this, "lc_namespace", {
enumerable: true,
configurable: true,
writable: true,
value: ["langchain_core", "runnables"]
});
this.first = fields.first;
this.middle = (_a2 = fields.middle) != null ? _a2 : this.middle;
this.last = fields.last;
}
get steps() {
return [this.first, ...this.middle, this.last];
}
async invoke(input, options) {
const callbackManager_ = await getCallbackMangerForConfig(options);
const runManager = await (callbackManager_ == null ? void 0 : callbackManager_.handleChainStart(this.toJSON(), _coerceToDict2(input, "input"), void 0, void 0, void 0, void 0, options == null ? void 0 : options.runName));
let nextStepInput = input;
let finalOutput;
try {
const initialSteps = [this.first, ...this.middle];
for (let i = 0; i < initialSteps.length; i += 1) {
const step = initialSteps[i];
nextStepInput = await step.invoke(nextStepInput, this._patchConfig(options, runManager == null ? void 0 : runManager.getChild(`seq:step:${i + 1}`)));
}
finalOutput = await this.last.invoke(nextStepInput, this._patchConfig(options, runManager == null ? void 0 : runManager.getChild(`seq:step:${this.steps.length}`)));
} catch (e) {
await (runManager == null ? void 0 : runManager.handleChainError(e));
throw e;
}
await (runManager == null ? void 0 : runManager.handleChainEnd(_coerceToDict2(finalOutput, "output")));
return finalOutput;
}
async batch(inputs, options, batchOptions) {
const configList = this._getOptionsList(options != null ? options : {}, inputs.length);
const callbackManagers = await Promise.all(configList.map(getCallbackMangerForConfig));
const runManagers = await Promise.all(callbackManagers.map((callbackManager, i) => callbackManager == null ? void 0 : callbackManager.handleChainStart(this.toJSON(), _coerceToDict2(inputs[i], "input"), void 0, void 0, void 0, void 0, configList[i].runName)));
let nextStepInputs = inputs;
let finalOutputs;
try {
const initialSteps = [this.first, ...this.middle];
for (let i = 0; i < initialSteps.length; i += 1) {
const step = initialSteps[i];
nextStepInputs = await step.batch(nextStepInputs, runManagers.map((runManager, j) => this._patchConfig(configList[j], runManager == null ? void 0 : runManager.getChild(`seq:step:${i + 1}`))), batchOptions);
}
finalOutputs = await this.last.batch(nextStepInputs, runManagers.map((runManager) => this._patchConfig(configList[this.steps.length - 1], runManager == null ? void 0 : runManager.getChild(`seq:step:${this.steps.length}`))), batchOptions);
} catch (e) {
await Promise.all(runManagers.map((runManager) => runManager == null ? void 0 : runManager.handleChainError(e)));
throw e;
}
await Promise.all(runManagers.map((runManager, i) => runManager == null ? void 0 : runManager.handleChainEnd(_coerceToDict2(finalOutputs[i], "output"))));
return finalOutputs;
}
async *_streamIterator(input, options) {
const callbackManager_ = await getCallbackMangerForConfig(options);
const runManager = await (callbackManager_ == null ? void 0 : callbackManager_.handleChainStart(this.toJSON(), _coerceToDict2(input, "input"), void 0, void 0, void 0, void 0, options == null ? void 0 : options.runName));
const steps = [this.first, ...this.middle, this.last];
let concatSupported = true;
let finalOutput;
async function* inputGenerator() {
yield input;
}
try {
let finalGenerator = steps[0].transform(inputGenerator(), this._patchConfig(options, runManager == null ? void 0 : runManager.getChild(`seq:step:1`)));
for (let i = 1; i < steps.length; i += 1) {
const step = steps[i];
finalGenerator = await step.transform(finalGenerator, this._patchConfig(options, runManager == null ? void 0 : runManager.getChild(`seq:step:${i + 1}`)));
}
for await (const chunk of finalGenerator) {
yield chunk;
if (concatSupported) {
if (finalOutput === void 0) {
finalOutput = chunk;
} else {
try {
finalOutput = finalOutput.concat(chunk);
} catch (e) {
finalOutput = void 0;
concatSupported = false;
}
}
}
}
} catch (e) {
await (runManager == null ? void 0 : runManager.handleChainError(e));
throw e;
}
await (runManager == null ? void 0 : runManager.handleChainEnd(_coerceToDict2(finalOutput, "output")));
}
pipe(coerceable) {
if (RunnableSequence.isRunnableSequence(coerceable)) {
return new RunnableSequence({
first: this.first,
middle: this.middle.concat([
this.last,
coerceable.first,
...coerceable.middle
]),
last: coerceable.last
});
} else {
return new RunnableSequence({
first: this.first,
middle: [...this.middle, this.last],
last: _coerceToRunnable(coerceable)
});
}
}
// eslint-disable-next-line @typescript-eslint/no-explicit-any
static isRunnableSequence(thing) {
return Array.isArray(thing.middle) && Runnable.isRunnable(thing);
}
// eslint-disable-next-line @typescript-eslint/no-explicit-any
static from([first, ...runnables]) {
return new RunnableSequence({
first: _coerceToRunnable(first),
middle: runnables.slice(0, -1).map(_coerceToRunnable),
last: _coerceToRunnable(runnables[runnables.length - 1])
});
}
};
var RunnableMap = class extends Runnable {
static lc_name() {
return "RunnableMap";
}
getStepsKeys() {
return Object.keys(this.steps);
}
constructor(fields) {
super(fields);
Object.defineProperty(this, "lc_namespace", {
enumerable: true,
configurable: true,
writable: true,
value: ["langchain_core", "runnables"]
});
Object.defineProperty(this, "lc_serializable", {
enumerable: true,
configurable: true,
writable: true,
value: true
});
Object.defineProperty(this, "steps", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
this.steps = {};
for (const [key, value] of Object.entries(fields.steps)) {
this.steps[key] = _coerceToRunnable(value);
}
}
static from(steps) {
return new RunnableMap({ steps });
}
async invoke(input, options) {
const callbackManager_ = await getCallbackMangerForConfig(options);
const runManager = await (callbackManager_ == null ? void 0 : callbackManager_.handleChainStart(this.toJSON(), {
input
}, void 0, void 0, void 0, void 0, options == null ? void 0 : options.runName));
const output = {};
try {
await Promise.all(Object.entries(this.steps).map(async ([key, runnable]) => {
output[key] = await runnable.invoke(input, this._patchConfig(options, runManager == null ? void 0 : runManager.getChild(key)));
}));
} catch (e) {
await (runManager == null ? void 0 : runManager.handleChainError(e));
throw e;
}
await (runManager == null ? void 0 : runManager.handleChainEnd(output));
return output;
}
};
var RunnableLambda = class extends Runnable {
static lc_name() {
return "RunnableLambda";
}
constructor(fields) {
super(fields);
Object.defineProperty(this, "lc_namespace", {
enumerable: true,
configurable: true,
writable: true,
value: ["langchain_core", "runnables"]
});
Object.defineProperty(this, "func", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
this.func = fields.func;
}
static from(func) {
return new RunnableLambda({
func
});
}
async _invoke(input, config, runManager) {
let output = await this.func(input, { config });
if (output && Runnable.isRunnable(output)) {
output = await output.invoke(input, this._patchConfig(config, runManager == null ? void 0 : runManager.getChild()));
}
return output;
}
async invoke(input, options) {
return this._callWithConfig(this._invoke, input, options);
}
};
var RunnableWithFallbacks = class extends Runnable {
static lc_name() {
return "RunnableWithFallbacks";
}
constructor(fields) {
super(fields);
Object.defineProperty(this, "lc_namespace", {
enumerable: true,
configurable: true,
writable: true,
value: ["langchain_core", "runnables"]
});
Object.defineProperty(this, "lc_serializable", {
enumerable: true,
configurable: true,
writable: true,
value: true
});
Object.defineProperty(this, "runnable", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "fallbacks", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
this.runnable = fields.runnable;
this.fallbacks = fields.fallbacks;
}
*runnables() {
yield this.runnable;
for (const fallback of this.fallbacks) {
yield fallback;
}
}
async invoke(input, options) {
const callbackManager_ = await CallbackManager.configure(options == null ? void 0 : options.callbacks, void 0, options == null ? void 0 : options.tags, void 0, options == null ? void 0 : options.metadata);
const runManager = await (callbackManager_ == null ? void 0 : callbackManager_.handleChainStart(this.toJSON(), _coerceToDict2(input, "input"), void 0, void 0, void 0, void 0, options == null ? void 0 : options.runName));
let firstError;
for (const runnable of this.runnables()) {
try {
const output = await runnable.invoke(input, this._patchConfig(options, runManager == null ? void 0 : runManager.getChild()));
await (runManager == null ? void 0 : runManager.handleChainEnd(_coerceToDict2(output, "output")));
return output;
} catch (e) {
if (firstError === void 0) {
firstError = e;
}
}
}
if (firstError === void 0) {
throw new Error("No error stored at end of fallback.");
}
await (runManager == null ? void 0 : runManager.handleChainError(firstError));
throw firstError;
}
async batch(inputs, options, batchOptions) {
if (batchOptions == null ? void 0 : batchOptions.returnExceptions) {
throw new Error("Not implemented.");
}
const configList = this._getOptionsList(options != null ? options : {}, inputs.length);
const callbackManagers = await Promise.all(configList.map((config) => CallbackManager.configure(config == null ? void 0 : config.callbacks, void 0, config == null ? void 0 : config.tags, void 0, config == null ? void 0 : config.metadata)));
const runManagers = await Promise.all(callbackManagers.map((callbackManager, i) => callbackManager == null ? void 0 : callbackManager.handleChainStart(this.toJSON(), _coerceToDict2(inputs[i], "input"), void 0, void 0, void 0, void 0, configList[i].runName)));
let firstError;
for (const runnable of this.runnables()) {
try {
const outputs = await runnable.batch(inputs, runManagers.map((runManager, j) => this._patchConfig(configList[j], runManager == null ? void 0 : runManager.getChild())), batchOptions);
await Promise.all(runManagers.map((runManager, i) => runManager == null ? void 0 : runManager.handleChainEnd(_coerceToDict2(outputs[i], "output"))));
return outputs;
} catch (e) {
if (firstError === void 0) {
firstError = e;
}
}
}
if (!firstError) {
throw new Error("No error stored at end of fallbacks.");
}
await Promise.all(runManagers.map((runManager) => runManager == null ? void 0 : runManager.handleChainError(firstError)));
throw firstError;
}
};
function _coerceToRunnable(coerceable) {
if (typeof coerceable === "function") {
return new RunnableLambda({ func: coerceable });
} else if (Runnable.isRunnable(coerceable)) {
return coerceable;
} else if (!Array.isArray(coerceable) && typeof coerceable === "object") {
const runnables = {};
for (const [key, value] of Object.entries(coerceable)) {
runnables[key] = _coerceToRunnable(value);
}
return new RunnableMap({
steps: runnables
});
} else {
throw new Error(`Expected a Runnable, function or object.
Instead got an unsupported type.`);
}
}
// node_modules/ml-distance/lib-esm/similarities/czekanowski.js
function czekanowskiSimilarity(a, b) {
let up = 0;
let down = 0;
for (let i = 0; i < a.length; i++) {
up += Math.min(a[i], b[i]);
down += a[i] + b[i];
}
return 2 * up / down;
}
// node_modules/ml-distance/lib-esm/distances/dice.js
function dice(a, b) {
let a2 = 0;
let b2 = 0;
let prod2 = 0;
for (let i = 0; i < a.length; i++) {
a2 += a[i] * a[i];
b2 += b[i] * b[i];
prod2 += (a[i] - b[i]) * (a[i] - b[i]);
}
return prod2 / (a2 + b2);
}
// node_modules/ml-distance/lib-esm/distances/intersection.js
function intersection(a, b) {
let ans = 0;
for (let i = 0; i < a.length; i++) {
ans += Math.min(a[i], b[i]);
}
return 1 - ans;
}
// node_modules/ml-distance/lib-esm/similarities/kumarHassebrook.js
function kumarHassebrook(a, b) {
let p = 0;
let p2 = 0;
let q2 = 0;
for (let i = 0; i < a.length; i++) {
p += a[i] * b[i];
p2 += a[i] * a[i];
q2 += b[i] * b[i];
}
return p / (p2 + q2 - p);
}
// node_modules/ml-distance/lib-esm/distances/kulczynski.js
function kulczynski(a, b) {
let up = 0;
let down = 0;
for (let i = 0; i < a.length; i++) {
up += Math.abs(a[i] - b[i]);
down += Math.min(a[i], b[i]);
}
return up / down;
}
// node_modules/ml-distance/lib-esm/distances/motyka.js
function motyka(a, b) {
let up = 0;
let down = 0;
for (let i = 0; i < a.length; i++) {
up += Math.min(a[i], b[i]);
down += a[i] + b[i];
}
return 1 - up / down;
}
// node_modules/ml-distance/lib-esm/distances/squaredChord.js
function squaredChord(a, b) {
let ans = 0;
for (let i = 0; i < a.length; i++) {
ans += (Math.sqrt(a[i]) - Math.sqrt(b[i])) ** 2;
}
return ans;
}
// node_modules/ml-distance/lib-esm/similarities/tanimoto.js
function tanimoto(a, b, bitvector) {
if (bitvector) {
let inter = 0;
let union = 0;
for (let j = 0; j < a.length; j++) {
inter += a[j] && b[j];
union += a[j] || b[j];
}
if (union === 0) {
return 1;
}
return inter / union;
} else {
let p = 0;
let q = 0;
let m = 0;
for (let i = 0; i < a.length; i++) {
p += a[i];
q += b[i];
m += Math.min(a[i], b[i]);
}
return 1 - (p + q - 2 * m) / (p + q - m);
}
}
// node_modules/ml-distance/lib-esm/similarities.js
var similarities_exports = {};
__export(similarities_exports, {
cosine: () => cosine,
czekanowski: () => czekanowskiSimilarity,
dice: () => dice2,
intersection: () => intersection2,
kulczynski: () => kulczynski2,
kumarHassebrook: () => kumarHassebrook,
motyka: () => motyka2,
pearson: () => pearson2,
squaredChord: () => squaredChord2,
tanimoto: () => tanimoto,
tree: () => src_exports
});
// node_modules/ml-tree-similarity/src/index.js
var src_exports = {};
__export(src_exports, {
createTree: () => createTree,
getFunction: () => getFunction,
treeSimilarity: () => treeSimilarity
});
// node_modules/ml-tree-similarity/src/createTree.js
var import_binary_search = __toESM(require_binary_search());
var import_num_sort = __toESM(require_num_sort());
function createTree(spectrum, options = {}) {
var X = spectrum[0];
const {
minWindow = 0.16,
threshold = 0.01,
from = X[0],
to = X[X.length - 1]
} = options;
return mainCreateTree(
spectrum[0],
spectrum[1],
from,
to,
minWindow,
threshold
);
}
function mainCreateTree(X, Y, from, to, minWindow, threshold) {
if (to - from < minWindow) {
return null;
}
var start = (0, import_binary_search.default)(X, from, import_num_sort.ascending);
if (start < 0) {
start = ~start;
}
var sum2 = 0;
var center = 0;
for (var i = start; i < X.length; i++) {
if (X[i] >= to) {
break;
}
sum2 += Y[i];
center += X[i] * Y[i];
}
if (sum2 < threshold) {
return null;
}
center /= sum2;
if (center - from < 1e-6 || to - center < 1e-6) {
return null;
}
if (center - from < minWindow / 4) {
return mainCreateTree(X, Y, center, to, minWindow, threshold);
} else {
if (to - center < minWindow / 4) {
return mainCreateTree(X, Y, from, center, minWindow, threshold);
} else {
return new Tree(
sum2,
center,
mainCreateTree(X, Y, from, center, minWindow, threshold),
mainCreateTree(X, Y, center, to, minWindow, threshold)
);
}
}
}
var Tree = class {
constructor(sum2, center, left, right) {
this.sum = sum2;
this.center = center;
this.left = left;
this.right = right;
}
};
// node_modules/ml-tree-similarity/src/getSimilarity.js
function getSimilarity(a, b, options = {}) {
const { alpha = 0.1, beta = 0.33, gamma = 1e-3 } = options;
if (a === null || b === null) {
return 0;
}
if (Array.isArray(a)) {
a = createTree(a);
}
if (Array.isArray(b)) {
b = createTree(b);
}
var C = alpha * Math.min(a.sum, b.sum) / Math.max(a.sum, b.sum) + (1 - alpha) * Math.exp(-gamma * Math.abs(a.center - b.center));
return beta * C + (1 - beta) * (getSimilarity(a.left, b.left, options) + getSimilarity(a.right, b.right, options)) / 2;
}
// node_modules/ml-tree-similarity/src/index.js
function treeSimilarity(A, B, options = {}) {
return getSimilarity(A, B, options);
}
function getFunction(options = {}) {
return (A, B) => getSimilarity(A, B, options);
}
// node_modules/ml-distance/lib-esm/similarities/cosine.js
function cosine(a, b) {
let p = 0;
let p2 = 0;
let q2 = 0;
for (let i = 0; i < a.length; i++) {
p += a[i] * b[i];
p2 += a[i] * a[i];
q2 += b[i] * b[i];
}
return p / (Math.sqrt(p2) * Math.sqrt(q2));
}
// node_modules/ml-distance/lib-esm/similarities/dice.js
function dice2(a, b) {
return 1 - dice(a, b);
}
// node_modules/ml-distance/lib-esm/similarities/intersection.js
function intersection2(a, b) {
return 1 - intersection(a, b);
}
// node_modules/ml-distance/lib-esm/similarities/kulczynski.js
function kulczynski2(a, b) {
return 1 / kulczynski(a, b);
}
// node_modules/ml-distance/lib-esm/similarities/motyka.js
function motyka2(a, b) {
return 1 - motyka(a, b);
}
// node_modules/is-any-array/lib-esm/index.js
var toString = Object.prototype.toString;
function isAnyArray(value) {
const tag = toString.call(value);
return tag.endsWith("Array]") && !tag.includes("Big");
}
// node_modules/ml-array-sum/lib-es6/index.js
function sum(input) {
if (!isAnyArray(input)) {
throw new TypeError("input must be an array");
}
if (input.length === 0) {
throw new TypeError("input must not be empty");
}
var sumValue = 0;
for (var i = 0; i < input.length; i++) {
sumValue += input[i];
}
return sumValue;
}
// node_modules/ml-array-mean/lib-es6/index.js
function mean(input) {
return sum(input) / input.length;
}
// node_modules/ml-distance/lib-esm/similarities/pearson.js
function pearson2(a, b) {
let avgA = mean(a);
let avgB = mean(b);
let newA = new Array(a.length);
let newB = new Array(b.length);
for (let i = 0; i < newA.length; i++) {
newA[i] = a[i] - avgA;
newB[i] = b[i] - avgB;
}
return cosine(newA, newB);
}
// node_modules/ml-distance/lib-esm/similarities/squaredChord.js
function squaredChord2(a, b) {
return 1 - squaredChord(a, b);
}
// node_modules/langchain/node_modules/@langchain/core/dist/retrievers.js
var BaseRetriever = class extends Runnable {
constructor(fields) {
var _a2, _b, _c;
super(fields);
Object.defineProperty(this, "callbacks", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "tags", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "metadata", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "verbose", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
this.callbacks = fields == null ? void 0 : fields.callbacks;
this.tags = (_a2 = fields == null ? void 0 : fields.tags) != null ? _a2 : [];
this.metadata = (_b = fields == null ? void 0 : fields.metadata) != null ? _b : {};
this.verbose = (_c = fields == null ? void 0 : fields.verbose) != null ? _c : false;
}
/**
* TODO: This should be an abstract method, but we'd like to avoid breaking
* changes to people currently using subclassed custom retrievers.
* Change it on next major release.
*/
_getRelevantDocuments(_query, _callbacks) {
throw new Error("Not implemented!");
}
async invoke(input, options) {
return this.getRelevantDocuments(input, options);
}
/**
* Main method used to retrieve relevant documents. It takes a query
* string and an optional configuration object, and returns a promise that
* resolves to an array of `Document` objects. This method handles the
* retrieval process, including starting and ending callbacks, and error
* handling.
* @param query The query string to retrieve relevant documents for.
* @param config Optional configuration object for the retrieval process.
* @returns A promise that resolves to an array of `Document` objects.
*/
async getRelevantDocuments(query, config) {
const parsedConfig = parseCallbackConfigArg(config);
const callbackManager_ = await CallbackManager.configure(parsedConfig.callbacks, this.callbacks, parsedConfig.tags, this.tags, parsedConfig.metadata, this.metadata, { verbose: this.verbose });
const runManager = await (callbackManager_ == null ? void 0 : callbackManager_.handleRetrieverStart(this.toJSON(), query, void 0, void 0, void 0, void 0, parsedConfig.runName));
try {
const results = await this._getRelevantDocuments(query, runManager);
await (runManager == null ? void 0 : runManager.handleRetrieverEnd(results));
return results;
} catch (error) {
await (runManager == null ? void 0 : runManager.handleRetrieverError(error));
throw error;
}
}
};
// node_modules/langchain/dist/vectorstores/base.js
var VectorStoreRetriever = class extends BaseRetriever {
static lc_name() {
return "VectorStoreRetriever";
}
get lc_namespace() {
return ["langchain", "retrievers", "base"];
}
_vectorstoreType() {
return this.vectorStore._vectorstoreType();
}
constructor(fields) {
var _a2, _b;
super(fields);
Object.defineProperty(this, "vectorStore", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "k", {
enumerable: true,
configurable: true,
writable: true,
value: 4
});
Object.defineProperty(this, "searchType", {
enumerable: true,
configurable: true,
writable: true,
value: "similarity"
});
Object.defineProperty(this, "searchKwargs", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "filter", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
this.vectorStore = fields.vectorStore;
this.k = (_a2 = fields.k) != null ? _a2 : this.k;
this.searchType = (_b = fields.searchType) != null ? _b : this.searchType;
this.filter = fields.filter;
if (fields.searchType === "mmr") {
this.searchKwargs = fields.searchKwargs;
}
}
async _getRelevantDocuments(query, runManager) {
if (this.searchType === "mmr") {
if (typeof this.vectorStore.maxMarginalRelevanceSearch !== "function") {
throw new Error(`The vector store backing this retriever, ${this._vectorstoreType()} does not support max marginal relevance search.`);
}
return this.vectorStore.maxMarginalRelevanceSearch(query, {
k: this.k,
filter: this.filter,
...this.searchKwargs
}, runManager == null ? void 0 : runManager.getChild("vectorstore"));
}
return this.vectorStore.similaritySearch(query, this.k, this.filter, runManager == null ? void 0 : runManager.getChild("vectorstore"));
}
async addDocuments(documents, options) {
return this.vectorStore.addDocuments(documents, options);
}
};
var VectorStore = class extends Serializable {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
constructor(embeddings, dbConfig) {
super(dbConfig);
Object.defineProperty(this, "lc_namespace", {
enumerable: true,
configurable: true,
writable: true,
value: ["langchain", "vectorstores", this._vectorstoreType()]
});
Object.defineProperty(this, "embeddings", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
this.embeddings = embeddings;
}
// eslint-disable-next-line @typescript-eslint/no-explicit-any
async delete(_params) {
throw new Error("Not implemented.");
}
async similaritySearch(query, k = 4, filter = void 0, _callbacks = void 0) {
const results = await this.similaritySearchVectorWithScore(await this.embeddings.embedQuery(query), k, filter);
return results.map((result) => result[0]);
}
async similaritySearchWithScore(query, k = 4, filter = void 0, _callbacks = void 0) {
return this.similaritySearchVectorWithScore(await this.embeddings.embedQuery(query), k, filter);
}
static fromTexts(_texts, _metadatas, _embeddings, _dbConfig) {
throw new Error("the Langchain vectorstore implementation you are using forgot to override this, please report a bug");
}
static fromDocuments(_docs, _embeddings, _dbConfig) {
throw new Error("the Langchain vectorstore implementation you are using forgot to override this, please report a bug");
}
asRetriever(kOrFields, filter, callbacks, tags, metadata, verbose) {
var _a2;
if (typeof kOrFields === "number") {
return new VectorStoreRetriever({
vectorStore: this,
k: kOrFields,
filter,
tags: [...tags != null ? tags : [], this._vectorstoreType()],
metadata,
verbose,
callbacks
});
} else {
const params = {
vectorStore: this,
k: kOrFields == null ? void 0 : kOrFields.k,
filter: kOrFields == null ? void 0 : kOrFields.filter,
tags: [...(_a2 = kOrFields == null ? void 0 : kOrFields.tags) != null ? _a2 : [], this._vectorstoreType()],
metadata: kOrFields == null ? void 0 : kOrFields.metadata,
verbose: kOrFields == null ? void 0 : kOrFields.verbose,
callbacks: kOrFields == null ? void 0 : kOrFields.callbacks,
searchType: kOrFields == null ? void 0 : kOrFields.searchType
};
if ((kOrFields == null ? void 0 : kOrFields.searchType) === "mmr") {
return new VectorStoreRetriever({
...params,
searchKwargs: kOrFields.searchKwargs
});
}
return new VectorStoreRetriever({ ...params });
}
}
};
// node_modules/langchain/dist/vectorstores/memory.js
var MemoryVectorStore = class extends VectorStore {
_vectorstoreType() {
return "memory";
}
constructor(embeddings, { similarity, ...rest } = {}) {
super(embeddings, rest);
Object.defineProperty(this, "memoryVectors", {
enumerable: true,
configurable: true,
writable: true,
value: []
});
Object.defineProperty(this, "similarity", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
this.similarity = similarity != null ? similarity : similarities_exports.cosine;
}
/**
* Method to add documents to the memory vector store. It extracts the
* text from each document, generates embeddings for them, and adds the
* resulting vectors to the store.
* @param documents Array of `Document` instances to be added to the store.
* @returns Promise that resolves when all documents have been added.
*/
async addDocuments(documents) {
const texts = documents.map(({ pageContent }) => pageContent);
return this.addVectors(await this.embeddings.embedDocuments(texts), documents);
}
/**
* Method to add vectors to the memory vector store. It creates
* `MemoryVector` instances for each vector and document pair and adds
* them to the store.
* @param vectors Array of vectors to be added to the store.
* @param documents Array of `Document` instances corresponding to the vectors.
* @returns Promise that resolves when all vectors have been added.
*/
async addVectors(vectors, documents) {
const memoryVectors = vectors.map((embedding, idx) => ({
content: documents[idx].pageContent,
embedding,
metadata: documents[idx].metadata
}));
this.memoryVectors = this.memoryVectors.concat(memoryVectors);
}
/**
* Method to perform a similarity search in the memory vector store. It
* calculates the similarity between the query vector and each vector in
* the store, sorts the results by similarity, and returns the top `k`
* results along with their scores.
* @param query Query vector to compare against the vectors in the store.
* @param k Number of top results to return.
* @param filter Optional filter function to apply to the vectors before performing the search.
* @returns Promise that resolves with an array of tuples, each containing a `Document` and its similarity score.
*/
async similaritySearchVectorWithScore(query, k, filter) {
const filterFunction = (memoryVector) => {
if (!filter) {
return true;
}
const doc = new Document({
metadata: memoryVector.metadata,
pageContent: memoryVector.content
});
return filter(doc);
};
const filteredMemoryVectors = this.memoryVectors.filter(filterFunction);
const searches = filteredMemoryVectors.map((vector, index) => ({
similarity: this.similarity(query, vector.embedding),
index
})).sort((a, b) => a.similarity > b.similarity ? -1 : 0).slice(0, k);
const result = searches.map((search) => [
new Document({
metadata: filteredMemoryVectors[search.index].metadata,
pageContent: filteredMemoryVectors[search.index].content
}),
search.similarity
]);
return result;
}
/**
* Static method to create a `MemoryVectorStore` instance from an array of
* texts. It creates a `Document` for each text and metadata pair, and
* adds them to the store.
* @param texts Array of texts to be added to the store.
* @param metadatas Array or single object of metadata corresponding to the texts.
* @param embeddings `Embeddings` instance used to generate embeddings for the texts.
* @param dbConfig Optional `MemoryVectorStoreArgs` to configure the `MemoryVectorStore` instance.
* @returns Promise that resolves with a new `MemoryVectorStore` instance.
*/
static async fromTexts(texts, metadatas, embeddings, dbConfig) {
const docs = [];
for (let i = 0; i < texts.length; i += 1) {
const metadata = Array.isArray(metadatas) ? metadatas[i] : metadatas;
const newDoc = new Document({
pageContent: texts[i],
metadata
});
docs.push(newDoc);
}
return MemoryVectorStore.fromDocuments(docs, embeddings, dbConfig);
}
/**
* Static method to create a `MemoryVectorStore` instance from an array of
* `Document` instances. It adds the documents to the store.
* @param docs Array of `Document` instances to be added to the store.
* @param embeddings `Embeddings` instance used to generate embeddings for the documents.
* @param dbConfig Optional `MemoryVectorStoreArgs` to configure the `MemoryVectorStore` instance.
* @returns Promise that resolves with a new `MemoryVectorStore` instance.
*/
static async fromDocuments(docs, embeddings, dbConfig) {
const instance = new this(embeddings, dbConfig);
await instance.addDocuments(docs);
return instance;
}
/**
* Static method to create a `MemoryVectorStore` instance from an existing
* index. It creates a new `MemoryVectorStore` instance without adding any
* documents or vectors.
* @param embeddings `Embeddings` instance used to generate embeddings for the documents.
* @param dbConfig Optional `MemoryVectorStoreArgs` to configure the `MemoryVectorStore` instance.
* @returns Promise that resolves with a new `MemoryVectorStore` instance.
*/
static async fromExistingIndex(embeddings, dbConfig) {
const instance = new this(embeddings, dbConfig);
return instance;
}
};
// src/text-processing.ts
var MAX_CHUNK_SIZE = 1e3;
function preprocessContent(content) {
logger.debug("Preprocessing content", { contentLength: content.length });
return content.replace(/^---\n[\s\S]*?\n---\n/, "").replace(/```[\s\S]*?```/g, "").replace(/^(#+)\s*$\n/gm, "").replace(/^(#+)\s*(?!$)[^\n]+\n(?=\s*(?:\1#|\s*$)(?!\s*\S))/gm, "").replace(/\n{3,}/g, "\n\n");
}
function splitContent(content) {
logger.debug("Splitting content", { contentLength: content.length });
const sections = content.split(/^---$/m).flatMap((section) => splitByHeaders(section.trim()));
return sections.flatMap((section) => splitSectionWithLists(section)).filter((chunk) => chunk.length > 0);
}
function splitByHeaders(text) {
const headerRegex = /^(#{1,6})\s+(.+)$/gm;
const sections = [];
let lastIndex = 0;
let lastHeader = "";
let match;
while ((match = headerRegex.exec(text)) !== null) {
if (lastIndex < match.index) {
sections.push(
lastHeader + text.slice(lastIndex, match.index).trim()
);
}
lastHeader = match[0] + "\n";
lastIndex = headerRegex.lastIndex;
}
if (lastIndex < text.length) {
sections.push(lastHeader + text.slice(lastIndex).trim());
}
return sections.filter((section) => section.length > 0);
}
function splitSectionWithLists(section) {
const lines = section.split("\n");
const result = lines.reduce(processLine, {
chunks: [],
currentChunk: "",
inList: false,
lastNonListText: ""
});
return result.currentChunk ? [...result.chunks, result.currentChunk.trim()] : result.chunks;
}
function processLine(state, line) {
const isListItem = /^(\s*[-*+]|\s*\d+\.)/.test(line);
const isHeader = /^(#{1,6}\s|[*_]{2}).+/.test(line);
if (isHeader) {
return handleHeader(state, line);
}
if (isListItem) {
return handleListItem(state, line);
}
if (state.inList && !line.trim()) {
return { ...state, currentChunk: state.currentChunk + "\n" + line };
}
return handleRegularLine(state, line);
}
function handleHeader(state, line) {
const { chunks, currentChunk } = state;
return {
chunks: currentChunk ? [...chunks, currentChunk.trim()] : chunks,
currentChunk: line,
inList: false,
lastNonListText: line
};
}
function handleListItem(state, line) {
const { chunks, currentChunk, inList, lastNonListText } = state;
if (!inList && currentChunk.length + line.length <= MAX_CHUNK_SIZE) {
return {
...state,
currentChunk: currentChunk + "\n" + line,
inList: true
};
}
if (!inList) {
return {
chunks: currentChunk ? [...chunks, currentChunk.trim()] : chunks,
currentChunk: lastNonListText + "\n" + line,
inList: true,
lastNonListText
};
}
return { ...state, currentChunk: currentChunk + "\n" + line };
}
function handleRegularLine(state, line) {
const { chunks, currentChunk, lastNonListText } = state;
if (line.length > MAX_CHUNK_SIZE) {
let remainingLine = line;
let newChunks = [...chunks];
if (currentChunk) {
newChunks.push(currentChunk.trim());
}
while (remainingLine.length > 0) {
const chunkEnd = findChunkEnd(remainingLine, MAX_CHUNK_SIZE);
newChunks.push(remainingLine.slice(0, chunkEnd).trim());
remainingLine = remainingLine.slice(chunkEnd).trim();
}
return {
chunks: newChunks,
currentChunk: "",
inList: false,
lastNonListText: line
};
}
const newChunk = currentChunk + (currentChunk ? "\n" : "") + line;
if (newChunk.length > MAX_CHUNK_SIZE) {
return {
chunks: [...chunks, currentChunk.trim()],
currentChunk: line,
inList: false,
lastNonListText: line.trim() ? line : lastNonListText
};
}
return {
...state,
currentChunk: newChunk,
inList: false,
lastNonListText: line.trim() ? line : lastNonListText
};
}
function findChunkEnd(text, maxLength) {
if (text.length <= maxLength)
return text.length;
let end = maxLength;
while (end > 0 && !/\s/.test(text[end])) {
end--;
}
return end > 0 ? end : maxLength;
}
// node_modules/langchain/node_modules/@langchain/core/dist/embeddings.js
var Embeddings = class {
constructor(params) {
Object.defineProperty(this, "caller", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
this.caller = new AsyncCaller2(params != null ? params : {});
}
};
// src/embeddings/CustomEmbeddings.ts
var CustomEmbeddings = class extends Embeddings {
constructor(config) {
super({});
this.config = config;
this.caller = void 0;
}
async embedDocuments(texts) {
logger.debug("Embedding documents", texts);
return await this.config.aiProvider.getEmbeddings(
texts,
this.config.updateCompletedSteps
);
}
async embedQuery(text) {
logger.debug("Embedding query", text);
const [embedding] = await this.embedDocuments([text]);
return embedding;
}
};
// node_modules/pdfjs-dist/build/pdf.mjs
var __webpack_require__ = {};
(() => {
__webpack_require__.d = (exports, definition) => {
for (var key in definition) {
if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
}
}
};
})();
(() => {
__webpack_require__.o = (obj, prop) => Object.prototype.hasOwnProperty.call(obj, prop);
})();
var __webpack_exports__ = globalThis.pdfjsLib = {};
__webpack_require__.d(__webpack_exports__, {
AbortException: () => (
/* reexport */
AbortException
),
AnnotationEditorLayer: () => (
/* reexport */
AnnotationEditorLayer
),
AnnotationEditorParamsType: () => (
/* reexport */
AnnotationEditorParamsType
),
AnnotationEditorType: () => (
/* reexport */
AnnotationEditorType
),
AnnotationEditorUIManager: () => (
/* reexport */
AnnotationEditorUIManager
),
AnnotationLayer: () => (
/* reexport */
AnnotationLayer
),
AnnotationMode: () => (
/* reexport */
AnnotationMode
),
CMapCompressionType: () => (
/* reexport */
CMapCompressionType
),
ColorPicker: () => (
/* reexport */
ColorPicker
),
DOMSVGFactory: () => (
/* reexport */
DOMSVGFactory
),
DrawLayer: () => (
/* reexport */
DrawLayer
),
FeatureTest: () => (
/* reexport */
util_FeatureTest
),
GlobalWorkerOptions: () => (
/* reexport */
GlobalWorkerOptions
),
ImageKind: () => (
/* reexport */
util_ImageKind
),
InvalidPDFException: () => (
/* reexport */
InvalidPDFException
),
MissingPDFException: () => (
/* reexport */
MissingPDFException
),
OPS: () => (
/* reexport */
OPS
),
PDFDataRangeTransport: () => (
/* reexport */
PDFDataRangeTransport
),
PDFDateString: () => (
/* reexport */
PDFDateString
),
PDFWorker: () => (
/* reexport */
PDFWorker
),
PasswordResponses: () => (
/* reexport */
PasswordResponses
),
PermissionFlag: () => (
/* reexport */
PermissionFlag
),
PixelsPerInch: () => (
/* reexport */
PixelsPerInch
),
RenderingCancelledException: () => (
/* reexport */
RenderingCancelledException
),
TextLayer: () => (
/* reexport */
TextLayer
),
UnexpectedResponseException: () => (
/* reexport */
UnexpectedResponseException
),
Util: () => (
/* reexport */
Util
),
VerbosityLevel: () => (
/* reexport */
VerbosityLevel
),
XfaLayer: () => (
/* reexport */
XfaLayer
),
build: () => (
/* reexport */
build
),
createValidAbsoluteUrl: () => (
/* reexport */
createValidAbsoluteUrl
),
fetchData: () => (
/* reexport */
fetchData
),
getDocument: () => (
/* reexport */
getDocument
),
getFilenameFromUrl: () => (
/* reexport */
getFilenameFromUrl
),
getPdfFilenameFromUrl: () => (
/* reexport */
getPdfFilenameFromUrl
),
getXfaPageViewport: () => (
/* reexport */
getXfaPageViewport
),
isDataScheme: () => (
/* reexport */
isDataScheme
),
isPdfFile: () => (
/* reexport */
isPdfFile
),
noContextMenu: () => (
/* reexport */
noContextMenu
),
normalizeUnicode: () => (
/* reexport */
normalizeUnicode
),
setLayerDimensions: () => (
/* reexport */
setLayerDimensions
),
shadow: () => (
/* reexport */
shadow
),
version: () => (
/* reexport */
version
)
});
var isNodeJS = typeof process === "object" && process + "" === "[object process]" && !process.versions.nw && !(process.versions.electron && process.type && process.type !== "browser");
var IDENTITY_MATRIX = [1, 0, 0, 1, 0, 0];
var FONT_IDENTITY_MATRIX = [1e-3, 0, 0, 1e-3, 0, 0];
var MAX_IMAGE_SIZE_TO_CACHE = 1e7;
var LINE_FACTOR = 1.35;
var LINE_DESCENT_FACTOR = 0.35;
var BASELINE_FACTOR = LINE_DESCENT_FACTOR / LINE_FACTOR;
var RenderingIntentFlag = {
ANY: 1,
DISPLAY: 2,
PRINT: 4,
SAVE: 8,
ANNOTATIONS_FORMS: 16,
ANNOTATIONS_STORAGE: 32,
ANNOTATIONS_DISABLE: 64,
IS_EDITING: 128,
OPLIST: 256
};
var AnnotationMode = {
DISABLE: 0,
ENABLE: 1,
ENABLE_FORMS: 2,
ENABLE_STORAGE: 3
};
var AnnotationEditorPrefix = "pdfjs_internal_editor_";
var AnnotationEditorType = {
DISABLE: -1,
NONE: 0,
FREETEXT: 3,
HIGHLIGHT: 9,
STAMP: 13,
INK: 15
};
var AnnotationEditorParamsType = {
RESIZE: 1,
CREATE: 2,
FREETEXT_SIZE: 11,
FREETEXT_COLOR: 12,
FREETEXT_OPACITY: 13,
INK_COLOR: 21,
INK_THICKNESS: 22,
INK_OPACITY: 23,
HIGHLIGHT_COLOR: 31,
HIGHLIGHT_DEFAULT_COLOR: 32,
HIGHLIGHT_THICKNESS: 33,
HIGHLIGHT_FREE: 34,
HIGHLIGHT_SHOW_ALL: 35
};
var PermissionFlag = {
PRINT: 4,
MODIFY_CONTENTS: 8,
COPY: 16,
MODIFY_ANNOTATIONS: 32,
FILL_INTERACTIVE_FORMS: 256,
COPY_FOR_ACCESSIBILITY: 512,
ASSEMBLE: 1024,
PRINT_HIGH_QUALITY: 2048
};
var TextRenderingMode = {
FILL: 0,
STROKE: 1,
FILL_STROKE: 2,
INVISIBLE: 3,
FILL_ADD_TO_PATH: 4,
STROKE_ADD_TO_PATH: 5,
FILL_STROKE_ADD_TO_PATH: 6,
ADD_TO_PATH: 7,
FILL_STROKE_MASK: 3,
ADD_TO_PATH_FLAG: 4
};
var util_ImageKind = {
GRAYSCALE_1BPP: 1,
RGB_24BPP: 2,
RGBA_32BPP: 3
};
var AnnotationType = {
TEXT: 1,
LINK: 2,
FREETEXT: 3,
LINE: 4,
SQUARE: 5,
CIRCLE: 6,
POLYGON: 7,
POLYLINE: 8,
HIGHLIGHT: 9,
UNDERLINE: 10,
SQUIGGLY: 11,
STRIKEOUT: 12,
STAMP: 13,
CARET: 14,
INK: 15,
POPUP: 16,
FILEATTACHMENT: 17,
SOUND: 18,
MOVIE: 19,
WIDGET: 20,
SCREEN: 21,
PRINTERMARK: 22,
TRAPNET: 23,
WATERMARK: 24,
THREED: 25,
REDACT: 26
};
var AnnotationBorderStyleType = {
SOLID: 1,
DASHED: 2,
BEVELED: 3,
INSET: 4,
UNDERLINE: 5
};
var VerbosityLevel = {
ERRORS: 0,
WARNINGS: 1,
INFOS: 5
};
var CMapCompressionType = {
NONE: 0,
BINARY: 1
};
var OPS = {
dependency: 1,
setLineWidth: 2,
setLineCap: 3,
setLineJoin: 4,
setMiterLimit: 5,
setDash: 6,
setRenderingIntent: 7,
setFlatness: 8,
setGState: 9,
save: 10,
restore: 11,
transform: 12,
moveTo: 13,
lineTo: 14,
curveTo: 15,
curveTo2: 16,
curveTo3: 17,
closePath: 18,
rectangle: 19,
stroke: 20,
closeStroke: 21,
fill: 22,
eoFill: 23,
fillStroke: 24,
eoFillStroke: 25,
closeFillStroke: 26,
closeEOFillStroke: 27,
endPath: 28,
clip: 29,
eoClip: 30,
beginText: 31,
endText: 32,
setCharSpacing: 33,
setWordSpacing: 34,
setHScale: 35,
setLeading: 36,
setFont: 37,
setTextRenderingMode: 38,
setTextRise: 39,
moveText: 40,
setLeadingMoveText: 41,
setTextMatrix: 42,
nextLine: 43,
showText: 44,
showSpacedText: 45,
nextLineShowText: 46,
nextLineSetSpacingShowText: 47,
setCharWidth: 48,
setCharWidthAndBounds: 49,
setStrokeColorSpace: 50,
setFillColorSpace: 51,
setStrokeColor: 52,
setStrokeColorN: 53,
setFillColor: 54,
setFillColorN: 55,
setStrokeGray: 56,
setFillGray: 57,
setStrokeRGBColor: 58,
setFillRGBColor: 59,
setStrokeCMYKColor: 60,
setFillCMYKColor: 61,
shadingFill: 62,
beginInlineImage: 63,
beginImageData: 64,
endInlineImage: 65,
paintXObject: 66,
markPoint: 67,
markPointProps: 68,
beginMarkedContent: 69,
beginMarkedContentProps: 70,
endMarkedContent: 71,
beginCompat: 72,
endCompat: 73,
paintFormXObjectBegin: 74,
paintFormXObjectEnd: 75,
beginGroup: 76,
endGroup: 77,
beginAnnotation: 80,
endAnnotation: 81,
paintImageMaskXObject: 83,
paintImageMaskXObjectGroup: 84,
paintImageXObject: 85,
paintInlineImageXObject: 86,
paintInlineImageXObjectGroup: 87,
paintImageXObjectRepeat: 88,
paintImageMaskXObjectRepeat: 89,
paintSolidColorImageMask: 90,
constructPath: 91,
setStrokeTransparent: 92,
setFillTransparent: 93
};
var PasswordResponses = {
NEED_PASSWORD: 1,
INCORRECT_PASSWORD: 2
};
var verbosity = VerbosityLevel.WARNINGS;
function setVerbosityLevel(level) {
if (Number.isInteger(level)) {
verbosity = level;
}
}
function getVerbosityLevel() {
return verbosity;
}
function info(msg) {
if (verbosity >= VerbosityLevel.INFOS) {
console.log(`Info: ${msg}`);
}
}
function warn(msg) {
if (verbosity >= VerbosityLevel.WARNINGS) {
console.log(`Warning: ${msg}`);
}
}
function unreachable(msg) {
throw new Error(msg);
}
function assert(cond, msg) {
if (!cond) {
unreachable(msg);
}
}
function _isValidProtocol(url) {
switch (url == null ? void 0 : url.protocol) {
case "http:":
case "https:":
case "ftp:":
case "mailto:":
case "tel:":
return true;
default:
return false;
}
}
function createValidAbsoluteUrl(url, baseUrl = null, options = null) {
if (!url) {
return null;
}
try {
if (options && typeof url === "string") {
if (options.addDefaultProtocol && url.startsWith("www.")) {
const dots = url.match(/\./g);
if ((dots == null ? void 0 : dots.length) >= 2) {
url = `http://${url}`;
}
}
if (options.tryConvertEncoding) {
try {
url = stringToUTF8String(url);
} catch (e) {
}
}
}
const absoluteUrl = baseUrl ? new URL(url, baseUrl) : new URL(url);
if (_isValidProtocol(absoluteUrl)) {
return absoluteUrl;
}
} catch (e) {
}
return null;
}
function shadow(obj, prop, value, nonSerializable = false) {
Object.defineProperty(obj, prop, {
value,
enumerable: !nonSerializable,
configurable: true,
writable: false
});
return value;
}
var BaseException = function BaseExceptionClosure() {
function BaseException2(message, name) {
this.message = message;
this.name = name;
}
BaseException2.prototype = new Error();
BaseException2.constructor = BaseException2;
return BaseException2;
}();
var PasswordException = class extends BaseException {
constructor(msg, code) {
super(msg, "PasswordException");
this.code = code;
}
};
var UnknownErrorException = class extends BaseException {
constructor(msg, details) {
super(msg, "UnknownErrorException");
this.details = details;
}
};
var InvalidPDFException = class extends BaseException {
constructor(msg) {
super(msg, "InvalidPDFException");
}
};
var MissingPDFException = class extends BaseException {
constructor(msg) {
super(msg, "MissingPDFException");
}
};
var UnexpectedResponseException = class extends BaseException {
constructor(msg, status) {
super(msg, "UnexpectedResponseException");
this.status = status;
}
};
var FormatError = class extends BaseException {
constructor(msg) {
super(msg, "FormatError");
}
};
var AbortException = class extends BaseException {
constructor(msg) {
super(msg, "AbortException");
}
};
function bytesToString(bytes) {
if (typeof bytes !== "object" || (bytes == null ? void 0 : bytes.length) === void 0) {
unreachable("Invalid argument for bytesToString");
}
const length = bytes.length;
const MAX_ARGUMENT_COUNT = 8192;
if (length < MAX_ARGUMENT_COUNT) {
return String.fromCharCode.apply(null, bytes);
}
const strBuf = [];
for (let i = 0; i < length; i += MAX_ARGUMENT_COUNT) {
const chunkEnd = Math.min(i + MAX_ARGUMENT_COUNT, length);
const chunk = bytes.subarray(i, chunkEnd);
strBuf.push(String.fromCharCode.apply(null, chunk));
}
return strBuf.join("");
}
function stringToBytes(str) {
if (typeof str !== "string") {
unreachable("Invalid argument for stringToBytes");
}
const length = str.length;
const bytes = new Uint8Array(length);
for (let i = 0; i < length; ++i) {
bytes[i] = str.charCodeAt(i) & 255;
}
return bytes;
}
function string32(value) {
return String.fromCharCode(value >> 24 & 255, value >> 16 & 255, value >> 8 & 255, value & 255);
}
function objectFromMap(map) {
const obj = /* @__PURE__ */ Object.create(null);
for (const [key, value] of map) {
obj[key] = value;
}
return obj;
}
function isLittleEndian() {
const buffer8 = new Uint8Array(4);
buffer8[0] = 1;
const view32 = new Uint32Array(buffer8.buffer, 0, 1);
return view32[0] === 1;
}
function isEvalSupported() {
try {
new Function("");
return true;
} catch (e) {
return false;
}
}
var util_FeatureTest = class {
static get isLittleEndian() {
return shadow(this, "isLittleEndian", isLittleEndian());
}
static get isEvalSupported() {
return shadow(this, "isEvalSupported", isEvalSupported());
}
static get isOffscreenCanvasSupported() {
return shadow(this, "isOffscreenCanvasSupported", typeof OffscreenCanvas !== "undefined");
}
static get platform() {
if (typeof navigator !== "undefined" && typeof (navigator == null ? void 0 : navigator.platform) === "string") {
return shadow(this, "platform", {
isMac: navigator.platform.includes("Mac")
});
}
return shadow(this, "platform", {
isMac: false
});
}
static get isCSSRoundSupported() {
var _a2, _b;
return shadow(this, "isCSSRoundSupported", (_b = (_a2 = globalThis.CSS) == null ? void 0 : _a2.supports) == null ? void 0 : _b.call(_a2, "width: round(1.5px, 1px)"));
}
};
var hexNumbers = Array.from(Array(256).keys(), (n) => n.toString(16).padStart(2, "0"));
var _getExtremumOnCurve, getExtremumOnCurve_fn, _getExtremum, getExtremum_fn;
var Util = class {
static makeHexColor(r, g, b) {
return `#${hexNumbers[r]}${hexNumbers[g]}${hexNumbers[b]}`;
}
static scaleMinMax(transform, minMax) {
let temp;
if (transform[0]) {
if (transform[0] < 0) {
temp = minMax[0];
minMax[0] = minMax[2];
minMax[2] = temp;
}
minMax[0] *= transform[0];
minMax[2] *= transform[0];
if (transform[3] < 0) {
temp = minMax[1];
minMax[1] = minMax[3];
minMax[3] = temp;
}
minMax[1] *= transform[3];
minMax[3] *= transform[3];
} else {
temp = minMax[0];
minMax[0] = minMax[1];
minMax[1] = temp;
temp = minMax[2];
minMax[2] = minMax[3];
minMax[3] = temp;
if (transform[1] < 0) {
temp = minMax[1];
minMax[1] = minMax[3];
minMax[3] = temp;
}
minMax[1] *= transform[1];
minMax[3] *= transform[1];
if (transform[2] < 0) {
temp = minMax[0];
minMax[0] = minMax[2];
minMax[2] = temp;
}
minMax[0] *= transform[2];
minMax[2] *= transform[2];
}
minMax[0] += transform[4];
minMax[1] += transform[5];
minMax[2] += transform[4];
minMax[3] += transform[5];
}
static transform(m1, m2) {
return [m1[0] * m2[0] + m1[2] * m2[1], m1[1] * m2[0] + m1[3] * m2[1], m1[0] * m2[2] + m1[2] * m2[3], m1[1] * m2[2] + m1[3] * m2[3], m1[0] * m2[4] + m1[2] * m2[5] + m1[4], m1[1] * m2[4] + m1[3] * m2[5] + m1[5]];
}
static applyTransform(p, m) {
const xt = p[0] * m[0] + p[1] * m[2] + m[4];
const yt = p[0] * m[1] + p[1] * m[3] + m[5];
return [xt, yt];
}
static applyInverseTransform(p, m) {
const d = m[0] * m[3] - m[1] * m[2];
const xt = (p[0] * m[3] - p[1] * m[2] + m[2] * m[5] - m[4] * m[3]) / d;
const yt = (-p[0] * m[1] + p[1] * m[0] + m[4] * m[1] - m[5] * m[0]) / d;
return [xt, yt];
}
static getAxialAlignedBoundingBox(r, m) {
const p1 = this.applyTransform(r, m);
const p2 = this.applyTransform(r.slice(2, 4), m);
const p3 = this.applyTransform([r[0], r[3]], m);
const p4 = this.applyTransform([r[2], r[1]], m);
return [Math.min(p1[0], p2[0], p3[0], p4[0]), Math.min(p1[1], p2[1], p3[1], p4[1]), Math.max(p1[0], p2[0], p3[0], p4[0]), Math.max(p1[1], p2[1], p3[1], p4[1])];
}
static inverseTransform(m) {
const d = m[0] * m[3] - m[1] * m[2];
return [m[3] / d, -m[1] / d, -m[2] / d, m[0] / d, (m[2] * m[5] - m[4] * m[3]) / d, (m[4] * m[1] - m[5] * m[0]) / d];
}
static singularValueDecompose2dScale(m) {
const transpose = [m[0], m[2], m[1], m[3]];
const a = m[0] * transpose[0] + m[1] * transpose[2];
const b = m[0] * transpose[1] + m[1] * transpose[3];
const c = m[2] * transpose[0] + m[3] * transpose[2];
const d = m[2] * transpose[1] + m[3] * transpose[3];
const first = (a + d) / 2;
const second = Math.sqrt((a + d) ** 2 - 4 * (a * d - c * b)) / 2;
const sx = first + second || 1;
const sy = first - second || 1;
return [Math.sqrt(sx), Math.sqrt(sy)];
}
static normalizeRect(rect) {
const r = rect.slice(0);
if (rect[0] > rect[2]) {
r[0] = rect[2];
r[2] = rect[0];
}
if (rect[1] > rect[3]) {
r[1] = rect[3];
r[3] = rect[1];
}
return r;
}
static intersect(rect1, rect2) {
const xLow = Math.max(Math.min(rect1[0], rect1[2]), Math.min(rect2[0], rect2[2]));
const xHigh = Math.min(Math.max(rect1[0], rect1[2]), Math.max(rect2[0], rect2[2]));
if (xLow > xHigh) {
return null;
}
const yLow = Math.max(Math.min(rect1[1], rect1[3]), Math.min(rect2[1], rect2[3]));
const yHigh = Math.min(Math.max(rect1[1], rect1[3]), Math.max(rect2[1], rect2[3]));
if (yLow > yHigh) {
return null;
}
return [xLow, yLow, xHigh, yHigh];
}
static bezierBoundingBox(x0, y0, x1, y1, x2, y2, x3, y3, minMax) {
if (minMax) {
minMax[0] = Math.min(minMax[0], x0, x3);
minMax[1] = Math.min(minMax[1], y0, y3);
minMax[2] = Math.max(minMax[2], x0, x3);
minMax[3] = Math.max(minMax[3], y0, y3);
} else {
minMax = [Math.min(x0, x3), Math.min(y0, y3), Math.max(x0, x3), Math.max(y0, y3)];
}
__privateMethod(this, _getExtremum, getExtremum_fn).call(this, x0, x1, x2, x3, y0, y1, y2, y3, 3 * (-x0 + 3 * (x1 - x2) + x3), 6 * (x0 - 2 * x1 + x2), 3 * (x1 - x0), minMax);
__privateMethod(this, _getExtremum, getExtremum_fn).call(this, x0, x1, x2, x3, y0, y1, y2, y3, 3 * (-y0 + 3 * (y1 - y2) + y3), 6 * (y0 - 2 * y1 + y2), 3 * (y1 - y0), minMax);
return minMax;
}
};
_getExtremumOnCurve = new WeakSet();
getExtremumOnCurve_fn = function(x0, x1, x2, x3, y0, y1, y2, y3, t, minMax) {
if (t <= 0 || t >= 1) {
return;
}
const mt = 1 - t;
const tt = t * t;
const ttt = tt * t;
const x = mt * (mt * (mt * x0 + 3 * t * x1) + 3 * tt * x2) + ttt * x3;
const y = mt * (mt * (mt * y0 + 3 * t * y1) + 3 * tt * y2) + ttt * y3;
minMax[0] = Math.min(minMax[0], x);
minMax[1] = Math.min(minMax[1], y);
minMax[2] = Math.max(minMax[2], x);
minMax[3] = Math.max(minMax[3], y);
};
_getExtremum = new WeakSet();
getExtremum_fn = function(x0, x1, x2, x3, y0, y1, y2, y3, a, b, c, minMax) {
if (Math.abs(a) < 1e-12) {
if (Math.abs(b) >= 1e-12) {
__privateMethod(this, _getExtremumOnCurve, getExtremumOnCurve_fn).call(this, x0, x1, x2, x3, y0, y1, y2, y3, -c / b, minMax);
}
return;
}
const delta = b ** 2 - 4 * c * a;
if (delta < 0) {
return;
}
const sqrtDelta = Math.sqrt(delta);
const a2 = 2 * a;
__privateMethod(this, _getExtremumOnCurve, getExtremumOnCurve_fn).call(this, x0, x1, x2, x3, y0, y1, y2, y3, (-b + sqrtDelta) / a2, minMax);
__privateMethod(this, _getExtremumOnCurve, getExtremumOnCurve_fn).call(this, x0, x1, x2, x3, y0, y1, y2, y3, (-b - sqrtDelta) / a2, minMax);
};
__privateAdd(Util, _getExtremumOnCurve);
__privateAdd(Util, _getExtremum);
function stringToUTF8String(str) {
return decodeURIComponent(escape(str));
}
var NormalizeRegex = null;
var NormalizationMap = null;
function normalizeUnicode(str) {
if (!NormalizeRegex) {
NormalizeRegex = /([\u00a0\u00b5\u037e\u0eb3\u2000-\u200a\u202f\u2126\ufb00-\ufb04\ufb06\ufb20-\ufb36\ufb38-\ufb3c\ufb3e\ufb40-\ufb41\ufb43-\ufb44\ufb46-\ufba1\ufba4-\ufba9\ufbae-\ufbb1\ufbd3-\ufbdc\ufbde-\ufbe7\ufbea-\ufbf8\ufbfc-\ufbfd\ufc00-\ufc5d\ufc64-\ufcf1\ufcf5-\ufd3d\ufd88\ufdf4\ufdfa-\ufdfb\ufe71\ufe77\ufe79\ufe7b\ufe7d]+)|(\ufb05+)/gu;
NormalizationMap = /* @__PURE__ */ new Map([["\uFB05", "\u017Ft"]]);
}
return str.replaceAll(NormalizeRegex, (_, p1, p2) => p1 ? p1.normalize("NFKC") : NormalizationMap.get(p2));
}
function getUuid() {
if (typeof crypto !== "undefined" && typeof (crypto == null ? void 0 : crypto.randomUUID) === "function") {
return crypto.randomUUID();
}
const buf = new Uint8Array(32);
if (typeof crypto !== "undefined" && typeof (crypto == null ? void 0 : crypto.getRandomValues) === "function") {
crypto.getRandomValues(buf);
} else {
for (let i = 0; i < 32; i++) {
buf[i] = Math.floor(Math.random() * 255);
}
}
return bytesToString(buf);
}
var AnnotationPrefix = "pdfjs_internal_id_";
var FontRenderOps = {
BEZIER_CURVE_TO: 0,
MOVE_TO: 1,
LINE_TO: 2,
QUADRATIC_CURVE_TO: 3,
RESTORE: 4,
SAVE: 5,
SCALE: 6,
TRANSFORM: 7,
TRANSLATE: 8
};
var BaseFilterFactory = class {
addFilter(maps) {
return "none";
}
addHCMFilter(fgColor, bgColor) {
return "none";
}
addAlphaFilter(map) {
return "none";
}
addLuminosityFilter(map) {
return "none";
}
addHighlightHCMFilter(filterName, fgColor, bgColor, newFgColor, newBgColor) {
return "none";
}
destroy(keepHCM = false) {
}
};
var _enableHWA;
var BaseCanvasFactory = class {
constructor({
enableHWA = false
} = {}) {
__privateAdd(this, _enableHWA, false);
__privateSet(this, _enableHWA, enableHWA);
}
create(width, height) {
if (width <= 0 || height <= 0) {
throw new Error("Invalid canvas size");
}
const canvas = this._createCanvas(width, height);
return {
canvas,
context: canvas.getContext("2d", {
willReadFrequently: !__privateGet(this, _enableHWA)
})
};
}
reset(canvasAndContext, width, height) {
if (!canvasAndContext.canvas) {
throw new Error("Canvas is not specified");
}
if (width <= 0 || height <= 0) {
throw new Error("Invalid canvas size");
}
canvasAndContext.canvas.width = width;
canvasAndContext.canvas.height = height;
}
destroy(canvasAndContext) {
if (!canvasAndContext.canvas) {
throw new Error("Canvas is not specified");
}
canvasAndContext.canvas.width = 0;
canvasAndContext.canvas.height = 0;
canvasAndContext.canvas = null;
canvasAndContext.context = null;
}
_createCanvas(width, height) {
unreachable("Abstract method `_createCanvas` called.");
}
};
_enableHWA = new WeakMap();
var BaseCMapReaderFactory = class {
constructor({
baseUrl = null,
isCompressed = true
}) {
this.baseUrl = baseUrl;
this.isCompressed = isCompressed;
}
async fetch({
name
}) {
if (!this.baseUrl) {
throw new Error("Ensure that the `cMapUrl` and `cMapPacked` API parameters are provided.");
}
if (!name) {
throw new Error("CMap name must be specified.");
}
const url = this.baseUrl + name + (this.isCompressed ? ".bcmap" : "");
const compressionType = this.isCompressed ? CMapCompressionType.BINARY : CMapCompressionType.NONE;
return this._fetchData(url, compressionType).catch((reason) => {
throw new Error(`Unable to load ${this.isCompressed ? "binary " : ""}CMap at: ${url}`);
});
}
_fetchData(url, compressionType) {
unreachable("Abstract method `_fetchData` called.");
}
};
var BaseStandardFontDataFactory = class {
constructor({
baseUrl = null
}) {
this.baseUrl = baseUrl;
}
async fetch({
filename
}) {
if (!this.baseUrl) {
throw new Error("Ensure that the `standardFontDataUrl` API parameter is provided.");
}
if (!filename) {
throw new Error("Font filename must be specified.");
}
const url = `${this.baseUrl}${filename}`;
return this._fetchData(url).catch((reason) => {
throw new Error(`Unable to load font data at: ${url}`);
});
}
_fetchData(url) {
unreachable("Abstract method `_fetchData` called.");
}
};
var BaseSVGFactory = class {
create(width, height, skipDimensions = false) {
if (width <= 0 || height <= 0) {
throw new Error("Invalid SVG dimensions");
}
const svg = this._createSVG("svg:svg");
svg.setAttribute("version", "1.1");
if (!skipDimensions) {
svg.setAttribute("width", `${width}px`);
svg.setAttribute("height", `${height}px`);
}
svg.setAttribute("preserveAspectRatio", "none");
svg.setAttribute("viewBox", `0 0 ${width} ${height}`);
return svg;
}
createElement(type) {
if (typeof type !== "string") {
throw new Error("Invalid SVG element type");
}
return this._createSVG(type);
}
_createSVG(type) {
unreachable("Abstract method `_createSVG` called.");
}
};
var SVG_NS = "http://www.w3.org/2000/svg";
var _PixelsPerInch = class {
};
var PixelsPerInch = _PixelsPerInch;
__publicField(PixelsPerInch, "CSS", 96);
__publicField(PixelsPerInch, "PDF", 72);
__publicField(PixelsPerInch, "PDF_TO_CSS_UNITS", _PixelsPerInch.CSS / _PixelsPerInch.PDF);
var _baseUrl, __cache, __defs, _docId, _document, __hcmCache, _id, _cache, cache_get, _hcmCache, hcmCache_get, _defs, defs_get, _createTables, createTables_fn, _createUrl, createUrl_fn, _addLuminosityConversion, addLuminosityConversion_fn, _addGrayConversion, addGrayConversion_fn, _createFilter, createFilter_fn, _appendFeFunc, appendFeFunc_fn, _addTransferMapConversion, addTransferMapConversion_fn, _addTransferMapAlphaConversion, addTransferMapAlphaConversion_fn, _getRGB, getRGB_fn;
var DOMFilterFactory = class extends BaseFilterFactory {
constructor({
docId,
ownerDocument = globalThis.document
} = {}) {
super();
__privateAdd(this, _cache);
__privateAdd(this, _hcmCache);
__privateAdd(this, _defs);
__privateAdd(this, _createTables);
__privateAdd(this, _createUrl);
__privateAdd(this, _addLuminosityConversion);
__privateAdd(this, _addGrayConversion);
__privateAdd(this, _createFilter);
__privateAdd(this, _appendFeFunc);
__privateAdd(this, _addTransferMapConversion);
__privateAdd(this, _addTransferMapAlphaConversion);
__privateAdd(this, _getRGB);
__privateAdd(this, _baseUrl, void 0);
__privateAdd(this, __cache, void 0);
__privateAdd(this, __defs, void 0);
__privateAdd(this, _docId, void 0);
__privateAdd(this, _document, void 0);
__privateAdd(this, __hcmCache, void 0);
__privateAdd(this, _id, 0);
__privateSet(this, _docId, docId);
__privateSet(this, _document, ownerDocument);
}
addFilter(maps) {
if (!maps) {
return "none";
}
let value = __privateGet(this, _cache, cache_get).get(maps);
if (value) {
return value;
}
const [tableR, tableG, tableB] = __privateMethod(this, _createTables, createTables_fn).call(this, maps);
const key = maps.length === 1 ? tableR : `${tableR}${tableG}${tableB}`;
value = __privateGet(this, _cache, cache_get).get(key);
if (value) {
__privateGet(this, _cache, cache_get).set(maps, value);
return value;
}
const id = `g_${__privateGet(this, _docId)}_transfer_map_${__privateWrapper(this, _id)._++}`;
const url = __privateMethod(this, _createUrl, createUrl_fn).call(this, id);
__privateGet(this, _cache, cache_get).set(maps, url);
__privateGet(this, _cache, cache_get).set(key, url);
const filter = __privateMethod(this, _createFilter, createFilter_fn).call(this, id);
__privateMethod(this, _addTransferMapConversion, addTransferMapConversion_fn).call(this, tableR, tableG, tableB, filter);
return url;
}
addHCMFilter(fgColor, bgColor) {
var _a2;
const key = `${fgColor}-${bgColor}`;
const filterName = "base";
let info2 = __privateGet(this, _hcmCache, hcmCache_get).get(filterName);
if ((info2 == null ? void 0 : info2.key) === key) {
return info2.url;
}
if (info2) {
(_a2 = info2.filter) == null ? void 0 : _a2.remove();
info2.key = key;
info2.url = "none";
info2.filter = null;
} else {
info2 = {
key,
url: "none",
filter: null
};
__privateGet(this, _hcmCache, hcmCache_get).set(filterName, info2);
}
if (!fgColor || !bgColor) {
return info2.url;
}
const fgRGB = __privateMethod(this, _getRGB, getRGB_fn).call(this, fgColor);
fgColor = Util.makeHexColor(...fgRGB);
const bgRGB = __privateMethod(this, _getRGB, getRGB_fn).call(this, bgColor);
bgColor = Util.makeHexColor(...bgRGB);
__privateGet(this, _defs, defs_get).style.color = "";
if (fgColor === "#000000" && bgColor === "#ffffff" || fgColor === bgColor) {
return info2.url;
}
const map = new Array(256);
for (let i = 0; i <= 255; i++) {
const x = i / 255;
map[i] = x <= 0.03928 ? x / 12.92 : ((x + 0.055) / 1.055) ** 2.4;
}
const table = map.join(",");
const id = `g_${__privateGet(this, _docId)}_hcm_filter`;
const filter = info2.filter = __privateMethod(this, _createFilter, createFilter_fn).call(this, id);
__privateMethod(this, _addTransferMapConversion, addTransferMapConversion_fn).call(this, table, table, table, filter);
__privateMethod(this, _addGrayConversion, addGrayConversion_fn).call(this, filter);
const getSteps = (c, n) => {
const start = fgRGB[c] / 255;
const end = bgRGB[c] / 255;
const arr = new Array(n + 1);
for (let i = 0; i <= n; i++) {
arr[i] = start + i / n * (end - start);
}
return arr.join(",");
};
__privateMethod(this, _addTransferMapConversion, addTransferMapConversion_fn).call(this, getSteps(0, 5), getSteps(1, 5), getSteps(2, 5), filter);
info2.url = __privateMethod(this, _createUrl, createUrl_fn).call(this, id);
return info2.url;
}
addAlphaFilter(map) {
let value = __privateGet(this, _cache, cache_get).get(map);
if (value) {
return value;
}
const [tableA] = __privateMethod(this, _createTables, createTables_fn).call(this, [map]);
const key = `alpha_${tableA}`;
value = __privateGet(this, _cache, cache_get).get(key);
if (value) {
__privateGet(this, _cache, cache_get).set(map, value);
return value;
}
const id = `g_${__privateGet(this, _docId)}_alpha_map_${__privateWrapper(this, _id)._++}`;
const url = __privateMethod(this, _createUrl, createUrl_fn).call(this, id);
__privateGet(this, _cache, cache_get).set(map, url);
__privateGet(this, _cache, cache_get).set(key, url);
const filter = __privateMethod(this, _createFilter, createFilter_fn).call(this, id);
__privateMethod(this, _addTransferMapAlphaConversion, addTransferMapAlphaConversion_fn).call(this, tableA, filter);
return url;
}
addLuminosityFilter(map) {
let value = __privateGet(this, _cache, cache_get).get(map || "luminosity");
if (value) {
return value;
}
let tableA, key;
if (map) {
[tableA] = __privateMethod(this, _createTables, createTables_fn).call(this, [map]);
key = `luminosity_${tableA}`;
} else {
key = "luminosity";
}
value = __privateGet(this, _cache, cache_get).get(key);
if (value) {
__privateGet(this, _cache, cache_get).set(map, value);
return value;
}
const id = `g_${__privateGet(this, _docId)}_luminosity_map_${__privateWrapper(this, _id)._++}`;
const url = __privateMethod(this, _createUrl, createUrl_fn).call(this, id);
__privateGet(this, _cache, cache_get).set(map, url);
__privateGet(this, _cache, cache_get).set(key, url);
const filter = __privateMethod(this, _createFilter, createFilter_fn).call(this, id);
__privateMethod(this, _addLuminosityConversion, addLuminosityConversion_fn).call(this, filter);
if (map) {
__privateMethod(this, _addTransferMapAlphaConversion, addTransferMapAlphaConversion_fn).call(this, tableA, filter);
}
return url;
}
addHighlightHCMFilter(filterName, fgColor, bgColor, newFgColor, newBgColor) {
var _a2;
const key = `${fgColor}-${bgColor}-${newFgColor}-${newBgColor}`;
let info2 = __privateGet(this, _hcmCache, hcmCache_get).get(filterName);
if ((info2 == null ? void 0 : info2.key) === key) {
return info2.url;
}
if (info2) {
(_a2 = info2.filter) == null ? void 0 : _a2.remove();
info2.key = key;
info2.url = "none";
info2.filter = null;
} else {
info2 = {
key,
url: "none",
filter: null
};
__privateGet(this, _hcmCache, hcmCache_get).set(filterName, info2);
}
if (!fgColor || !bgColor) {
return info2.url;
}
const [fgRGB, bgRGB] = [fgColor, bgColor].map(__privateMethod(this, _getRGB, getRGB_fn).bind(this));
let fgGray = Math.round(0.2126 * fgRGB[0] + 0.7152 * fgRGB[1] + 0.0722 * fgRGB[2]);
let bgGray = Math.round(0.2126 * bgRGB[0] + 0.7152 * bgRGB[1] + 0.0722 * bgRGB[2]);
let [newFgRGB, newBgRGB] = [newFgColor, newBgColor].map(__privateMethod(this, _getRGB, getRGB_fn).bind(this));
if (bgGray < fgGray) {
[fgGray, bgGray, newFgRGB, newBgRGB] = [bgGray, fgGray, newBgRGB, newFgRGB];
}
__privateGet(this, _defs, defs_get).style.color = "";
const getSteps = (fg, bg, n) => {
const arr = new Array(256);
const step = (bgGray - fgGray) / n;
const newStart = fg / 255;
const newStep = (bg - fg) / (255 * n);
let prev = 0;
for (let i = 0; i <= n; i++) {
const k = Math.round(fgGray + i * step);
const value = newStart + i * newStep;
for (let j = prev; j <= k; j++) {
arr[j] = value;
}
prev = k + 1;
}
for (let i = prev; i < 256; i++) {
arr[i] = arr[prev - 1];
}
return arr.join(",");
};
const id = `g_${__privateGet(this, _docId)}_hcm_${filterName}_filter`;
const filter = info2.filter = __privateMethod(this, _createFilter, createFilter_fn).call(this, id);
__privateMethod(this, _addGrayConversion, addGrayConversion_fn).call(this, filter);
__privateMethod(this, _addTransferMapConversion, addTransferMapConversion_fn).call(this, getSteps(newFgRGB[0], newBgRGB[0], 5), getSteps(newFgRGB[1], newBgRGB[1], 5), getSteps(newFgRGB[2], newBgRGB[2], 5), filter);
info2.url = __privateMethod(this, _createUrl, createUrl_fn).call(this, id);
return info2.url;
}
destroy(keepHCM = false) {
if (keepHCM && __privateGet(this, _hcmCache, hcmCache_get).size !== 0) {
return;
}
if (__privateGet(this, __defs)) {
__privateGet(this, __defs).parentNode.parentNode.remove();
__privateSet(this, __defs, null);
}
if (__privateGet(this, __cache)) {
__privateGet(this, __cache).clear();
__privateSet(this, __cache, null);
}
__privateSet(this, _id, 0);
}
};
_baseUrl = new WeakMap();
__cache = new WeakMap();
__defs = new WeakMap();
_docId = new WeakMap();
_document = new WeakMap();
__hcmCache = new WeakMap();
_id = new WeakMap();
_cache = new WeakSet();
cache_get = function() {
return __privateGet(this, __cache) || __privateSet(this, __cache, /* @__PURE__ */ new Map());
};
_hcmCache = new WeakSet();
hcmCache_get = function() {
return __privateGet(this, __hcmCache) || __privateSet(this, __hcmCache, /* @__PURE__ */ new Map());
};
_defs = new WeakSet();
defs_get = function() {
if (!__privateGet(this, __defs)) {
const div = __privateGet(this, _document).createElement("div");
const {
style
} = div;
style.visibility = "hidden";
style.contain = "strict";
style.width = style.height = 0;
style.position = "absolute";
style.top = style.left = 0;
style.zIndex = -1;
const svg = __privateGet(this, _document).createElementNS(SVG_NS, "svg");
svg.setAttribute("width", 0);
svg.setAttribute("height", 0);
__privateSet(this, __defs, __privateGet(this, _document).createElementNS(SVG_NS, "defs"));
div.append(svg);
svg.append(__privateGet(this, __defs));
__privateGet(this, _document).body.append(div);
}
return __privateGet(this, __defs);
};
_createTables = new WeakSet();
createTables_fn = function(maps) {
if (maps.length === 1) {
const mapR2 = maps[0];
const buffer = new Array(256);
for (let i = 0; i < 256; i++) {
buffer[i] = mapR2[i] / 255;
}
const table = buffer.join(",");
return [table, table, table];
}
const [mapR, mapG, mapB] = maps;
const bufferR = new Array(256);
const bufferG = new Array(256);
const bufferB = new Array(256);
for (let i = 0; i < 256; i++) {
bufferR[i] = mapR[i] / 255;
bufferG[i] = mapG[i] / 255;
bufferB[i] = mapB[i] / 255;
}
return [bufferR.join(","), bufferG.join(","), bufferB.join(",")];
};
_createUrl = new WeakSet();
createUrl_fn = function(id) {
if (__privateGet(this, _baseUrl) === void 0) {
__privateSet(this, _baseUrl, "");
const url = __privateGet(this, _document).URL;
if (url !== __privateGet(this, _document).baseURI) {
if (isDataScheme(url)) {
warn('#createUrl: ignore "data:"-URL for performance reasons.');
} else {
__privateSet(this, _baseUrl, url.split("#", 1)[0]);
}
}
}
return `url(${__privateGet(this, _baseUrl)}#${id})`;
};
_addLuminosityConversion = new WeakSet();
addLuminosityConversion_fn = function(filter) {
const feColorMatrix = __privateGet(this, _document).createElementNS(SVG_NS, "feColorMatrix");
feColorMatrix.setAttribute("type", "matrix");
feColorMatrix.setAttribute("values", "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0.59 0.11 0 0");
filter.append(feColorMatrix);
};
_addGrayConversion = new WeakSet();
addGrayConversion_fn = function(filter) {
const feColorMatrix = __privateGet(this, _document).createElementNS(SVG_NS, "feColorMatrix");
feColorMatrix.setAttribute("type", "matrix");
feColorMatrix.setAttribute("values", "0.2126 0.7152 0.0722 0 0 0.2126 0.7152 0.0722 0 0 0.2126 0.7152 0.0722 0 0 0 0 0 1 0");
filter.append(feColorMatrix);
};
_createFilter = new WeakSet();
createFilter_fn = function(id) {
const filter = __privateGet(this, _document).createElementNS(SVG_NS, "filter");
filter.setAttribute("color-interpolation-filters", "sRGB");
filter.setAttribute("id", id);
__privateGet(this, _defs, defs_get).append(filter);
return filter;
};
_appendFeFunc = new WeakSet();
appendFeFunc_fn = function(feComponentTransfer, func, table) {
const feFunc = __privateGet(this, _document).createElementNS(SVG_NS, func);
feFunc.setAttribute("type", "discrete");
feFunc.setAttribute("tableValues", table);
feComponentTransfer.append(feFunc);
};
_addTransferMapConversion = new WeakSet();
addTransferMapConversion_fn = function(rTable, gTable, bTable, filter) {
const feComponentTransfer = __privateGet(this, _document).createElementNS(SVG_NS, "feComponentTransfer");
filter.append(feComponentTransfer);
__privateMethod(this, _appendFeFunc, appendFeFunc_fn).call(this, feComponentTransfer, "feFuncR", rTable);
__privateMethod(this, _appendFeFunc, appendFeFunc_fn).call(this, feComponentTransfer, "feFuncG", gTable);
__privateMethod(this, _appendFeFunc, appendFeFunc_fn).call(this, feComponentTransfer, "feFuncB", bTable);
};
_addTransferMapAlphaConversion = new WeakSet();
addTransferMapAlphaConversion_fn = function(aTable, filter) {
const feComponentTransfer = __privateGet(this, _document).createElementNS(SVG_NS, "feComponentTransfer");
filter.append(feComponentTransfer);
__privateMethod(this, _appendFeFunc, appendFeFunc_fn).call(this, feComponentTransfer, "feFuncA", aTable);
};
_getRGB = new WeakSet();
getRGB_fn = function(color2) {
__privateGet(this, _defs, defs_get).style.color = color2;
return getRGB(getComputedStyle(__privateGet(this, _defs, defs_get)).getPropertyValue("color"));
};
var DOMCanvasFactory = class extends BaseCanvasFactory {
constructor({
ownerDocument = globalThis.document,
enableHWA = false
} = {}) {
super({
enableHWA
});
this._document = ownerDocument;
}
_createCanvas(width, height) {
const canvas = this._document.createElement("canvas");
canvas.width = width;
canvas.height = height;
return canvas;
}
};
async function fetchData(url, type = "text") {
if (isValidFetchUrl(url, document.baseURI)) {
const response = await fetch(url);
if (!response.ok) {
throw new Error(response.statusText);
}
switch (type) {
case "arraybuffer":
return response.arrayBuffer();
case "blob":
return response.blob();
case "json":
return response.json();
}
return response.text();
}
return new Promise((resolve, reject) => {
const request = new XMLHttpRequest();
request.open("GET", url, true);
request.responseType = type;
request.onreadystatechange = () => {
if (request.readyState !== XMLHttpRequest.DONE) {
return;
}
if (request.status === 200 || request.status === 0) {
switch (type) {
case "arraybuffer":
case "blob":
case "json":
resolve(request.response);
return;
}
resolve(request.responseText);
return;
}
reject(new Error(request.statusText));
};
request.send(null);
});
}
var DOMCMapReaderFactory = class extends BaseCMapReaderFactory {
_fetchData(url, compressionType) {
return fetchData(url, this.isCompressed ? "arraybuffer" : "text").then((data) => ({
cMapData: data instanceof ArrayBuffer ? new Uint8Array(data) : stringToBytes(data),
compressionType
}));
}
};
var DOMStandardFontDataFactory = class extends BaseStandardFontDataFactory {
_fetchData(url) {
return fetchData(url, "arraybuffer").then((data) => new Uint8Array(data));
}
};
var DOMSVGFactory = class extends BaseSVGFactory {
_createSVG(type) {
return document.createElementNS(SVG_NS, type);
}
};
var PageViewport = class {
constructor({
viewBox,
scale,
rotation,
offsetX = 0,
offsetY = 0,
dontFlip = false
}) {
this.viewBox = viewBox;
this.scale = scale;
this.rotation = rotation;
this.offsetX = offsetX;
this.offsetY = offsetY;
const centerX = (viewBox[2] + viewBox[0]) / 2;
const centerY = (viewBox[3] + viewBox[1]) / 2;
let rotateA, rotateB, rotateC, rotateD;
rotation %= 360;
if (rotation < 0) {
rotation += 360;
}
switch (rotation) {
case 180:
rotateA = -1;
rotateB = 0;
rotateC = 0;
rotateD = 1;
break;
case 90:
rotateA = 0;
rotateB = 1;
rotateC = 1;
rotateD = 0;
break;
case 270:
rotateA = 0;
rotateB = -1;
rotateC = -1;
rotateD = 0;
break;
case 0:
rotateA = 1;
rotateB = 0;
rotateC = 0;
rotateD = -1;
break;
default:
throw new Error("PageViewport: Invalid rotation, must be a multiple of 90 degrees.");
}
if (dontFlip) {
rotateC = -rotateC;
rotateD = -rotateD;
}
let offsetCanvasX, offsetCanvasY;
let width, height;
if (rotateA === 0) {
offsetCanvasX = Math.abs(centerY - viewBox[1]) * scale + offsetX;
offsetCanvasY = Math.abs(centerX - viewBox[0]) * scale + offsetY;
width = (viewBox[3] - viewBox[1]) * scale;
height = (viewBox[2] - viewBox[0]) * scale;
} else {
offsetCanvasX = Math.abs(centerX - viewBox[0]) * scale + offsetX;
offsetCanvasY = Math.abs(centerY - viewBox[1]) * scale + offsetY;
width = (viewBox[2] - viewBox[0]) * scale;
height = (viewBox[3] - viewBox[1]) * scale;
}
this.transform = [rotateA * scale, rotateB * scale, rotateC * scale, rotateD * scale, offsetCanvasX - rotateA * scale * centerX - rotateC * scale * centerY, offsetCanvasY - rotateB * scale * centerX - rotateD * scale * centerY];
this.width = width;
this.height = height;
}
get rawDims() {
const {
viewBox
} = this;
return shadow(this, "rawDims", {
pageWidth: viewBox[2] - viewBox[0],
pageHeight: viewBox[3] - viewBox[1],
pageX: viewBox[0],
pageY: viewBox[1]
});
}
clone({
scale = this.scale,
rotation = this.rotation,
offsetX = this.offsetX,
offsetY = this.offsetY,
dontFlip = false
} = {}) {
return new PageViewport({
viewBox: this.viewBox.slice(),
scale,
rotation,
offsetX,
offsetY,
dontFlip
});
}
convertToViewportPoint(x, y) {
return Util.applyTransform([x, y], this.transform);
}
convertToViewportRectangle(rect) {
const topLeft = Util.applyTransform([rect[0], rect[1]], this.transform);
const bottomRight = Util.applyTransform([rect[2], rect[3]], this.transform);
return [topLeft[0], topLeft[1], bottomRight[0], bottomRight[1]];
}
convertToPdfPoint(x, y) {
return Util.applyInverseTransform([x, y], this.transform);
}
};
var RenderingCancelledException = class extends BaseException {
constructor(msg, extraDelay = 0) {
super(msg, "RenderingCancelledException");
this.extraDelay = extraDelay;
}
};
function isDataScheme(url) {
const ii = url.length;
let i = 0;
while (i < ii && url[i].trim() === "") {
i++;
}
return url.substring(i, i + 5).toLowerCase() === "data:";
}
function isPdfFile(filename) {
return typeof filename === "string" && /\.pdf$/i.test(filename);
}
function getFilenameFromUrl(url) {
[url] = url.split(/[#?]/, 1);
return url.substring(url.lastIndexOf("/") + 1);
}
function getPdfFilenameFromUrl(url, defaultFilename = "document.pdf") {
if (typeof url !== "string") {
return defaultFilename;
}
if (isDataScheme(url)) {
warn('getPdfFilenameFromUrl: ignore "data:"-URL for performance reasons.');
return defaultFilename;
}
const reURI = /^(?:(?:[^:]+:)?\/\/[^/]+)?([^?#]*)(\?[^#]*)?(#.*)?$/;
const reFilename = /[^/?#=]+\.pdf\b(?!.*\.pdf\b)/i;
const splitURI = reURI.exec(url);
let suggestedFilename = reFilename.exec(splitURI[1]) || reFilename.exec(splitURI[2]) || reFilename.exec(splitURI[3]);
if (suggestedFilename) {
suggestedFilename = suggestedFilename[0];
if (suggestedFilename.includes("%")) {
try {
suggestedFilename = reFilename.exec(decodeURIComponent(suggestedFilename))[0];
} catch (e) {
}
}
}
return suggestedFilename || defaultFilename;
}
var StatTimer = class {
constructor() {
__publicField(this, "started", /* @__PURE__ */ Object.create(null));
__publicField(this, "times", []);
}
time(name) {
if (name in this.started) {
warn(`Timer is already running for ${name}`);
}
this.started[name] = Date.now();
}
timeEnd(name) {
if (!(name in this.started)) {
warn(`Timer has not been started for ${name}`);
}
this.times.push({
name,
start: this.started[name],
end: Date.now()
});
delete this.started[name];
}
toString() {
const outBuf = [];
let longest = 0;
for (const {
name
} of this.times) {
longest = Math.max(name.length, longest);
}
for (const {
name,
start,
end
} of this.times) {
outBuf.push(`${name.padEnd(longest)} ${end - start}ms
`);
}
return outBuf.join("");
}
};
function isValidFetchUrl(url, baseUrl) {
try {
const {
protocol
} = baseUrl ? new URL(url, baseUrl) : new URL(url);
return protocol === "http:" || protocol === "https:";
} catch (e) {
return false;
}
}
function noContextMenu(e) {
e.preventDefault();
}
var pdfDateStringRegex;
var PDFDateString = class {
static toDateObject(input) {
if (!input || typeof input !== "string") {
return null;
}
pdfDateStringRegex || (pdfDateStringRegex = new RegExp("^D:(\\d{4})(\\d{2})?(\\d{2})?(\\d{2})?(\\d{2})?(\\d{2})?([Z|+|-])?(\\d{2})?'?(\\d{2})?'?"));
const matches = pdfDateStringRegex.exec(input);
if (!matches) {
return null;
}
const year = parseInt(matches[1], 10);
let month = parseInt(matches[2], 10);
month = month >= 1 && month <= 12 ? month - 1 : 0;
let day = parseInt(matches[3], 10);
day = day >= 1 && day <= 31 ? day : 1;
let hour = parseInt(matches[4], 10);
hour = hour >= 0 && hour <= 23 ? hour : 0;
let minute = parseInt(matches[5], 10);
minute = minute >= 0 && minute <= 59 ? minute : 0;
let second = parseInt(matches[6], 10);
second = second >= 0 && second <= 59 ? second : 0;
const universalTimeRelation = matches[7] || "Z";
let offsetHour = parseInt(matches[8], 10);
offsetHour = offsetHour >= 0 && offsetHour <= 23 ? offsetHour : 0;
let offsetMinute = parseInt(matches[9], 10) || 0;
offsetMinute = offsetMinute >= 0 && offsetMinute <= 59 ? offsetMinute : 0;
if (universalTimeRelation === "-") {
hour += offsetHour;
minute += offsetMinute;
} else if (universalTimeRelation === "+") {
hour -= offsetHour;
minute -= offsetMinute;
}
return new Date(Date.UTC(year, month, day, hour, minute, second));
}
};
function getXfaPageViewport(xfaPage, {
scale = 1,
rotation = 0
}) {
const {
width,
height
} = xfaPage.attributes.style;
const viewBox = [0, 0, parseInt(width), parseInt(height)];
return new PageViewport({
viewBox,
scale,
rotation
});
}
function getRGB(color2) {
if (color2.startsWith("#")) {
const colorRGB = parseInt(color2.slice(1), 16);
return [(colorRGB & 16711680) >> 16, (colorRGB & 65280) >> 8, colorRGB & 255];
}
if (color2.startsWith("rgb(")) {
return color2.slice(4, -1).split(",").map((x) => parseInt(x));
}
if (color2.startsWith("rgba(")) {
return color2.slice(5, -1).split(",").map((x) => parseInt(x)).slice(0, 3);
}
warn(`Not a valid color format: "${color2}"`);
return [0, 0, 0];
}
function getColorValues(colors) {
const span = document.createElement("span");
span.style.visibility = "hidden";
document.body.append(span);
for (const name of colors.keys()) {
span.style.color = name;
const computedColor = window.getComputedStyle(span).color;
colors.set(name, getRGB(computedColor));
}
span.remove();
}
function getCurrentTransform(ctx) {
const {
a,
b,
c,
d,
e,
f
} = ctx.getTransform();
return [a, b, c, d, e, f];
}
function getCurrentTransformInverse(ctx) {
const {
a,
b,
c,
d,
e,
f
} = ctx.getTransform().invertSelf();
return [a, b, c, d, e, f];
}
function setLayerDimensions(div, viewport, mustFlip = false, mustRotate = true) {
if (viewport instanceof PageViewport) {
const {
pageWidth,
pageHeight
} = viewport.rawDims;
const {
style
} = div;
const useRound = util_FeatureTest.isCSSRoundSupported;
const w = `var(--scale-factor) * ${pageWidth}px`, h = `var(--scale-factor) * ${pageHeight}px`;
const widthStr = useRound ? `round(${w}, 1px)` : `calc(${w})`, heightStr = useRound ? `round(${h}, 1px)` : `calc(${h})`;
if (!mustFlip || viewport.rotation % 180 === 0) {
style.width = widthStr;
style.height = heightStr;
} else {
style.width = heightStr;
style.height = widthStr;
}
}
if (mustRotate) {
div.setAttribute("data-main-rotation", viewport.rotation);
}
}
var _toolbar, _colorPicker, _editor, _buttons, _altText, _l10nRemove, _pointerDown, pointerDown_fn, _focusIn, focusIn_fn, _focusOut, focusOut_fn, _addListenersToElement, addListenersToElement_fn, _addDeleteButton, addDeleteButton_fn, _divider, divider_get;
var _EditorToolbar = class {
constructor(editor) {
__privateAdd(this, _focusIn);
__privateAdd(this, _focusOut);
__privateAdd(this, _addListenersToElement);
__privateAdd(this, _addDeleteButton);
__privateAdd(this, _divider);
__privateAdd(this, _toolbar, null);
__privateAdd(this, _colorPicker, null);
__privateAdd(this, _editor, void 0);
__privateAdd(this, _buttons, null);
__privateAdd(this, _altText, null);
__privateSet(this, _editor, editor);
__privateGet(_EditorToolbar, _l10nRemove) || __privateSet(_EditorToolbar, _l10nRemove, Object.freeze({
freetext: "pdfjs-editor-remove-freetext-button",
highlight: "pdfjs-editor-remove-highlight-button",
ink: "pdfjs-editor-remove-ink-button",
stamp: "pdfjs-editor-remove-stamp-button"
}));
}
render() {
const editToolbar = __privateSet(this, _toolbar, document.createElement("div"));
editToolbar.className = "editToolbar";
editToolbar.setAttribute("role", "toolbar");
const signal = __privateGet(this, _editor)._uiManager._signal;
editToolbar.addEventListener("contextmenu", noContextMenu, {
signal
});
editToolbar.addEventListener("pointerdown", __privateMethod(_EditorToolbar, _pointerDown, pointerDown_fn), {
signal
});
const buttons = __privateSet(this, _buttons, document.createElement("div"));
buttons.className = "buttons";
editToolbar.append(buttons);
const position = __privateGet(this, _editor).toolbarPosition;
if (position) {
const {
style
} = editToolbar;
const x = __privateGet(this, _editor)._uiManager.direction === "ltr" ? 1 - position[0] : position[0];
style.insetInlineEnd = `${100 * x}%`;
style.top = `calc(${100 * position[1]}% + var(--editor-toolbar-vert-offset))`;
}
__privateMethod(this, _addDeleteButton, addDeleteButton_fn).call(this);
return editToolbar;
}
hide() {
var _a2;
__privateGet(this, _toolbar).classList.add("hidden");
(_a2 = __privateGet(this, _colorPicker)) == null ? void 0 : _a2.hideDropdown();
}
show() {
var _a2;
__privateGet(this, _toolbar).classList.remove("hidden");
(_a2 = __privateGet(this, _altText)) == null ? void 0 : _a2.shown();
}
async addAltText(altText) {
const button = await altText.render();
__privateMethod(this, _addListenersToElement, addListenersToElement_fn).call(this, button);
__privateGet(this, _buttons).prepend(button, __privateGet(this, _divider, divider_get));
__privateSet(this, _altText, altText);
}
addColorPicker(colorPicker) {
__privateSet(this, _colorPicker, colorPicker);
const button = colorPicker.renderButton();
__privateMethod(this, _addListenersToElement, addListenersToElement_fn).call(this, button);
__privateGet(this, _buttons).prepend(button, __privateGet(this, _divider, divider_get));
}
remove() {
var _a2;
__privateGet(this, _toolbar).remove();
(_a2 = __privateGet(this, _colorPicker)) == null ? void 0 : _a2.destroy();
__privateSet(this, _colorPicker, null);
}
};
var EditorToolbar = _EditorToolbar;
_toolbar = new WeakMap();
_colorPicker = new WeakMap();
_editor = new WeakMap();
_buttons = new WeakMap();
_altText = new WeakMap();
_l10nRemove = new WeakMap();
_pointerDown = new WeakSet();
pointerDown_fn = function(e) {
e.stopPropagation();
};
_focusIn = new WeakSet();
focusIn_fn = function(e) {
__privateGet(this, _editor)._focusEventsAllowed = false;
e.preventDefault();
e.stopPropagation();
};
_focusOut = new WeakSet();
focusOut_fn = function(e) {
__privateGet(this, _editor)._focusEventsAllowed = true;
e.preventDefault();
e.stopPropagation();
};
_addListenersToElement = new WeakSet();
addListenersToElement_fn = function(element) {
const signal = __privateGet(this, _editor)._uiManager._signal;
element.addEventListener("focusin", __privateMethod(this, _focusIn, focusIn_fn).bind(this), {
capture: true,
signal
});
element.addEventListener("focusout", __privateMethod(this, _focusOut, focusOut_fn).bind(this), {
capture: true,
signal
});
element.addEventListener("contextmenu", noContextMenu, {
signal
});
};
_addDeleteButton = new WeakSet();
addDeleteButton_fn = function() {
const {
editorType,
_uiManager: _uiManager4
} = __privateGet(this, _editor);
const button = document.createElement("button");
button.className = "delete";
button.tabIndex = 0;
button.setAttribute("data-l10n-id", __privateGet(_EditorToolbar, _l10nRemove)[editorType]);
__privateMethod(this, _addListenersToElement, addListenersToElement_fn).call(this, button);
button.addEventListener("click", (e) => {
_uiManager4.delete();
}, {
signal: _uiManager4._signal
});
__privateGet(this, _buttons).append(button);
};
_divider = new WeakSet();
divider_get = function() {
const divider = document.createElement("div");
divider.className = "divider";
return divider;
};
__privateAdd(EditorToolbar, _pointerDown);
__privateAdd(EditorToolbar, _l10nRemove, null);
var _buttons2, _toolbar2, _uiManager, _render, render_fn, _getLastPoint, getLastPoint_fn, _addHighlightButton, addHighlightButton_fn;
var HighlightToolbar = class {
constructor(uiManager) {
__privateAdd(this, _render);
__privateAdd(this, _getLastPoint);
__privateAdd(this, _addHighlightButton);
__privateAdd(this, _buttons2, null);
__privateAdd(this, _toolbar2, null);
__privateAdd(this, _uiManager, void 0);
__privateSet(this, _uiManager, uiManager);
}
show(parent, boxes, isLTR) {
const [x, y] = __privateMethod(this, _getLastPoint, getLastPoint_fn).call(this, boxes, isLTR);
const {
style
} = __privateGet(this, _toolbar2) || __privateSet(this, _toolbar2, __privateMethod(this, _render, render_fn).call(this));
parent.append(__privateGet(this, _toolbar2));
style.insetInlineEnd = `${100 * x}%`;
style.top = `calc(${100 * y}% + var(--editor-toolbar-vert-offset))`;
}
hide() {
__privateGet(this, _toolbar2).remove();
}
};
_buttons2 = new WeakMap();
_toolbar2 = new WeakMap();
_uiManager = new WeakMap();
_render = new WeakSet();
render_fn = function() {
const editToolbar = __privateSet(this, _toolbar2, document.createElement("div"));
editToolbar.className = "editToolbar";
editToolbar.setAttribute("role", "toolbar");
editToolbar.addEventListener("contextmenu", noContextMenu, {
signal: __privateGet(this, _uiManager)._signal
});
const buttons = __privateSet(this, _buttons2, document.createElement("div"));
buttons.className = "buttons";
editToolbar.append(buttons);
__privateMethod(this, _addHighlightButton, addHighlightButton_fn).call(this);
return editToolbar;
};
_getLastPoint = new WeakSet();
getLastPoint_fn = function(boxes, isLTR) {
let lastY = 0;
let lastX = 0;
for (const box of boxes) {
const y = box.y + box.height;
if (y < lastY) {
continue;
}
const x = box.x + (isLTR ? box.width : 0);
if (y > lastY) {
lastX = x;
lastY = y;
continue;
}
if (isLTR) {
if (x > lastX) {
lastX = x;
}
} else if (x < lastX) {
lastX = x;
}
}
return [isLTR ? 1 - lastX : lastX, lastY];
};
_addHighlightButton = new WeakSet();
addHighlightButton_fn = function() {
const button = document.createElement("button");
button.className = "highlightButton";
button.tabIndex = 0;
button.setAttribute("data-l10n-id", `pdfjs-highlight-floating-button1`);
const span = document.createElement("span");
button.append(span);
span.className = "visuallyHidden";
span.setAttribute("data-l10n-id", "pdfjs-highlight-floating-button-label");
const signal = __privateGet(this, _uiManager)._signal;
button.addEventListener("contextmenu", noContextMenu, {
signal
});
button.addEventListener("click", () => {
__privateGet(this, _uiManager).highlightSelection("floating_button");
}, {
signal
});
__privateGet(this, _buttons2).append(button);
};
function bindEvents(obj, element, names) {
for (const name of names) {
element.addEventListener(name, obj[name].bind(obj));
}
}
function opacityToHex(opacity) {
return Math.round(Math.min(255, Math.max(1, 255 * opacity))).toString(16).padStart(2, "0");
}
var _id2;
var IdManager = class {
constructor() {
__privateAdd(this, _id2, 0);
}
get id() {
return `${AnnotationEditorPrefix}${__privateWrapper(this, _id2)._++}`;
}
};
_id2 = new WeakMap();
var _baseId, _id3, _cache2, _get, get_fn;
var _ImageManager = class {
constructor() {
__privateAdd(this, _get);
__privateAdd(this, _baseId, getUuid());
__privateAdd(this, _id3, 0);
__privateAdd(this, _cache2, null);
}
static get _isSVGFittingCanvas() {
const svg = `data:image/svg+xml;charset=UTF-8,<svg viewBox="0 0 1 1" width="1" height="1" xmlns="http://www.w3.org/2000/svg"><rect width="1" height="1" style="fill:red;"/></svg>`;
const canvas = new OffscreenCanvas(1, 3);
const ctx = canvas.getContext("2d", {
willReadFrequently: true
});
const image = new Image();
image.src = svg;
const promise = image.decode().then(() => {
ctx.drawImage(image, 0, 0, 1, 1, 0, 0, 1, 3);
return new Uint32Array(ctx.getImageData(0, 0, 1, 1).data.buffer)[0] === 0;
});
return shadow(this, "_isSVGFittingCanvas", promise);
}
async getFromFile(file) {
const {
lastModified,
name,
size,
type
} = file;
return __privateMethod(this, _get, get_fn).call(this, `${lastModified}_${name}_${size}_${type}`, file);
}
async getFromUrl(url) {
return __privateMethod(this, _get, get_fn).call(this, url, url);
}
async getFromId(id) {
__privateGet(this, _cache2) || __privateSet(this, _cache2, /* @__PURE__ */ new Map());
const data = __privateGet(this, _cache2).get(id);
if (!data) {
return null;
}
if (data.bitmap) {
data.refCounter += 1;
return data;
}
if (data.file) {
return this.getFromFile(data.file);
}
return this.getFromUrl(data.url);
}
getSvgUrl(id) {
const data = __privateGet(this, _cache2).get(id);
if (!(data == null ? void 0 : data.isSvg)) {
return null;
}
return data.svgUrl;
}
deleteId(id) {
__privateGet(this, _cache2) || __privateSet(this, _cache2, /* @__PURE__ */ new Map());
const data = __privateGet(this, _cache2).get(id);
if (!data) {
return;
}
data.refCounter -= 1;
if (data.refCounter !== 0) {
return;
}
data.bitmap = null;
}
isValidId(id) {
return id.startsWith(`image_${__privateGet(this, _baseId)}_`);
}
};
var ImageManager = _ImageManager;
_baseId = new WeakMap();
_id3 = new WeakMap();
_cache2 = new WeakMap();
_get = new WeakSet();
get_fn = async function(key, rawData) {
__privateGet(this, _cache2) || __privateSet(this, _cache2, /* @__PURE__ */ new Map());
let data = __privateGet(this, _cache2).get(key);
if (data === null) {
return null;
}
if (data == null ? void 0 : data.bitmap) {
data.refCounter += 1;
return data;
}
try {
data || (data = {
bitmap: null,
id: `image_${__privateGet(this, _baseId)}_${__privateWrapper(this, _id3)._++}`,
refCounter: 0,
isSvg: false
});
let image;
if (typeof rawData === "string") {
data.url = rawData;
image = await fetchData(rawData, "blob");
} else {
image = data.file = rawData;
}
if (image.type === "image/svg+xml") {
const mustRemoveAspectRatioPromise = _ImageManager._isSVGFittingCanvas;
const fileReader = new FileReader();
const imageElement = new Image();
const imagePromise = new Promise((resolve, reject) => {
imageElement.onload = () => {
data.bitmap = imageElement;
data.isSvg = true;
resolve();
};
fileReader.onload = async () => {
const url = data.svgUrl = fileReader.result;
imageElement.src = await mustRemoveAspectRatioPromise ? `${url}#svgView(preserveAspectRatio(none))` : url;
};
imageElement.onerror = fileReader.onerror = reject;
});
fileReader.readAsDataURL(image);
await imagePromise;
} else {
data.bitmap = await createImageBitmap(image);
}
data.refCounter = 1;
} catch (e) {
console.error(e);
data = null;
}
__privateGet(this, _cache2).set(key, data);
if (data) {
__privateGet(this, _cache2).set(data.id, data);
}
return data;
};
var _commands, _locked, _maxSize, _position;
var CommandManager = class {
constructor(maxSize = 128) {
__privateAdd(this, _commands, []);
__privateAdd(this, _locked, false);
__privateAdd(this, _maxSize, void 0);
__privateAdd(this, _position, -1);
__privateSet(this, _maxSize, maxSize);
}
add({
cmd,
undo,
post,
mustExec,
type = NaN,
overwriteIfSameType = false,
keepUndo = false
}) {
if (mustExec) {
cmd();
}
if (__privateGet(this, _locked)) {
return;
}
const save = {
cmd,
undo,
post,
type
};
if (__privateGet(this, _position) === -1) {
if (__privateGet(this, _commands).length > 0) {
__privateGet(this, _commands).length = 0;
}
__privateSet(this, _position, 0);
__privateGet(this, _commands).push(save);
return;
}
if (overwriteIfSameType && __privateGet(this, _commands)[__privateGet(this, _position)].type === type) {
if (keepUndo) {
save.undo = __privateGet(this, _commands)[__privateGet(this, _position)].undo;
}
__privateGet(this, _commands)[__privateGet(this, _position)] = save;
return;
}
const next = __privateGet(this, _position) + 1;
if (next === __privateGet(this, _maxSize)) {
__privateGet(this, _commands).splice(0, 1);
} else {
__privateSet(this, _position, next);
if (next < __privateGet(this, _commands).length) {
__privateGet(this, _commands).splice(next);
}
}
__privateGet(this, _commands).push(save);
}
undo() {
if (__privateGet(this, _position) === -1) {
return;
}
__privateSet(this, _locked, true);
const {
undo,
post
} = __privateGet(this, _commands)[__privateGet(this, _position)];
undo();
post == null ? void 0 : post();
__privateSet(this, _locked, false);
__privateSet(this, _position, __privateGet(this, _position) - 1);
}
redo() {
if (__privateGet(this, _position) < __privateGet(this, _commands).length - 1) {
__privateSet(this, _position, __privateGet(this, _position) + 1);
__privateSet(this, _locked, true);
const {
cmd,
post
} = __privateGet(this, _commands)[__privateGet(this, _position)];
cmd();
post == null ? void 0 : post();
__privateSet(this, _locked, false);
}
}
hasSomethingToUndo() {
return __privateGet(this, _position) !== -1;
}
hasSomethingToRedo() {
return __privateGet(this, _position) < __privateGet(this, _commands).length - 1;
}
destroy() {
__privateSet(this, _commands, null);
}
};
_commands = new WeakMap();
_locked = new WeakMap();
_maxSize = new WeakMap();
_position = new WeakMap();
var _serialize, serialize_fn;
var KeyboardManager = class {
constructor(callbacks) {
__privateAdd(this, _serialize);
this.buffer = [];
this.callbacks = /* @__PURE__ */ new Map();
this.allKeys = /* @__PURE__ */ new Set();
const {
isMac
} = util_FeatureTest.platform;
for (const [keys, callback, options = {}] of callbacks) {
for (const key of keys) {
const isMacKey = key.startsWith("mac+");
if (isMac && isMacKey) {
this.callbacks.set(key.slice(4), {
callback,
options
});
this.allKeys.add(key.split("+").at(-1));
} else if (!isMac && !isMacKey) {
this.callbacks.set(key, {
callback,
options
});
this.allKeys.add(key.split("+").at(-1));
}
}
}
}
exec(self, event) {
if (!this.allKeys.has(event.key)) {
return;
}
const info2 = this.callbacks.get(__privateMethod(this, _serialize, serialize_fn).call(this, event));
if (!info2) {
return;
}
const {
callback,
options: {
bubbles = false,
args = [],
checker = null
}
} = info2;
if (checker && !checker(self, event)) {
return;
}
callback.bind(self, ...args, event)();
if (!bubbles) {
event.stopPropagation();
event.preventDefault();
}
}
};
_serialize = new WeakSet();
serialize_fn = function(event) {
if (event.altKey) {
this.buffer.push("alt");
}
if (event.ctrlKey) {
this.buffer.push("ctrl");
}
if (event.metaKey) {
this.buffer.push("meta");
}
if (event.shiftKey) {
this.buffer.push("shift");
}
this.buffer.push(event.key);
const str = this.buffer.join("+");
this.buffer.length = 0;
return str;
};
var _ColorManager = class {
get _colors() {
const colors = /* @__PURE__ */ new Map([["CanvasText", null], ["Canvas", null]]);
getColorValues(colors);
return shadow(this, "_colors", colors);
}
convert(color2) {
const rgb = getRGB(color2);
if (!window.matchMedia("(forced-colors: active)").matches) {
return rgb;
}
for (const [name, RGB] of this._colors) {
if (RGB.every((x, i) => x === rgb[i])) {
return _ColorManager._colorsMapping.get(name);
}
}
return rgb;
}
getHexCode(name) {
const rgb = this._colors.get(name);
if (!rgb) {
return name;
}
return Util.makeHexColor(...rgb);
}
};
var ColorManager = _ColorManager;
__publicField(ColorManager, "_colorsMapping", /* @__PURE__ */ new Map([["CanvasText", [0, 0, 0]], ["Canvas", [255, 255, 255]]]));
var _abortController, _activeEditor, _allEditors, _allLayers, _altTextManager, _annotationStorage, _changedExistingAnnotations, _commandManager, _copyPasteAC, _currentPageIndex, _deletedAnnotationsElementIds, _draggingEditors, _editorTypes, _editorsToRescale, _enableHighlightFloatingButton, _enableUpdatedAddImage, _enableNewAltTextWhenAddingImage, _filterFactory, _focusMainContainerTimeoutId, _focusManagerAC, _highlightColors, _highlightWhenShiftUp, _highlightToolbar, _idManager, _isEnabled, _isWaiting, _keyboardManagerAC, _lastActiveElement, _mainHighlightColorPicker, _mlManager, _mode, _selectedEditors, _selectedTextNode, _pageColors, _showAllStates, _previousStates, _translation, _translationTimeoutId, _container, _viewer, _getAnchorElementForSelection, getAnchorElementForSelection_fn, _getLayerForTextLayer, getLayerForTextLayer_fn, _displayHighlightToolbar, displayHighlightToolbar_fn, _selectionChange, selectionChange_fn, _onSelectEnd, onSelectEnd_fn, _addSelectionListener, addSelectionListener_fn, _addFocusManager, addFocusManager_fn, _removeFocusManager, removeFocusManager_fn, _addKeyboardManager, addKeyboardManager_fn, _removeKeyboardManager, removeKeyboardManager_fn, _addCopyPasteListeners, addCopyPasteListeners_fn, _removeCopyPasteListeners, removeCopyPasteListeners_fn, _addDragAndDropListeners, addDragAndDropListeners_fn, _dispatchUpdateStates, dispatchUpdateStates_fn, _dispatchUpdateUI, dispatchUpdateUI_fn, _enableAll, enableAll_fn, _disableAll, disableAll_fn, _addEditorToLayer, addEditorToLayer_fn, _lastSelectedEditor, lastSelectedEditor_get, _isEmpty, isEmpty_fn, _selectEditors, selectEditors_fn;
var _AnnotationEditorUIManager = class {
constructor(container, viewer, altTextManager, eventBus, pdfDocument, pageColors, highlightColors, enableHighlightFloatingButton, enableUpdatedAddImage, enableNewAltTextWhenAddingImage, mlManager) {
__privateAdd(this, _getAnchorElementForSelection);
__privateAdd(this, _getLayerForTextLayer);
__privateAdd(this, _displayHighlightToolbar);
__privateAdd(this, _selectionChange);
__privateAdd(this, _onSelectEnd);
__privateAdd(this, _addSelectionListener);
__privateAdd(this, _addFocusManager);
__privateAdd(this, _removeFocusManager);
__privateAdd(this, _addKeyboardManager);
__privateAdd(this, _removeKeyboardManager);
__privateAdd(this, _addCopyPasteListeners);
__privateAdd(this, _removeCopyPasteListeners);
__privateAdd(this, _addDragAndDropListeners);
__privateAdd(this, _dispatchUpdateStates);
__privateAdd(this, _dispatchUpdateUI);
__privateAdd(this, _enableAll);
__privateAdd(this, _disableAll);
__privateAdd(this, _addEditorToLayer);
__privateAdd(this, _lastSelectedEditor);
__privateAdd(this, _isEmpty);
__privateAdd(this, _selectEditors);
__privateAdd(this, _abortController, new AbortController());
__privateAdd(this, _activeEditor, null);
__privateAdd(this, _allEditors, /* @__PURE__ */ new Map());
__privateAdd(this, _allLayers, /* @__PURE__ */ new Map());
__privateAdd(this, _altTextManager, null);
__privateAdd(this, _annotationStorage, null);
__privateAdd(this, _changedExistingAnnotations, null);
__privateAdd(this, _commandManager, new CommandManager());
__privateAdd(this, _copyPasteAC, null);
__privateAdd(this, _currentPageIndex, 0);
__privateAdd(this, _deletedAnnotationsElementIds, /* @__PURE__ */ new Set());
__privateAdd(this, _draggingEditors, null);
__privateAdd(this, _editorTypes, null);
__privateAdd(this, _editorsToRescale, /* @__PURE__ */ new Set());
__privateAdd(this, _enableHighlightFloatingButton, false);
__privateAdd(this, _enableUpdatedAddImage, false);
__privateAdd(this, _enableNewAltTextWhenAddingImage, false);
__privateAdd(this, _filterFactory, null);
__privateAdd(this, _focusMainContainerTimeoutId, null);
__privateAdd(this, _focusManagerAC, null);
__privateAdd(this, _highlightColors, null);
__privateAdd(this, _highlightWhenShiftUp, false);
__privateAdd(this, _highlightToolbar, null);
__privateAdd(this, _idManager, new IdManager());
__privateAdd(this, _isEnabled, false);
__privateAdd(this, _isWaiting, false);
__privateAdd(this, _keyboardManagerAC, null);
__privateAdd(this, _lastActiveElement, null);
__privateAdd(this, _mainHighlightColorPicker, null);
__privateAdd(this, _mlManager, null);
__privateAdd(this, _mode, AnnotationEditorType.NONE);
__privateAdd(this, _selectedEditors, /* @__PURE__ */ new Set());
__privateAdd(this, _selectedTextNode, null);
__privateAdd(this, _pageColors, null);
__privateAdd(this, _showAllStates, null);
__privateAdd(this, _previousStates, {
isEditing: false,
isEmpty: true,
hasSomethingToUndo: false,
hasSomethingToRedo: false,
hasSelectedEditor: false,
hasSelectedText: false
});
__privateAdd(this, _translation, [0, 0]);
__privateAdd(this, _translationTimeoutId, null);
__privateAdd(this, _container, null);
__privateAdd(this, _viewer, null);
const signal = this._signal = __privateGet(this, _abortController).signal;
__privateSet(this, _container, container);
__privateSet(this, _viewer, viewer);
__privateSet(this, _altTextManager, altTextManager);
this._eventBus = eventBus;
eventBus._on("editingaction", this.onEditingAction.bind(this), {
signal
});
eventBus._on("pagechanging", this.onPageChanging.bind(this), {
signal
});
eventBus._on("scalechanging", this.onScaleChanging.bind(this), {
signal
});
eventBus._on("rotationchanging", this.onRotationChanging.bind(this), {
signal
});
eventBus._on("setpreference", this.onSetPreference.bind(this), {
signal
});
eventBus._on("switchannotationeditorparams", (evt) => this.updateParams(evt.type, evt.value), {
signal
});
__privateMethod(this, _addSelectionListener, addSelectionListener_fn).call(this);
__privateMethod(this, _addDragAndDropListeners, addDragAndDropListeners_fn).call(this);
__privateMethod(this, _addKeyboardManager, addKeyboardManager_fn).call(this);
__privateSet(this, _annotationStorage, pdfDocument.annotationStorage);
__privateSet(this, _filterFactory, pdfDocument.filterFactory);
__privateSet(this, _pageColors, pageColors);
__privateSet(this, _highlightColors, highlightColors || null);
__privateSet(this, _enableHighlightFloatingButton, enableHighlightFloatingButton);
__privateSet(this, _enableUpdatedAddImage, enableUpdatedAddImage);
__privateSet(this, _enableNewAltTextWhenAddingImage, enableNewAltTextWhenAddingImage);
__privateSet(this, _mlManager, mlManager || null);
this.viewParameters = {
realScale: PixelsPerInch.PDF_TO_CSS_UNITS,
rotation: 0
};
this.isShiftKeyDown = false;
}
static get _keyboardManager() {
const proto = _AnnotationEditorUIManager.prototype;
const arrowChecker = (self) => __privateGet(self, _container).contains(document.activeElement) && document.activeElement.tagName !== "BUTTON" && self.hasSomethingToControl();
const textInputChecker = (_self, {
target: el
}) => {
if (el instanceof HTMLInputElement) {
const {
type
} = el;
return type !== "text" && type !== "number";
}
return true;
};
const small = this.TRANSLATE_SMALL;
const big = this.TRANSLATE_BIG;
return shadow(this, "_keyboardManager", new KeyboardManager([[["ctrl+a", "mac+meta+a"], proto.selectAll, {
checker: textInputChecker
}], [["ctrl+z", "mac+meta+z"], proto.undo, {
checker: textInputChecker
}], [["ctrl+y", "ctrl+shift+z", "mac+meta+shift+z", "ctrl+shift+Z", "mac+meta+shift+Z"], proto.redo, {
checker: textInputChecker
}], [["Backspace", "alt+Backspace", "ctrl+Backspace", "shift+Backspace", "mac+Backspace", "mac+alt+Backspace", "mac+ctrl+Backspace", "Delete", "ctrl+Delete", "shift+Delete", "mac+Delete"], proto.delete, {
checker: textInputChecker
}], [["Enter", "mac+Enter"], proto.addNewEditorFromKeyboard, {
checker: (self, {
target: el
}) => !(el instanceof HTMLButtonElement) && __privateGet(self, _container).contains(el) && !self.isEnterHandled
}], [[" ", "mac+ "], proto.addNewEditorFromKeyboard, {
checker: (self, {
target: el
}) => !(el instanceof HTMLButtonElement) && __privateGet(self, _container).contains(document.activeElement)
}], [["Escape", "mac+Escape"], proto.unselectAll], [["ArrowLeft", "mac+ArrowLeft"], proto.translateSelectedEditors, {
args: [-small, 0],
checker: arrowChecker
}], [["ctrl+ArrowLeft", "mac+shift+ArrowLeft"], proto.translateSelectedEditors, {
args: [-big, 0],
checker: arrowChecker
}], [["ArrowRight", "mac+ArrowRight"], proto.translateSelectedEditors, {
args: [small, 0],
checker: arrowChecker
}], [["ctrl+ArrowRight", "mac+shift+ArrowRight"], proto.translateSelectedEditors, {
args: [big, 0],
checker: arrowChecker
}], [["ArrowUp", "mac+ArrowUp"], proto.translateSelectedEditors, {
args: [0, -small],
checker: arrowChecker
}], [["ctrl+ArrowUp", "mac+shift+ArrowUp"], proto.translateSelectedEditors, {
args: [0, -big],
checker: arrowChecker
}], [["ArrowDown", "mac+ArrowDown"], proto.translateSelectedEditors, {
args: [0, small],
checker: arrowChecker
}], [["ctrl+ArrowDown", "mac+shift+ArrowDown"], proto.translateSelectedEditors, {
args: [0, big],
checker: arrowChecker
}]]));
}
destroy() {
var _a2, _b, _c;
(_a2 = __privateGet(this, _abortController)) == null ? void 0 : _a2.abort();
__privateSet(this, _abortController, null);
this._signal = null;
for (const layer of __privateGet(this, _allLayers).values()) {
layer.destroy();
}
__privateGet(this, _allLayers).clear();
__privateGet(this, _allEditors).clear();
__privateGet(this, _editorsToRescale).clear();
__privateSet(this, _activeEditor, null);
__privateGet(this, _selectedEditors).clear();
__privateGet(this, _commandManager).destroy();
(_b = __privateGet(this, _altTextManager)) == null ? void 0 : _b.destroy();
(_c = __privateGet(this, _highlightToolbar)) == null ? void 0 : _c.hide();
__privateSet(this, _highlightToolbar, null);
if (__privateGet(this, _focusMainContainerTimeoutId)) {
clearTimeout(__privateGet(this, _focusMainContainerTimeoutId));
__privateSet(this, _focusMainContainerTimeoutId, null);
}
if (__privateGet(this, _translationTimeoutId)) {
clearTimeout(__privateGet(this, _translationTimeoutId));
__privateSet(this, _translationTimeoutId, null);
}
}
combinedSignal(ac) {
return AbortSignal.any([this._signal, ac.signal]);
}
get mlManager() {
return __privateGet(this, _mlManager);
}
get useNewAltTextFlow() {
return __privateGet(this, _enableUpdatedAddImage);
}
get useNewAltTextWhenAddingImage() {
return __privateGet(this, _enableNewAltTextWhenAddingImage);
}
get hcmFilter() {
return shadow(this, "hcmFilter", __privateGet(this, _pageColors) ? __privateGet(this, _filterFactory).addHCMFilter(__privateGet(this, _pageColors).foreground, __privateGet(this, _pageColors).background) : "none");
}
get direction() {
return shadow(this, "direction", getComputedStyle(__privateGet(this, _container)).direction);
}
get highlightColors() {
return shadow(this, "highlightColors", __privateGet(this, _highlightColors) ? new Map(__privateGet(this, _highlightColors).split(",").map((pair) => pair.split("=").map((x) => x.trim()))) : null);
}
get highlightColorNames() {
return shadow(this, "highlightColorNames", this.highlightColors ? new Map(Array.from(this.highlightColors, (e) => e.reverse())) : null);
}
setMainHighlightColorPicker(colorPicker) {
__privateSet(this, _mainHighlightColorPicker, colorPicker);
}
editAltText(editor, firstTime = false) {
var _a2;
(_a2 = __privateGet(this, _altTextManager)) == null ? void 0 : _a2.editAltText(this, editor, firstTime);
}
switchToMode(mode, callback) {
this._eventBus.on("annotationeditormodechanged", callback, {
once: true,
signal: this._signal
});
this._eventBus.dispatch("showannotationeditorui", {
source: this,
mode
});
}
setPreference(name, value) {
this._eventBus.dispatch("setpreference", {
source: this,
name,
value
});
}
onSetPreference({
name,
value
}) {
switch (name) {
case "enableNewAltTextWhenAddingImage":
__privateSet(this, _enableNewAltTextWhenAddingImage, value);
break;
}
}
onPageChanging({
pageNumber
}) {
__privateSet(this, _currentPageIndex, pageNumber - 1);
}
focusMainContainer() {
__privateGet(this, _container).focus();
}
findParent(x, y) {
for (const layer of __privateGet(this, _allLayers).values()) {
const {
x: layerX,
y: layerY,
width,
height
} = layer.div.getBoundingClientRect();
if (x >= layerX && x <= layerX + width && y >= layerY && y <= layerY + height) {
return layer;
}
}
return null;
}
disableUserSelect(value = false) {
__privateGet(this, _viewer).classList.toggle("noUserSelect", value);
}
addShouldRescale(editor) {
__privateGet(this, _editorsToRescale).add(editor);
}
removeShouldRescale(editor) {
__privateGet(this, _editorsToRescale).delete(editor);
}
onScaleChanging({
scale
}) {
this.commitOrRemove();
this.viewParameters.realScale = scale * PixelsPerInch.PDF_TO_CSS_UNITS;
for (const editor of __privateGet(this, _editorsToRescale)) {
editor.onScaleChanging();
}
}
onRotationChanging({
pagesRotation
}) {
this.commitOrRemove();
this.viewParameters.rotation = pagesRotation;
}
highlightSelection(methodOfCreation = "") {
const selection = document.getSelection();
if (!selection || selection.isCollapsed) {
return;
}
const {
anchorNode,
anchorOffset,
focusNode,
focusOffset
} = selection;
const text = selection.toString();
const anchorElement = __privateMethod(this, _getAnchorElementForSelection, getAnchorElementForSelection_fn).call(this, selection);
const textLayer = anchorElement.closest(".textLayer");
const boxes = this.getSelectionBoxes(textLayer);
if (!boxes) {
return;
}
selection.empty();
const layer = __privateMethod(this, _getLayerForTextLayer, getLayerForTextLayer_fn).call(this, textLayer);
const isNoneMode = __privateGet(this, _mode) === AnnotationEditorType.NONE;
const callback = () => {
layer == null ? void 0 : layer.createAndAddNewEditor({
x: 0,
y: 0
}, false, {
methodOfCreation,
boxes,
anchorNode,
anchorOffset,
focusNode,
focusOffset,
text
});
if (isNoneMode) {
this.showAllEditors("highlight", true, true);
}
};
if (isNoneMode) {
this.switchToMode(AnnotationEditorType.HIGHLIGHT, callback);
return;
}
callback();
}
addToAnnotationStorage(editor) {
if (!editor.isEmpty() && __privateGet(this, _annotationStorage) && !__privateGet(this, _annotationStorage).has(editor.id)) {
__privateGet(this, _annotationStorage).setValue(editor.id, editor);
}
}
blur() {
this.isShiftKeyDown = false;
if (__privateGet(this, _highlightWhenShiftUp)) {
__privateSet(this, _highlightWhenShiftUp, false);
__privateMethod(this, _onSelectEnd, onSelectEnd_fn).call(this, "main_toolbar");
}
if (!this.hasSelection) {
return;
}
const {
activeElement
} = document;
for (const editor of __privateGet(this, _selectedEditors)) {
if (editor.div.contains(activeElement)) {
__privateSet(this, _lastActiveElement, [editor, activeElement]);
editor._focusEventsAllowed = false;
break;
}
}
}
focus() {
if (!__privateGet(this, _lastActiveElement)) {
return;
}
const [lastEditor, lastActiveElement] = __privateGet(this, _lastActiveElement);
__privateSet(this, _lastActiveElement, null);
lastActiveElement.addEventListener("focusin", () => {
lastEditor._focusEventsAllowed = true;
}, {
once: true,
signal: this._signal
});
lastActiveElement.focus();
}
addEditListeners() {
__privateMethod(this, _addKeyboardManager, addKeyboardManager_fn).call(this);
__privateMethod(this, _addCopyPasteListeners, addCopyPasteListeners_fn).call(this);
}
removeEditListeners() {
__privateMethod(this, _removeKeyboardManager, removeKeyboardManager_fn).call(this);
__privateMethod(this, _removeCopyPasteListeners, removeCopyPasteListeners_fn).call(this);
}
dragOver(event) {
for (const {
type
} of event.dataTransfer.items) {
for (const editorType of __privateGet(this, _editorTypes)) {
if (editorType.isHandlingMimeForPasting(type)) {
event.dataTransfer.dropEffect = "copy";
event.preventDefault();
return;
}
}
}
}
drop(event) {
for (const item of event.dataTransfer.items) {
for (const editorType of __privateGet(this, _editorTypes)) {
if (editorType.isHandlingMimeForPasting(item.type)) {
editorType.paste(item, this.currentLayer);
event.preventDefault();
return;
}
}
}
}
copy(event) {
var _a2;
event.preventDefault();
(_a2 = __privateGet(this, _activeEditor)) == null ? void 0 : _a2.commitOrRemove();
if (!this.hasSelection) {
return;
}
const editors = [];
for (const editor of __privateGet(this, _selectedEditors)) {
const serialized = editor.serialize(true);
if (serialized) {
editors.push(serialized);
}
}
if (editors.length === 0) {
return;
}
event.clipboardData.setData("application/pdfjs", JSON.stringify(editors));
}
cut(event) {
this.copy(event);
this.delete();
}
paste(event) {
event.preventDefault();
const {
clipboardData
} = event;
for (const item of clipboardData.items) {
for (const editorType of __privateGet(this, _editorTypes)) {
if (editorType.isHandlingMimeForPasting(item.type)) {
editorType.paste(item, this.currentLayer);
return;
}
}
}
let data = clipboardData.getData("application/pdfjs");
if (!data) {
return;
}
try {
data = JSON.parse(data);
} catch (ex) {
warn(`paste: "${ex.message}".`);
return;
}
if (!Array.isArray(data)) {
return;
}
this.unselectAll();
const layer = this.currentLayer;
try {
const newEditors = [];
for (const editor of data) {
const deserializedEditor = layer.deserialize(editor);
if (!deserializedEditor) {
return;
}
newEditors.push(deserializedEditor);
}
const cmd = () => {
for (const editor of newEditors) {
__privateMethod(this, _addEditorToLayer, addEditorToLayer_fn).call(this, editor);
}
__privateMethod(this, _selectEditors, selectEditors_fn).call(this, newEditors);
};
const undo = () => {
for (const editor of newEditors) {
editor.remove();
}
};
this.addCommands({
cmd,
undo,
mustExec: true
});
} catch (ex) {
warn(`paste: "${ex.message}".`);
}
}
keydown(event) {
if (!this.isShiftKeyDown && event.key === "Shift") {
this.isShiftKeyDown = true;
}
if (__privateGet(this, _mode) !== AnnotationEditorType.NONE && !this.isEditorHandlingKeyboard) {
_AnnotationEditorUIManager._keyboardManager.exec(this, event);
}
}
keyup(event) {
if (this.isShiftKeyDown && event.key === "Shift") {
this.isShiftKeyDown = false;
if (__privateGet(this, _highlightWhenShiftUp)) {
__privateSet(this, _highlightWhenShiftUp, false);
__privateMethod(this, _onSelectEnd, onSelectEnd_fn).call(this, "main_toolbar");
}
}
}
onEditingAction({
name
}) {
switch (name) {
case "undo":
case "redo":
case "delete":
case "selectAll":
this[name]();
break;
case "highlightSelection":
this.highlightSelection("context_menu");
break;
}
}
setEditingState(isEditing) {
if (isEditing) {
__privateMethod(this, _addFocusManager, addFocusManager_fn).call(this);
__privateMethod(this, _addCopyPasteListeners, addCopyPasteListeners_fn).call(this);
__privateMethod(this, _dispatchUpdateStates, dispatchUpdateStates_fn).call(this, {
isEditing: __privateGet(this, _mode) !== AnnotationEditorType.NONE,
isEmpty: __privateMethod(this, _isEmpty, isEmpty_fn).call(this),
hasSomethingToUndo: __privateGet(this, _commandManager).hasSomethingToUndo(),
hasSomethingToRedo: __privateGet(this, _commandManager).hasSomethingToRedo(),
hasSelectedEditor: false
});
} else {
__privateMethod(this, _removeFocusManager, removeFocusManager_fn).call(this);
__privateMethod(this, _removeCopyPasteListeners, removeCopyPasteListeners_fn).call(this);
__privateMethod(this, _dispatchUpdateStates, dispatchUpdateStates_fn).call(this, {
isEditing: false
});
this.disableUserSelect(false);
}
}
registerEditorTypes(types) {
if (__privateGet(this, _editorTypes)) {
return;
}
__privateSet(this, _editorTypes, types);
for (const editorType of __privateGet(this, _editorTypes)) {
__privateMethod(this, _dispatchUpdateUI, dispatchUpdateUI_fn).call(this, editorType.defaultPropertiesToUpdate);
}
}
getId() {
return __privateGet(this, _idManager).id;
}
get currentLayer() {
return __privateGet(this, _allLayers).get(__privateGet(this, _currentPageIndex));
}
getLayer(pageIndex) {
return __privateGet(this, _allLayers).get(pageIndex);
}
get currentPageIndex() {
return __privateGet(this, _currentPageIndex);
}
addLayer(layer) {
__privateGet(this, _allLayers).set(layer.pageIndex, layer);
if (__privateGet(this, _isEnabled)) {
layer.enable();
} else {
layer.disable();
}
}
removeLayer(layer) {
__privateGet(this, _allLayers).delete(layer.pageIndex);
}
updateMode(mode, editId = null, isFromKeyboard = false) {
if (__privateGet(this, _mode) === mode) {
return;
}
__privateSet(this, _mode, mode);
if (mode === AnnotationEditorType.NONE) {
this.setEditingState(false);
__privateMethod(this, _disableAll, disableAll_fn).call(this);
return;
}
this.setEditingState(true);
__privateMethod(this, _enableAll, enableAll_fn).call(this);
this.unselectAll();
for (const layer of __privateGet(this, _allLayers).values()) {
layer.updateMode(mode);
}
if (!editId && isFromKeyboard) {
this.addNewEditorFromKeyboard();
return;
}
if (!editId) {
return;
}
for (const editor of __privateGet(this, _allEditors).values()) {
if (editor.annotationElementId === editId) {
this.setSelected(editor);
editor.enterInEditMode();
break;
}
}
}
addNewEditorFromKeyboard() {
if (this.currentLayer.canCreateNewEmptyEditor()) {
this.currentLayer.addNewEditor();
}
}
updateToolbar(mode) {
if (mode === __privateGet(this, _mode)) {
return;
}
this._eventBus.dispatch("switchannotationeditormode", {
source: this,
mode
});
}
updateParams(type, value) {
var _a2;
if (!__privateGet(this, _editorTypes)) {
return;
}
switch (type) {
case AnnotationEditorParamsType.CREATE:
this.currentLayer.addNewEditor();
return;
case AnnotationEditorParamsType.HIGHLIGHT_DEFAULT_COLOR:
(_a2 = __privateGet(this, _mainHighlightColorPicker)) == null ? void 0 : _a2.updateColor(value);
break;
case AnnotationEditorParamsType.HIGHLIGHT_SHOW_ALL:
this._eventBus.dispatch("reporttelemetry", {
source: this,
details: {
type: "editing",
data: {
type: "highlight",
action: "toggle_visibility"
}
}
});
(__privateGet(this, _showAllStates) || __privateSet(this, _showAllStates, /* @__PURE__ */ new Map())).set(type, value);
this.showAllEditors("highlight", value);
break;
}
for (const editor of __privateGet(this, _selectedEditors)) {
editor.updateParams(type, value);
}
for (const editorType of __privateGet(this, _editorTypes)) {
editorType.updateDefaultParams(type, value);
}
}
showAllEditors(type, visible, updateButton = false) {
var _a2, _b;
for (const editor of __privateGet(this, _allEditors).values()) {
if (editor.editorType === type) {
editor.show(visible);
}
}
const state = (_b = (_a2 = __privateGet(this, _showAllStates)) == null ? void 0 : _a2.get(AnnotationEditorParamsType.HIGHLIGHT_SHOW_ALL)) != null ? _b : true;
if (state !== visible) {
__privateMethod(this, _dispatchUpdateUI, dispatchUpdateUI_fn).call(this, [[AnnotationEditorParamsType.HIGHLIGHT_SHOW_ALL, visible]]);
}
}
enableWaiting(mustWait = false) {
if (__privateGet(this, _isWaiting) === mustWait) {
return;
}
__privateSet(this, _isWaiting, mustWait);
for (const layer of __privateGet(this, _allLayers).values()) {
if (mustWait) {
layer.disableClick();
} else {
layer.enableClick();
}
layer.div.classList.toggle("waiting", mustWait);
}
}
getEditors(pageIndex) {
const editors = [];
for (const editor of __privateGet(this, _allEditors).values()) {
if (editor.pageIndex === pageIndex) {
editors.push(editor);
}
}
return editors;
}
getEditor(id) {
return __privateGet(this, _allEditors).get(id);
}
addEditor(editor) {
__privateGet(this, _allEditors).set(editor.id, editor);
}
removeEditor(editor) {
var _a2;
if (editor.div.contains(document.activeElement)) {
if (__privateGet(this, _focusMainContainerTimeoutId)) {
clearTimeout(__privateGet(this, _focusMainContainerTimeoutId));
}
__privateSet(this, _focusMainContainerTimeoutId, setTimeout(() => {
this.focusMainContainer();
__privateSet(this, _focusMainContainerTimeoutId, null);
}, 0));
}
__privateGet(this, _allEditors).delete(editor.id);
this.unselect(editor);
if (!editor.annotationElementId || !__privateGet(this, _deletedAnnotationsElementIds).has(editor.annotationElementId)) {
(_a2 = __privateGet(this, _annotationStorage)) == null ? void 0 : _a2.remove(editor.id);
}
}
addDeletedAnnotationElement(editor) {
__privateGet(this, _deletedAnnotationsElementIds).add(editor.annotationElementId);
this.addChangedExistingAnnotation(editor);
editor.deleted = true;
}
isDeletedAnnotationElement(annotationElementId) {
return __privateGet(this, _deletedAnnotationsElementIds).has(annotationElementId);
}
removeDeletedAnnotationElement(editor) {
__privateGet(this, _deletedAnnotationsElementIds).delete(editor.annotationElementId);
this.removeChangedExistingAnnotation(editor);
editor.deleted = false;
}
setActiveEditor(editor) {
if (__privateGet(this, _activeEditor) === editor) {
return;
}
__privateSet(this, _activeEditor, editor);
if (editor) {
__privateMethod(this, _dispatchUpdateUI, dispatchUpdateUI_fn).call(this, editor.propertiesToUpdate);
}
}
updateUI(editor) {
if (__privateGet(this, _lastSelectedEditor, lastSelectedEditor_get) === editor) {
__privateMethod(this, _dispatchUpdateUI, dispatchUpdateUI_fn).call(this, editor.propertiesToUpdate);
}
}
toggleSelected(editor) {
if (__privateGet(this, _selectedEditors).has(editor)) {
__privateGet(this, _selectedEditors).delete(editor);
editor.unselect();
__privateMethod(this, _dispatchUpdateStates, dispatchUpdateStates_fn).call(this, {
hasSelectedEditor: this.hasSelection
});
return;
}
__privateGet(this, _selectedEditors).add(editor);
editor.select();
__privateMethod(this, _dispatchUpdateUI, dispatchUpdateUI_fn).call(this, editor.propertiesToUpdate);
__privateMethod(this, _dispatchUpdateStates, dispatchUpdateStates_fn).call(this, {
hasSelectedEditor: true
});
}
setSelected(editor) {
for (const ed of __privateGet(this, _selectedEditors)) {
if (ed !== editor) {
ed.unselect();
}
}
__privateGet(this, _selectedEditors).clear();
__privateGet(this, _selectedEditors).add(editor);
editor.select();
__privateMethod(this, _dispatchUpdateUI, dispatchUpdateUI_fn).call(this, editor.propertiesToUpdate);
__privateMethod(this, _dispatchUpdateStates, dispatchUpdateStates_fn).call(this, {
hasSelectedEditor: true
});
}
isSelected(editor) {
return __privateGet(this, _selectedEditors).has(editor);
}
get firstSelectedEditor() {
return __privateGet(this, _selectedEditors).values().next().value;
}
unselect(editor) {
editor.unselect();
__privateGet(this, _selectedEditors).delete(editor);
__privateMethod(this, _dispatchUpdateStates, dispatchUpdateStates_fn).call(this, {
hasSelectedEditor: this.hasSelection
});
}
get hasSelection() {
return __privateGet(this, _selectedEditors).size !== 0;
}
get isEnterHandled() {
return __privateGet(this, _selectedEditors).size === 1 && this.firstSelectedEditor.isEnterHandled;
}
undo() {
__privateGet(this, _commandManager).undo();
__privateMethod(this, _dispatchUpdateStates, dispatchUpdateStates_fn).call(this, {
hasSomethingToUndo: __privateGet(this, _commandManager).hasSomethingToUndo(),
hasSomethingToRedo: true,
isEmpty: __privateMethod(this, _isEmpty, isEmpty_fn).call(this)
});
}
redo() {
__privateGet(this, _commandManager).redo();
__privateMethod(this, _dispatchUpdateStates, dispatchUpdateStates_fn).call(this, {
hasSomethingToUndo: true,
hasSomethingToRedo: __privateGet(this, _commandManager).hasSomethingToRedo(),
isEmpty: __privateMethod(this, _isEmpty, isEmpty_fn).call(this)
});
}
addCommands(params) {
__privateGet(this, _commandManager).add(params);
__privateMethod(this, _dispatchUpdateStates, dispatchUpdateStates_fn).call(this, {
hasSomethingToUndo: true,
hasSomethingToRedo: false,
isEmpty: __privateMethod(this, _isEmpty, isEmpty_fn).call(this)
});
}
delete() {
this.commitOrRemove();
if (!this.hasSelection) {
return;
}
const editors = [...__privateGet(this, _selectedEditors)];
const cmd = () => {
for (const editor of editors) {
editor.remove();
}
};
const undo = () => {
for (const editor of editors) {
__privateMethod(this, _addEditorToLayer, addEditorToLayer_fn).call(this, editor);
}
};
this.addCommands({
cmd,
undo,
mustExec: true
});
}
commitOrRemove() {
var _a2;
(_a2 = __privateGet(this, _activeEditor)) == null ? void 0 : _a2.commitOrRemove();
}
hasSomethingToControl() {
return __privateGet(this, _activeEditor) || this.hasSelection;
}
selectAll() {
for (const editor of __privateGet(this, _selectedEditors)) {
editor.commit();
}
__privateMethod(this, _selectEditors, selectEditors_fn).call(this, __privateGet(this, _allEditors).values());
}
unselectAll() {
if (__privateGet(this, _activeEditor)) {
__privateGet(this, _activeEditor).commitOrRemove();
if (__privateGet(this, _mode) !== AnnotationEditorType.NONE) {
return;
}
}
if (!this.hasSelection) {
return;
}
for (const editor of __privateGet(this, _selectedEditors)) {
editor.unselect();
}
__privateGet(this, _selectedEditors).clear();
__privateMethod(this, _dispatchUpdateStates, dispatchUpdateStates_fn).call(this, {
hasSelectedEditor: false
});
}
translateSelectedEditors(x, y, noCommit = false) {
if (!noCommit) {
this.commitOrRemove();
}
if (!this.hasSelection) {
return;
}
__privateGet(this, _translation)[0] += x;
__privateGet(this, _translation)[1] += y;
const [totalX, totalY] = __privateGet(this, _translation);
const editors = [...__privateGet(this, _selectedEditors)];
const TIME_TO_WAIT = 1e3;
if (__privateGet(this, _translationTimeoutId)) {
clearTimeout(__privateGet(this, _translationTimeoutId));
}
__privateSet(this, _translationTimeoutId, setTimeout(() => {
__privateSet(this, _translationTimeoutId, null);
__privateGet(this, _translation)[0] = __privateGet(this, _translation)[1] = 0;
this.addCommands({
cmd: () => {
for (const editor of editors) {
if (__privateGet(this, _allEditors).has(editor.id)) {
editor.translateInPage(totalX, totalY);
}
}
},
undo: () => {
for (const editor of editors) {
if (__privateGet(this, _allEditors).has(editor.id)) {
editor.translateInPage(-totalX, -totalY);
}
}
},
mustExec: false
});
}, TIME_TO_WAIT));
for (const editor of editors) {
editor.translateInPage(x, y);
}
}
setUpDragSession() {
if (!this.hasSelection) {
return;
}
this.disableUserSelect(true);
__privateSet(this, _draggingEditors, /* @__PURE__ */ new Map());
for (const editor of __privateGet(this, _selectedEditors)) {
__privateGet(this, _draggingEditors).set(editor, {
savedX: editor.x,
savedY: editor.y,
savedPageIndex: editor.pageIndex,
newX: 0,
newY: 0,
newPageIndex: -1
});
}
}
endDragSession() {
if (!__privateGet(this, _draggingEditors)) {
return false;
}
this.disableUserSelect(false);
const map = __privateGet(this, _draggingEditors);
__privateSet(this, _draggingEditors, null);
let mustBeAddedInUndoStack = false;
for (const [{
x,
y,
pageIndex
}, value] of map) {
value.newX = x;
value.newY = y;
value.newPageIndex = pageIndex;
mustBeAddedInUndoStack || (mustBeAddedInUndoStack = x !== value.savedX || y !== value.savedY || pageIndex !== value.savedPageIndex);
}
if (!mustBeAddedInUndoStack) {
return false;
}
const move = (editor, x, y, pageIndex) => {
if (__privateGet(this, _allEditors).has(editor.id)) {
const parent = __privateGet(this, _allLayers).get(pageIndex);
if (parent) {
editor._setParentAndPosition(parent, x, y);
} else {
editor.pageIndex = pageIndex;
editor.x = x;
editor.y = y;
}
}
};
this.addCommands({
cmd: () => {
for (const [editor, {
newX,
newY,
newPageIndex
}] of map) {
move(editor, newX, newY, newPageIndex);
}
},
undo: () => {
for (const [editor, {
savedX,
savedY,
savedPageIndex
}] of map) {
move(editor, savedX, savedY, savedPageIndex);
}
},
mustExec: true
});
return true;
}
dragSelectedEditors(tx, ty) {
if (!__privateGet(this, _draggingEditors)) {
return;
}
for (const editor of __privateGet(this, _draggingEditors).keys()) {
editor.drag(tx, ty);
}
}
rebuild(editor) {
if (editor.parent === null) {
const parent = this.getLayer(editor.pageIndex);
if (parent) {
parent.changeParent(editor);
parent.addOrRebuild(editor);
} else {
this.addEditor(editor);
this.addToAnnotationStorage(editor);
editor.rebuild();
}
} else {
editor.parent.addOrRebuild(editor);
}
}
get isEditorHandlingKeyboard() {
var _a2;
return ((_a2 = this.getActive()) == null ? void 0 : _a2.shouldGetKeyboardEvents()) || __privateGet(this, _selectedEditors).size === 1 && this.firstSelectedEditor.shouldGetKeyboardEvents();
}
isActive(editor) {
return __privateGet(this, _activeEditor) === editor;
}
getActive() {
return __privateGet(this, _activeEditor);
}
getMode() {
return __privateGet(this, _mode);
}
get imageManager() {
return shadow(this, "imageManager", new ImageManager());
}
getSelectionBoxes(textLayer) {
if (!textLayer) {
return null;
}
const selection = document.getSelection();
for (let i = 0, ii = selection.rangeCount; i < ii; i++) {
if (!textLayer.contains(selection.getRangeAt(i).commonAncestorContainer)) {
return null;
}
}
const {
x: layerX,
y: layerY,
width: parentWidth,
height: parentHeight
} = textLayer.getBoundingClientRect();
let rotator;
switch (textLayer.getAttribute("data-main-rotation")) {
case "90":
rotator = (x, y, w, h) => ({
x: (y - layerY) / parentHeight,
y: 1 - (x + w - layerX) / parentWidth,
width: h / parentHeight,
height: w / parentWidth
});
break;
case "180":
rotator = (x, y, w, h) => ({
x: 1 - (x + w - layerX) / parentWidth,
y: 1 - (y + h - layerY) / parentHeight,
width: w / parentWidth,
height: h / parentHeight
});
break;
case "270":
rotator = (x, y, w, h) => ({
x: 1 - (y + h - layerY) / parentHeight,
y: (x - layerX) / parentWidth,
width: h / parentHeight,
height: w / parentWidth
});
break;
default:
rotator = (x, y, w, h) => ({
x: (x - layerX) / parentWidth,
y: (y - layerY) / parentHeight,
width: w / parentWidth,
height: h / parentHeight
});
break;
}
const boxes = [];
for (let i = 0, ii = selection.rangeCount; i < ii; i++) {
const range = selection.getRangeAt(i);
if (range.collapsed) {
continue;
}
for (const {
x,
y,
width,
height
} of range.getClientRects()) {
if (width === 0 || height === 0) {
continue;
}
boxes.push(rotator(x, y, width, height));
}
}
return boxes.length === 0 ? null : boxes;
}
addChangedExistingAnnotation({
annotationElementId,
id
}) {
(__privateGet(this, _changedExistingAnnotations) || __privateSet(this, _changedExistingAnnotations, /* @__PURE__ */ new Map())).set(annotationElementId, id);
}
removeChangedExistingAnnotation({
annotationElementId
}) {
var _a2;
(_a2 = __privateGet(this, _changedExistingAnnotations)) == null ? void 0 : _a2.delete(annotationElementId);
}
renderAnnotationElement(annotation) {
var _a2;
const editorId = (_a2 = __privateGet(this, _changedExistingAnnotations)) == null ? void 0 : _a2.get(annotation.data.id);
if (!editorId) {
return;
}
const editor = __privateGet(this, _annotationStorage).getRawValue(editorId);
if (!editor) {
return;
}
if (__privateGet(this, _mode) === AnnotationEditorType.NONE && !editor.hasBeenModified) {
return;
}
editor.renderAnnotationElement(annotation);
}
};
var AnnotationEditorUIManager = _AnnotationEditorUIManager;
_abortController = new WeakMap();
_activeEditor = new WeakMap();
_allEditors = new WeakMap();
_allLayers = new WeakMap();
_altTextManager = new WeakMap();
_annotationStorage = new WeakMap();
_changedExistingAnnotations = new WeakMap();
_commandManager = new WeakMap();
_copyPasteAC = new WeakMap();
_currentPageIndex = new WeakMap();
_deletedAnnotationsElementIds = new WeakMap();
_draggingEditors = new WeakMap();
_editorTypes = new WeakMap();
_editorsToRescale = new WeakMap();
_enableHighlightFloatingButton = new WeakMap();
_enableUpdatedAddImage = new WeakMap();
_enableNewAltTextWhenAddingImage = new WeakMap();
_filterFactory = new WeakMap();
_focusMainContainerTimeoutId = new WeakMap();
_focusManagerAC = new WeakMap();
_highlightColors = new WeakMap();
_highlightWhenShiftUp = new WeakMap();
_highlightToolbar = new WeakMap();
_idManager = new WeakMap();
_isEnabled = new WeakMap();
_isWaiting = new WeakMap();
_keyboardManagerAC = new WeakMap();
_lastActiveElement = new WeakMap();
_mainHighlightColorPicker = new WeakMap();
_mlManager = new WeakMap();
_mode = new WeakMap();
_selectedEditors = new WeakMap();
_selectedTextNode = new WeakMap();
_pageColors = new WeakMap();
_showAllStates = new WeakMap();
_previousStates = new WeakMap();
_translation = new WeakMap();
_translationTimeoutId = new WeakMap();
_container = new WeakMap();
_viewer = new WeakMap();
_getAnchorElementForSelection = new WeakSet();
getAnchorElementForSelection_fn = function({
anchorNode
}) {
return anchorNode.nodeType === Node.TEXT_NODE ? anchorNode.parentElement : anchorNode;
};
_getLayerForTextLayer = new WeakSet();
getLayerForTextLayer_fn = function(textLayer) {
const {
currentLayer
} = this;
if (currentLayer.hasTextLayer(textLayer)) {
return currentLayer;
}
for (const layer of __privateGet(this, _allLayers).values()) {
if (layer.hasTextLayer(textLayer)) {
return layer;
}
}
return null;
};
_displayHighlightToolbar = new WeakSet();
displayHighlightToolbar_fn = function() {
const selection = document.getSelection();
if (!selection || selection.isCollapsed) {
return;
}
const anchorElement = __privateMethod(this, _getAnchorElementForSelection, getAnchorElementForSelection_fn).call(this, selection);
const textLayer = anchorElement.closest(".textLayer");
const boxes = this.getSelectionBoxes(textLayer);
if (!boxes) {
return;
}
__privateGet(this, _highlightToolbar) || __privateSet(this, _highlightToolbar, new HighlightToolbar(this));
__privateGet(this, _highlightToolbar).show(textLayer, boxes, this.direction === "ltr");
};
_selectionChange = new WeakSet();
selectionChange_fn = function() {
var _a2, _b, _c;
const selection = document.getSelection();
if (!selection || selection.isCollapsed) {
if (__privateGet(this, _selectedTextNode)) {
(_a2 = __privateGet(this, _highlightToolbar)) == null ? void 0 : _a2.hide();
__privateSet(this, _selectedTextNode, null);
__privateMethod(this, _dispatchUpdateStates, dispatchUpdateStates_fn).call(this, {
hasSelectedText: false
});
}
return;
}
const {
anchorNode
} = selection;
if (anchorNode === __privateGet(this, _selectedTextNode)) {
return;
}
const anchorElement = __privateMethod(this, _getAnchorElementForSelection, getAnchorElementForSelection_fn).call(this, selection);
const textLayer = anchorElement.closest(".textLayer");
if (!textLayer) {
if (__privateGet(this, _selectedTextNode)) {
(_b = __privateGet(this, _highlightToolbar)) == null ? void 0 : _b.hide();
__privateSet(this, _selectedTextNode, null);
__privateMethod(this, _dispatchUpdateStates, dispatchUpdateStates_fn).call(this, {
hasSelectedText: false
});
}
return;
}
(_c = __privateGet(this, _highlightToolbar)) == null ? void 0 : _c.hide();
__privateSet(this, _selectedTextNode, anchorNode);
__privateMethod(this, _dispatchUpdateStates, dispatchUpdateStates_fn).call(this, {
hasSelectedText: true
});
if (__privateGet(this, _mode) !== AnnotationEditorType.HIGHLIGHT && __privateGet(this, _mode) !== AnnotationEditorType.NONE) {
return;
}
if (__privateGet(this, _mode) === AnnotationEditorType.HIGHLIGHT) {
this.showAllEditors("highlight", true, true);
}
__privateSet(this, _highlightWhenShiftUp, this.isShiftKeyDown);
if (!this.isShiftKeyDown) {
const activeLayer = __privateGet(this, _mode) === AnnotationEditorType.HIGHLIGHT ? __privateMethod(this, _getLayerForTextLayer, getLayerForTextLayer_fn).call(this, textLayer) : null;
activeLayer == null ? void 0 : activeLayer.toggleDrawing();
const ac = new AbortController();
const signal = this.combinedSignal(ac);
const pointerup = (e) => {
if (e.type === "pointerup" && e.button !== 0) {
return;
}
ac.abort();
activeLayer == null ? void 0 : activeLayer.toggleDrawing(true);
if (e.type === "pointerup") {
__privateMethod(this, _onSelectEnd, onSelectEnd_fn).call(this, "main_toolbar");
}
};
window.addEventListener("pointerup", pointerup, {
signal
});
window.addEventListener("blur", pointerup, {
signal
});
}
};
_onSelectEnd = new WeakSet();
onSelectEnd_fn = function(methodOfCreation = "") {
if (__privateGet(this, _mode) === AnnotationEditorType.HIGHLIGHT) {
this.highlightSelection(methodOfCreation);
} else if (__privateGet(this, _enableHighlightFloatingButton)) {
__privateMethod(this, _displayHighlightToolbar, displayHighlightToolbar_fn).call(this);
}
};
_addSelectionListener = new WeakSet();
addSelectionListener_fn = function() {
document.addEventListener("selectionchange", __privateMethod(this, _selectionChange, selectionChange_fn).bind(this), {
signal: this._signal
});
};
_addFocusManager = new WeakSet();
addFocusManager_fn = function() {
if (__privateGet(this, _focusManagerAC)) {
return;
}
__privateSet(this, _focusManagerAC, new AbortController());
const signal = this.combinedSignal(__privateGet(this, _focusManagerAC));
window.addEventListener("focus", this.focus.bind(this), {
signal
});
window.addEventListener("blur", this.blur.bind(this), {
signal
});
};
_removeFocusManager = new WeakSet();
removeFocusManager_fn = function() {
var _a2;
(_a2 = __privateGet(this, _focusManagerAC)) == null ? void 0 : _a2.abort();
__privateSet(this, _focusManagerAC, null);
};
_addKeyboardManager = new WeakSet();
addKeyboardManager_fn = function() {
if (__privateGet(this, _keyboardManagerAC)) {
return;
}
__privateSet(this, _keyboardManagerAC, new AbortController());
const signal = this.combinedSignal(__privateGet(this, _keyboardManagerAC));
window.addEventListener("keydown", this.keydown.bind(this), {
signal
});
window.addEventListener("keyup", this.keyup.bind(this), {
signal
});
};
_removeKeyboardManager = new WeakSet();
removeKeyboardManager_fn = function() {
var _a2;
(_a2 = __privateGet(this, _keyboardManagerAC)) == null ? void 0 : _a2.abort();
__privateSet(this, _keyboardManagerAC, null);
};
_addCopyPasteListeners = new WeakSet();
addCopyPasteListeners_fn = function() {
if (__privateGet(this, _copyPasteAC)) {
return;
}
__privateSet(this, _copyPasteAC, new AbortController());
const signal = this.combinedSignal(__privateGet(this, _copyPasteAC));
document.addEventListener("copy", this.copy.bind(this), {
signal
});
document.addEventListener("cut", this.cut.bind(this), {
signal
});
document.addEventListener("paste", this.paste.bind(this), {
signal
});
};
_removeCopyPasteListeners = new WeakSet();
removeCopyPasteListeners_fn = function() {
var _a2;
(_a2 = __privateGet(this, _copyPasteAC)) == null ? void 0 : _a2.abort();
__privateSet(this, _copyPasteAC, null);
};
_addDragAndDropListeners = new WeakSet();
addDragAndDropListeners_fn = function() {
const signal = this._signal;
document.addEventListener("dragover", this.dragOver.bind(this), {
signal
});
document.addEventListener("drop", this.drop.bind(this), {
signal
});
};
_dispatchUpdateStates = new WeakSet();
dispatchUpdateStates_fn = function(details) {
const hasChanged = Object.entries(details).some(([key, value]) => __privateGet(this, _previousStates)[key] !== value);
if (hasChanged) {
this._eventBus.dispatch("annotationeditorstateschanged", {
source: this,
details: Object.assign(__privateGet(this, _previousStates), details)
});
if (__privateGet(this, _mode) === AnnotationEditorType.HIGHLIGHT && details.hasSelectedEditor === false) {
__privateMethod(this, _dispatchUpdateUI, dispatchUpdateUI_fn).call(this, [[AnnotationEditorParamsType.HIGHLIGHT_FREE, true]]);
}
}
};
_dispatchUpdateUI = new WeakSet();
dispatchUpdateUI_fn = function(details) {
this._eventBus.dispatch("annotationeditorparamschanged", {
source: this,
details
});
};
_enableAll = new WeakSet();
enableAll_fn = function() {
if (!__privateGet(this, _isEnabled)) {
__privateSet(this, _isEnabled, true);
for (const layer of __privateGet(this, _allLayers).values()) {
layer.enable();
}
for (const editor of __privateGet(this, _allEditors).values()) {
editor.enable();
}
}
};
_disableAll = new WeakSet();
disableAll_fn = function() {
this.unselectAll();
if (__privateGet(this, _isEnabled)) {
__privateSet(this, _isEnabled, false);
for (const layer of __privateGet(this, _allLayers).values()) {
layer.disable();
}
for (const editor of __privateGet(this, _allEditors).values()) {
editor.disable();
}
}
};
_addEditorToLayer = new WeakSet();
addEditorToLayer_fn = function(editor) {
const layer = __privateGet(this, _allLayers).get(editor.pageIndex);
if (layer) {
layer.addOrRebuild(editor);
} else {
this.addEditor(editor);
this.addToAnnotationStorage(editor);
}
};
_lastSelectedEditor = new WeakSet();
lastSelectedEditor_get = function() {
let ed = null;
for (ed of __privateGet(this, _selectedEditors)) {
}
return ed;
};
_isEmpty = new WeakSet();
isEmpty_fn = function() {
if (__privateGet(this, _allEditors).size === 0) {
return true;
}
if (__privateGet(this, _allEditors).size === 1) {
for (const editor of __privateGet(this, _allEditors).values()) {
return editor.isEmpty();
}
}
return false;
};
_selectEditors = new WeakSet();
selectEditors_fn = function(editors) {
for (const editor of __privateGet(this, _selectedEditors)) {
editor.unselect();
}
__privateGet(this, _selectedEditors).clear();
for (const editor of editors) {
if (editor.isEmpty()) {
continue;
}
__privateGet(this, _selectedEditors).add(editor);
editor.select();
}
__privateMethod(this, _dispatchUpdateStates, dispatchUpdateStates_fn).call(this, {
hasSelectedEditor: this.hasSelection
});
};
__publicField(AnnotationEditorUIManager, "TRANSLATE_SMALL", 1);
__publicField(AnnotationEditorUIManager, "TRANSLATE_BIG", 10);
var _altText2, _altTextDecorative, _altTextButton, _altTextTooltip, _altTextTooltipTimeout, _altTextWasFromKeyBoard, _badge, _editor2, _guessedText, _textWithDisclaimer, _useNewAltTextFlow, _label, label_get, _setState, setState_fn;
var _AltText = class {
constructor(editor) {
__privateAdd(this, _label);
__privateAdd(this, _setState);
__privateAdd(this, _altText2, null);
__privateAdd(this, _altTextDecorative, false);
__privateAdd(this, _altTextButton, null);
__privateAdd(this, _altTextTooltip, null);
__privateAdd(this, _altTextTooltipTimeout, null);
__privateAdd(this, _altTextWasFromKeyBoard, false);
__privateAdd(this, _badge, null);
__privateAdd(this, _editor2, null);
__privateAdd(this, _guessedText, null);
__privateAdd(this, _textWithDisclaimer, null);
__privateAdd(this, _useNewAltTextFlow, false);
__privateSet(this, _editor2, editor);
__privateSet(this, _useNewAltTextFlow, editor._uiManager.useNewAltTextFlow);
}
static initialize(l10nPromise) {
_AltText._l10nPromise || (_AltText._l10nPromise = l10nPromise);
}
async render() {
const altText = __privateSet(this, _altTextButton, document.createElement("button"));
altText.className = "altText";
let msg;
if (__privateGet(this, _useNewAltTextFlow)) {
altText.classList.add("new");
msg = await _AltText._l10nPromise.get("pdfjs-editor-new-alt-text-missing-button-label");
} else {
msg = await _AltText._l10nPromise.get("pdfjs-editor-alt-text-button-label");
}
altText.textContent = msg;
altText.setAttribute("aria-label", msg);
altText.tabIndex = "0";
const signal = __privateGet(this, _editor2)._uiManager._signal;
altText.addEventListener("contextmenu", noContextMenu, {
signal
});
altText.addEventListener("pointerdown", (event) => event.stopPropagation(), {
signal
});
const onClick = (event) => {
event.preventDefault();
__privateGet(this, _editor2)._uiManager.editAltText(__privateGet(this, _editor2));
if (__privateGet(this, _useNewAltTextFlow)) {
__privateGet(this, _editor2)._reportTelemetry({
action: "pdfjs.image.alt_text.image_status_label_clicked",
data: {
label: __privateGet(this, _label, label_get)
}
});
}
};
altText.addEventListener("click", onClick, {
capture: true,
signal
});
altText.addEventListener("keydown", (event) => {
if (event.target === altText && event.key === "Enter") {
__privateSet(this, _altTextWasFromKeyBoard, true);
onClick(event);
}
}, {
signal
});
await __privateMethod(this, _setState, setState_fn).call(this);
return altText;
}
finish() {
if (!__privateGet(this, _altTextButton)) {
return;
}
__privateGet(this, _altTextButton).focus({
focusVisible: __privateGet(this, _altTextWasFromKeyBoard)
});
__privateSet(this, _altTextWasFromKeyBoard, false);
}
isEmpty() {
if (__privateGet(this, _useNewAltTextFlow)) {
return __privateGet(this, _altText2) === null;
}
return !__privateGet(this, _altText2) && !__privateGet(this, _altTextDecorative);
}
hasData() {
if (__privateGet(this, _useNewAltTextFlow)) {
return __privateGet(this, _altText2) !== null || !!__privateGet(this, _guessedText);
}
return this.isEmpty();
}
get guessedText() {
return __privateGet(this, _guessedText);
}
async setGuessedText(guessedText) {
if (__privateGet(this, _altText2) !== null) {
return;
}
__privateSet(this, _guessedText, guessedText);
__privateSet(this, _textWithDisclaimer, await _AltText._l10nPromise.get("pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer")({
generatedAltText: guessedText
}));
__privateMethod(this, _setState, setState_fn).call(this);
}
toggleAltTextBadge(visibility = false) {
var _a2;
if (!__privateGet(this, _useNewAltTextFlow) || __privateGet(this, _altText2)) {
(_a2 = __privateGet(this, _badge)) == null ? void 0 : _a2.remove();
__privateSet(this, _badge, null);
return;
}
if (!__privateGet(this, _badge)) {
const badge = __privateSet(this, _badge, document.createElement("div"));
badge.className = "noAltTextBadge";
__privateGet(this, _editor2).div.append(badge);
}
__privateGet(this, _badge).classList.toggle("hidden", !visibility);
}
serialize(isForCopying) {
let altText = __privateGet(this, _altText2);
if (!isForCopying && __privateGet(this, _guessedText) === altText) {
altText = __privateGet(this, _textWithDisclaimer);
}
return {
altText,
decorative: __privateGet(this, _altTextDecorative),
guessedText: __privateGet(this, _guessedText),
textWithDisclaimer: __privateGet(this, _textWithDisclaimer)
};
}
get data() {
return {
altText: __privateGet(this, _altText2),
decorative: __privateGet(this, _altTextDecorative)
};
}
set data({
altText,
decorative,
guessedText,
textWithDisclaimer,
cancel = false
}) {
if (guessedText) {
__privateSet(this, _guessedText, guessedText);
__privateSet(this, _textWithDisclaimer, textWithDisclaimer);
}
if (__privateGet(this, _altText2) === altText && __privateGet(this, _altTextDecorative) === decorative) {
return;
}
if (!cancel) {
__privateSet(this, _altText2, altText);
__privateSet(this, _altTextDecorative, decorative);
}
__privateMethod(this, _setState, setState_fn).call(this);
}
toggle(enabled = false) {
if (!__privateGet(this, _altTextButton)) {
return;
}
if (!enabled && __privateGet(this, _altTextTooltipTimeout)) {
clearTimeout(__privateGet(this, _altTextTooltipTimeout));
__privateSet(this, _altTextTooltipTimeout, null);
}
__privateGet(this, _altTextButton).disabled = !enabled;
}
shown() {
__privateGet(this, _editor2)._reportTelemetry({
action: "pdfjs.image.alt_text.image_status_label_displayed",
data: {
label: __privateGet(this, _label, label_get)
}
});
}
destroy() {
var _a2, _b;
(_a2 = __privateGet(this, _altTextButton)) == null ? void 0 : _a2.remove();
__privateSet(this, _altTextButton, null);
__privateSet(this, _altTextTooltip, null);
(_b = __privateGet(this, _badge)) == null ? void 0 : _b.remove();
__privateSet(this, _badge, null);
}
};
var AltText = _AltText;
_altText2 = new WeakMap();
_altTextDecorative = new WeakMap();
_altTextButton = new WeakMap();
_altTextTooltip = new WeakMap();
_altTextTooltipTimeout = new WeakMap();
_altTextWasFromKeyBoard = new WeakMap();
_badge = new WeakMap();
_editor2 = new WeakMap();
_guessedText = new WeakMap();
_textWithDisclaimer = new WeakMap();
_useNewAltTextFlow = new WeakMap();
_label = new WeakSet();
label_get = function() {
return __privateGet(this, _altText2) && "added" || __privateGet(this, _altText2) === null && this.guessedText && "review" || "missing";
};
_setState = new WeakSet();
setState_fn = async function() {
var _a2, _b;
const button = __privateGet(this, _altTextButton);
if (!button) {
return;
}
if (__privateGet(this, _useNewAltTextFlow)) {
const label = __privateGet(this, _label, label_get);
const type = label === "review" ? "to-review" : label;
button.classList.toggle("done", !!__privateGet(this, _altText2));
_AltText._l10nPromise.get(`pdfjs-editor-new-alt-text-${type}-button-label`).then((msg) => {
button.setAttribute("aria-label", msg);
for (const child of button.childNodes) {
if (child.nodeType === Node.TEXT_NODE) {
child.textContent = msg;
break;
}
}
});
if (!__privateGet(this, _altText2)) {
(_a2 = __privateGet(this, _altTextTooltip)) == null ? void 0 : _a2.remove();
return;
}
} else {
if (!__privateGet(this, _altText2) && !__privateGet(this, _altTextDecorative)) {
button.classList.remove("done");
(_b = __privateGet(this, _altTextTooltip)) == null ? void 0 : _b.remove();
return;
}
button.classList.add("done");
_AltText._l10nPromise.get("pdfjs-editor-alt-text-edit-button-label").then((msg) => {
button.setAttribute("aria-label", msg);
});
}
let tooltip = __privateGet(this, _altTextTooltip);
if (!tooltip) {
__privateSet(this, _altTextTooltip, tooltip = document.createElement("span"));
tooltip.className = "tooltip";
tooltip.setAttribute("role", "tooltip");
const id = tooltip.id = `alt-text-tooltip-${__privateGet(this, _editor2).id}`;
button.setAttribute("aria-describedby", id);
const DELAY_TO_SHOW_TOOLTIP = 100;
const signal = __privateGet(this, _editor2)._uiManager._signal;
signal.addEventListener("abort", () => {
clearTimeout(__privateGet(this, _altTextTooltipTimeout));
__privateSet(this, _altTextTooltipTimeout, null);
}, {
once: true
});
button.addEventListener("mouseenter", () => {
__privateSet(this, _altTextTooltipTimeout, setTimeout(() => {
__privateSet(this, _altTextTooltipTimeout, null);
__privateGet(this, _altTextTooltip).classList.add("show");
__privateGet(this, _editor2)._reportTelemetry({
action: "alt_text_tooltip"
});
}, DELAY_TO_SHOW_TOOLTIP));
}, {
signal
});
button.addEventListener("mouseleave", () => {
var _a3;
if (__privateGet(this, _altTextTooltipTimeout)) {
clearTimeout(__privateGet(this, _altTextTooltipTimeout));
__privateSet(this, _altTextTooltipTimeout, null);
}
(_a3 = __privateGet(this, _altTextTooltip)) == null ? void 0 : _a3.classList.remove("show");
}, {
signal
});
}
tooltip.innerText = __privateGet(this, _altTextDecorative) ? await _AltText._l10nPromise.get("pdfjs-editor-alt-text-decorative-tooltip") : __privateGet(this, _altText2);
if (!tooltip.parentNode) {
button.append(tooltip);
}
const element = __privateGet(this, _editor2).getImageForAltText();
element == null ? void 0 : element.setAttribute("aria-describedby", tooltip.id);
};
__publicField(AltText, "_l10nPromise", null);
var _accessibilityData, _allResizerDivs, _altText3, _disabled, _keepAspectRatio, _resizersDiv, _savedDimensions, _focusAC, _focusedResizerName, _hasBeenClicked, _initialPosition, _isEditing, _isInEditMode, _isResizerEnabledForKeyboard, _moveInDOMTimeout, _prevDragX, _prevDragY, _telemetryTimeouts, _isDraggable, _zIndex, _translate, translate_fn, _rotatePoint, rotatePoint_fn, _getRotationMatrix, getRotationMatrix_fn, _createResizers, createResizers_fn, _resizerPointerdown, resizerPointerdown_fn, _addResizeToUndoStack, addResizeToUndoStack_fn, _resizerPointermove, resizerPointermove_fn, _selectOnPointerEvent, selectOnPointerEvent_fn, _setUpDragSession, setUpDragSession_fn, _addFocusListeners, addFocusListeners_fn, _resizerKeydown, resizerKeydown_fn, _resizerBlur, resizerBlur_fn, _resizerFocus, resizerFocus_fn, _setResizerTabIndex, setResizerTabIndex_fn, _stopResizing, stopResizing_fn;
var _AnnotationEditor = class {
constructor(parameters) {
__privateAdd(this, _translate);
__privateAdd(this, _getRotationMatrix);
__privateAdd(this, _createResizers);
__privateAdd(this, _resizerPointerdown);
__privateAdd(this, _addResizeToUndoStack);
__privateAdd(this, _resizerPointermove);
__privateAdd(this, _selectOnPointerEvent);
__privateAdd(this, _setUpDragSession);
__privateAdd(this, _addFocusListeners);
__privateAdd(this, _resizerKeydown);
__privateAdd(this, _resizerBlur);
__privateAdd(this, _resizerFocus);
__privateAdd(this, _setResizerTabIndex);
__privateAdd(this, _stopResizing);
__privateAdd(this, _accessibilityData, null);
__privateAdd(this, _allResizerDivs, null);
__privateAdd(this, _altText3, null);
__privateAdd(this, _disabled, false);
__privateAdd(this, _keepAspectRatio, false);
__privateAdd(this, _resizersDiv, null);
__privateAdd(this, _savedDimensions, null);
__privateAdd(this, _focusAC, null);
__privateAdd(this, _focusedResizerName, "");
__privateAdd(this, _hasBeenClicked, false);
__privateAdd(this, _initialPosition, null);
__privateAdd(this, _isEditing, false);
__privateAdd(this, _isInEditMode, false);
__privateAdd(this, _isResizerEnabledForKeyboard, false);
__privateAdd(this, _moveInDOMTimeout, null);
__privateAdd(this, _prevDragX, 0);
__privateAdd(this, _prevDragY, 0);
__privateAdd(this, _telemetryTimeouts, null);
__publicField(this, "_editToolbar", null);
__publicField(this, "_initialOptions", /* @__PURE__ */ Object.create(null));
__publicField(this, "_isVisible", true);
__publicField(this, "_uiManager", null);
__publicField(this, "_focusEventsAllowed", true);
__privateAdd(this, _isDraggable, false);
__privateAdd(this, _zIndex, _AnnotationEditor._zIndex++);
this.parent = parameters.parent;
this.id = parameters.id;
this.width = this.height = null;
this.pageIndex = parameters.parent.pageIndex;
this.name = parameters.name;
this.div = null;
this._uiManager = parameters.uiManager;
this.annotationElementId = null;
this._willKeepAspectRatio = false;
this._initialOptions.isCentered = parameters.isCentered;
this._structTreeParentId = null;
const {
rotation,
rawDims: {
pageWidth,
pageHeight,
pageX,
pageY
}
} = this.parent.viewport;
this.rotation = rotation;
this.pageRotation = (360 + rotation - this._uiManager.viewParameters.rotation) % 360;
this.pageDimensions = [pageWidth, pageHeight];
this.pageTranslation = [pageX, pageY];
const [width, height] = this.parentDimensions;
this.x = parameters.x / width;
this.y = parameters.y / height;
this.isAttachedToDOM = false;
this.deleted = false;
}
static get _resizerKeyboardManager() {
const resize = _AnnotationEditor.prototype._resizeWithKeyboard;
const small = AnnotationEditorUIManager.TRANSLATE_SMALL;
const big = AnnotationEditorUIManager.TRANSLATE_BIG;
return shadow(this, "_resizerKeyboardManager", new KeyboardManager([[["ArrowLeft", "mac+ArrowLeft"], resize, {
args: [-small, 0]
}], [["ctrl+ArrowLeft", "mac+shift+ArrowLeft"], resize, {
args: [-big, 0]
}], [["ArrowRight", "mac+ArrowRight"], resize, {
args: [small, 0]
}], [["ctrl+ArrowRight", "mac+shift+ArrowRight"], resize, {
args: [big, 0]
}], [["ArrowUp", "mac+ArrowUp"], resize, {
args: [0, -small]
}], [["ctrl+ArrowUp", "mac+shift+ArrowUp"], resize, {
args: [0, -big]
}], [["ArrowDown", "mac+ArrowDown"], resize, {
args: [0, small]
}], [["ctrl+ArrowDown", "mac+shift+ArrowDown"], resize, {
args: [0, big]
}], [["Escape", "mac+Escape"], _AnnotationEditor.prototype._stopResizingWithKeyboard]]));
}
get editorType() {
return Object.getPrototypeOf(this).constructor._type;
}
static get _defaultLineColor() {
return shadow(this, "_defaultLineColor", this._colorManager.getHexCode("CanvasText"));
}
static deleteAnnotationElement(editor) {
const fakeEditor = new FakeEditor({
id: editor.parent.getNextId(),
parent: editor.parent,
uiManager: editor._uiManager
});
fakeEditor.annotationElementId = editor.annotationElementId;
fakeEditor.deleted = true;
fakeEditor._uiManager.addToAnnotationStorage(fakeEditor);
}
static initialize(l10n, _uiManager4, options) {
_AnnotationEditor._l10nResizer || (_AnnotationEditor._l10nResizer = Object.freeze({
topLeft: "pdfjs-editor-resizer-top-left",
topMiddle: "pdfjs-editor-resizer-top-middle",
topRight: "pdfjs-editor-resizer-top-right",
middleRight: "pdfjs-editor-resizer-middle-right",
bottomRight: "pdfjs-editor-resizer-bottom-right",
bottomMiddle: "pdfjs-editor-resizer-bottom-middle",
bottomLeft: "pdfjs-editor-resizer-bottom-left",
middleLeft: "pdfjs-editor-resizer-middle-left"
}));
_AnnotationEditor._l10nPromise || (_AnnotationEditor._l10nPromise = new Map([...["pdfjs-editor-alt-text-button-label", "pdfjs-editor-alt-text-edit-button-label", "pdfjs-editor-alt-text-decorative-tooltip", "pdfjs-editor-new-alt-text-added-button-label", "pdfjs-editor-new-alt-text-missing-button-label", "pdfjs-editor-new-alt-text-to-review-button-label"].map((str) => [str, l10n.get(str)]), ...["pdfjs-editor-new-alt-text-generated-alt-text-with-disclaimer"].map((str) => [str, l10n.get.bind(l10n, str)])]));
if (options == null ? void 0 : options.strings) {
for (const str of options.strings) {
_AnnotationEditor._l10nPromise.set(str, l10n.get(str));
}
}
if (_AnnotationEditor._borderLineWidth !== -1) {
return;
}
const style = getComputedStyle(document.documentElement);
_AnnotationEditor._borderLineWidth = parseFloat(style.getPropertyValue("--outline-width")) || 0;
}
static updateDefaultParams(_type2, _value) {
}
static get defaultPropertiesToUpdate() {
return [];
}
static isHandlingMimeForPasting(mime) {
return false;
}
static paste(item, parent) {
unreachable("Not implemented");
}
get propertiesToUpdate() {
return [];
}
get _isDraggable() {
return __privateGet(this, _isDraggable);
}
set _isDraggable(value) {
var _a2;
__privateSet(this, _isDraggable, value);
(_a2 = this.div) == null ? void 0 : _a2.classList.toggle("draggable", value);
}
get isEnterHandled() {
return true;
}
center() {
const [pageWidth, pageHeight] = this.pageDimensions;
switch (this.parentRotation) {
case 90:
this.x -= this.height * pageHeight / (pageWidth * 2);
this.y += this.width * pageWidth / (pageHeight * 2);
break;
case 180:
this.x += this.width / 2;
this.y += this.height / 2;
break;
case 270:
this.x += this.height * pageHeight / (pageWidth * 2);
this.y -= this.width * pageWidth / (pageHeight * 2);
break;
default:
this.x -= this.width / 2;
this.y -= this.height / 2;
break;
}
this.fixAndSetPosition();
}
addCommands(params) {
this._uiManager.addCommands(params);
}
get currentLayer() {
return this._uiManager.currentLayer;
}
setInBackground() {
this.div.style.zIndex = 0;
}
setInForeground() {
this.div.style.zIndex = __privateGet(this, _zIndex);
}
setParent(parent) {
if (parent !== null) {
this.pageIndex = parent.pageIndex;
this.pageDimensions = parent.pageDimensions;
} else {
__privateMethod(this, _stopResizing, stopResizing_fn).call(this);
}
this.parent = parent;
}
focusin(event) {
if (!this._focusEventsAllowed) {
return;
}
if (!__privateGet(this, _hasBeenClicked)) {
this.parent.setSelected(this);
} else {
__privateSet(this, _hasBeenClicked, false);
}
}
focusout(event) {
var _a2;
if (!this._focusEventsAllowed) {
return;
}
if (!this.isAttachedToDOM) {
return;
}
const target = event.relatedTarget;
if (target == null ? void 0 : target.closest(`#${this.id}`)) {
return;
}
event.preventDefault();
if (!((_a2 = this.parent) == null ? void 0 : _a2.isMultipleSelection)) {
this.commitOrRemove();
}
}
commitOrRemove() {
if (this.isEmpty()) {
this.remove();
} else {
this.commit();
}
}
commit() {
this.addToAnnotationStorage();
}
addToAnnotationStorage() {
this._uiManager.addToAnnotationStorage(this);
}
setAt(x, y, tx, ty) {
const [width, height] = this.parentDimensions;
[tx, ty] = this.screenToPageTranslation(tx, ty);
this.x = (x + tx) / width;
this.y = (y + ty) / height;
this.fixAndSetPosition();
}
translate(x, y) {
__privateMethod(this, _translate, translate_fn).call(this, this.parentDimensions, x, y);
}
translateInPage(x, y) {
__privateGet(this, _initialPosition) || __privateSet(this, _initialPosition, [this.x, this.y]);
__privateMethod(this, _translate, translate_fn).call(this, this.pageDimensions, x, y);
this.div.scrollIntoView({
block: "nearest"
});
}
drag(tx, ty) {
__privateGet(this, _initialPosition) || __privateSet(this, _initialPosition, [this.x, this.y]);
const [parentWidth, parentHeight] = this.parentDimensions;
this.x += tx / parentWidth;
this.y += ty / parentHeight;
if (this.parent && (this.x < 0 || this.x > 1 || this.y < 0 || this.y > 1)) {
const {
x: x2,
y: y2
} = this.div.getBoundingClientRect();
if (this.parent.findNewParent(this, x2, y2)) {
this.x -= Math.floor(this.x);
this.y -= Math.floor(this.y);
}
}
let {
x,
y
} = this;
const [bx, by] = this.getBaseTranslation();
x += bx;
y += by;
this.div.style.left = `${(100 * x).toFixed(2)}%`;
this.div.style.top = `${(100 * y).toFixed(2)}%`;
this.div.scrollIntoView({
block: "nearest"
});
}
get _hasBeenMoved() {
return !!__privateGet(this, _initialPosition) && (__privateGet(this, _initialPosition)[0] !== this.x || __privateGet(this, _initialPosition)[1] !== this.y);
}
getBaseTranslation() {
const [parentWidth, parentHeight] = this.parentDimensions;
const {
_borderLineWidth
} = _AnnotationEditor;
const x = _borderLineWidth / parentWidth;
const y = _borderLineWidth / parentHeight;
switch (this.rotation) {
case 90:
return [-x, y];
case 180:
return [x, y];
case 270:
return [x, -y];
default:
return [-x, -y];
}
}
get _mustFixPosition() {
return true;
}
fixAndSetPosition(rotation = this.rotation) {
const [pageWidth, pageHeight] = this.pageDimensions;
let {
x,
y,
width,
height
} = this;
width *= pageWidth;
height *= pageHeight;
x *= pageWidth;
y *= pageHeight;
if (this._mustFixPosition) {
switch (rotation) {
case 0:
x = Math.max(0, Math.min(pageWidth - width, x));
y = Math.max(0, Math.min(pageHeight - height, y));
break;
case 90:
x = Math.max(0, Math.min(pageWidth - height, x));
y = Math.min(pageHeight, Math.max(width, y));
break;
case 180:
x = Math.min(pageWidth, Math.max(width, x));
y = Math.min(pageHeight, Math.max(height, y));
break;
case 270:
x = Math.min(pageWidth, Math.max(height, x));
y = Math.max(0, Math.min(pageHeight - width, y));
break;
}
}
this.x = x /= pageWidth;
this.y = y /= pageHeight;
const [bx, by] = this.getBaseTranslation();
x += bx;
y += by;
const {
style
} = this.div;
style.left = `${(100 * x).toFixed(2)}%`;
style.top = `${(100 * y).toFixed(2)}%`;
this.moveInDOM();
}
screenToPageTranslation(x, y) {
var _a2;
return __privateMethod(_a2 = _AnnotationEditor, _rotatePoint, rotatePoint_fn).call(_a2, x, y, this.parentRotation);
}
pageTranslationToScreen(x, y) {
var _a2;
return __privateMethod(_a2 = _AnnotationEditor, _rotatePoint, rotatePoint_fn).call(_a2, x, y, 360 - this.parentRotation);
}
get parentScale() {
return this._uiManager.viewParameters.realScale;
}
get parentRotation() {
return (this._uiManager.viewParameters.rotation + this.pageRotation) % 360;
}
get parentDimensions() {
const {
parentScale,
pageDimensions: [pageWidth, pageHeight]
} = this;
const scaledWidth = pageWidth * parentScale;
const scaledHeight = pageHeight * parentScale;
return util_FeatureTest.isCSSRoundSupported ? [Math.round(scaledWidth), Math.round(scaledHeight)] : [scaledWidth, scaledHeight];
}
setDims(width, height) {
const [parentWidth, parentHeight] = this.parentDimensions;
this.div.style.width = `${(100 * width / parentWidth).toFixed(2)}%`;
if (!__privateGet(this, _keepAspectRatio)) {
this.div.style.height = `${(100 * height / parentHeight).toFixed(2)}%`;
}
}
fixDims() {
const {
style
} = this.div;
const {
height,
width
} = style;
const widthPercent = width.endsWith("%");
const heightPercent = !__privateGet(this, _keepAspectRatio) && height.endsWith("%");
if (widthPercent && heightPercent) {
return;
}
const [parentWidth, parentHeight] = this.parentDimensions;
if (!widthPercent) {
style.width = `${(100 * parseFloat(width) / parentWidth).toFixed(2)}%`;
}
if (!__privateGet(this, _keepAspectRatio) && !heightPercent) {
style.height = `${(100 * parseFloat(height) / parentHeight).toFixed(2)}%`;
}
}
getInitialTranslation() {
return [0, 0];
}
altTextFinish() {
var _a2;
(_a2 = __privateGet(this, _altText3)) == null ? void 0 : _a2.finish();
}
async addEditToolbar() {
if (this._editToolbar || __privateGet(this, _isInEditMode)) {
return this._editToolbar;
}
this._editToolbar = new EditorToolbar(this);
this.div.append(this._editToolbar.render());
if (__privateGet(this, _altText3)) {
await this._editToolbar.addAltText(__privateGet(this, _altText3));
}
return this._editToolbar;
}
removeEditToolbar() {
var _a2;
if (!this._editToolbar) {
return;
}
this._editToolbar.remove();
this._editToolbar = null;
(_a2 = __privateGet(this, _altText3)) == null ? void 0 : _a2.destroy();
}
getClientDimensions() {
return this.div.getBoundingClientRect();
}
async addAltTextButton() {
if (__privateGet(this, _altText3)) {
return;
}
AltText.initialize(_AnnotationEditor._l10nPromise);
__privateSet(this, _altText3, new AltText(this));
if (__privateGet(this, _accessibilityData)) {
__privateGet(this, _altText3).data = __privateGet(this, _accessibilityData);
__privateSet(this, _accessibilityData, null);
}
await this.addEditToolbar();
}
get altTextData() {
var _a2;
return (_a2 = __privateGet(this, _altText3)) == null ? void 0 : _a2.data;
}
set altTextData(data) {
if (!__privateGet(this, _altText3)) {
return;
}
__privateGet(this, _altText3).data = data;
}
get guessedAltText() {
var _a2;
return (_a2 = __privateGet(this, _altText3)) == null ? void 0 : _a2.guessedText;
}
async setGuessedAltText(text) {
var _a2;
await ((_a2 = __privateGet(this, _altText3)) == null ? void 0 : _a2.setGuessedText(text));
}
serializeAltText(isForCopying) {
var _a2;
return (_a2 = __privateGet(this, _altText3)) == null ? void 0 : _a2.serialize(isForCopying);
}
hasAltText() {
return !!__privateGet(this, _altText3) && !__privateGet(this, _altText3).isEmpty();
}
hasAltTextData() {
var _a2, _b;
return (_b = (_a2 = __privateGet(this, _altText3)) == null ? void 0 : _a2.hasData()) != null ? _b : false;
}
render() {
this.div = document.createElement("div");
this.div.setAttribute("data-editor-rotation", (360 - this.rotation) % 360);
this.div.className = this.name;
this.div.setAttribute("id", this.id);
this.div.tabIndex = __privateGet(this, _disabled) ? -1 : 0;
if (!this._isVisible) {
this.div.classList.add("hidden");
}
this.setInForeground();
__privateMethod(this, _addFocusListeners, addFocusListeners_fn).call(this);
const [parentWidth, parentHeight] = this.parentDimensions;
if (this.parentRotation % 180 !== 0) {
this.div.style.maxWidth = `${(100 * parentHeight / parentWidth).toFixed(2)}%`;
this.div.style.maxHeight = `${(100 * parentWidth / parentHeight).toFixed(2)}%`;
}
const [tx, ty] = this.getInitialTranslation();
this.translate(tx, ty);
bindEvents(this, this.div, ["pointerdown"]);
return this.div;
}
pointerdown(event) {
const {
isMac
} = util_FeatureTest.platform;
if (event.button !== 0 || event.ctrlKey && isMac) {
event.preventDefault();
return;
}
__privateSet(this, _hasBeenClicked, true);
if (this._isDraggable) {
__privateMethod(this, _setUpDragSession, setUpDragSession_fn).call(this, event);
return;
}
__privateMethod(this, _selectOnPointerEvent, selectOnPointerEvent_fn).call(this, event);
}
moveInDOM() {
if (__privateGet(this, _moveInDOMTimeout)) {
clearTimeout(__privateGet(this, _moveInDOMTimeout));
}
__privateSet(this, _moveInDOMTimeout, setTimeout(() => {
var _a2;
__privateSet(this, _moveInDOMTimeout, null);
(_a2 = this.parent) == null ? void 0 : _a2.moveEditorInDOM(this);
}, 0));
}
_setParentAndPosition(parent, x, y) {
parent.changeParent(this);
this.x = x;
this.y = y;
this.fixAndSetPosition();
}
getRect(tx, ty, rotation = this.rotation) {
const scale = this.parentScale;
const [pageWidth, pageHeight] = this.pageDimensions;
const [pageX, pageY] = this.pageTranslation;
const shiftX = tx / scale;
const shiftY = ty / scale;
const x = this.x * pageWidth;
const y = this.y * pageHeight;
const width = this.width * pageWidth;
const height = this.height * pageHeight;
switch (rotation) {
case 0:
return [x + shiftX + pageX, pageHeight - y - shiftY - height + pageY, x + shiftX + width + pageX, pageHeight - y - shiftY + pageY];
case 90:
return [x + shiftY + pageX, pageHeight - y + shiftX + pageY, x + shiftY + height + pageX, pageHeight - y + shiftX + width + pageY];
case 180:
return [x - shiftX - width + pageX, pageHeight - y + shiftY + pageY, x - shiftX + pageX, pageHeight - y + shiftY + height + pageY];
case 270:
return [x - shiftY - height + pageX, pageHeight - y - shiftX - width + pageY, x - shiftY + pageX, pageHeight - y - shiftX + pageY];
default:
throw new Error("Invalid rotation");
}
}
getRectInCurrentCoords(rect, pageHeight) {
const [x1, y1, x2, y2] = rect;
const width = x2 - x1;
const height = y2 - y1;
switch (this.rotation) {
case 0:
return [x1, pageHeight - y2, width, height];
case 90:
return [x1, pageHeight - y1, height, width];
case 180:
return [x2, pageHeight - y1, width, height];
case 270:
return [x2, pageHeight - y2, height, width];
default:
throw new Error("Invalid rotation");
}
}
onceAdded() {
}
isEmpty() {
return false;
}
enableEditMode() {
__privateSet(this, _isInEditMode, true);
}
disableEditMode() {
__privateSet(this, _isInEditMode, false);
}
isInEditMode() {
return __privateGet(this, _isInEditMode);
}
shouldGetKeyboardEvents() {
return __privateGet(this, _isResizerEnabledForKeyboard);
}
needsToBeRebuilt() {
return this.div && !this.isAttachedToDOM;
}
rebuild() {
__privateMethod(this, _addFocusListeners, addFocusListeners_fn).call(this);
}
rotate(_angle) {
}
serialize(isForCopying = false, context = null) {
unreachable("An editor must be serializable");
}
static deserialize(data, parent, uiManager) {
const editor = new this.prototype.constructor({
parent,
id: parent.getNextId(),
uiManager
});
editor.rotation = data.rotation;
__privateSet(editor, _accessibilityData, data.accessibilityData);
const [pageWidth, pageHeight] = editor.pageDimensions;
const [x, y, width, height] = editor.getRectInCurrentCoords(data.rect, pageHeight);
editor.x = x / pageWidth;
editor.y = y / pageHeight;
editor.width = width / pageWidth;
editor.height = height / pageHeight;
return editor;
}
get hasBeenModified() {
return !!this.annotationElementId && (this.deleted || this.serialize() !== null);
}
remove() {
var _a2;
(_a2 = __privateGet(this, _focusAC)) == null ? void 0 : _a2.abort();
__privateSet(this, _focusAC, null);
if (!this.isEmpty()) {
this.commit();
}
if (this.parent) {
this.parent.remove(this);
} else {
this._uiManager.removeEditor(this);
}
if (__privateGet(this, _moveInDOMTimeout)) {
clearTimeout(__privateGet(this, _moveInDOMTimeout));
__privateSet(this, _moveInDOMTimeout, null);
}
__privateMethod(this, _stopResizing, stopResizing_fn).call(this);
this.removeEditToolbar();
if (__privateGet(this, _telemetryTimeouts)) {
for (const timeout of __privateGet(this, _telemetryTimeouts).values()) {
clearTimeout(timeout);
}
__privateSet(this, _telemetryTimeouts, null);
}
this.parent = null;
}
get isResizable() {
return false;
}
makeResizable() {
if (this.isResizable) {
__privateMethod(this, _createResizers, createResizers_fn).call(this);
__privateGet(this, _resizersDiv).classList.remove("hidden");
bindEvents(this, this.div, ["keydown"]);
}
}
get toolbarPosition() {
return null;
}
keydown(event) {
if (!this.isResizable || event.target !== this.div || event.key !== "Enter") {
return;
}
this._uiManager.setSelected(this);
__privateSet(this, _savedDimensions, {
savedX: this.x,
savedY: this.y,
savedWidth: this.width,
savedHeight: this.height
});
const children = __privateGet(this, _resizersDiv).children;
if (!__privateGet(this, _allResizerDivs)) {
__privateSet(this, _allResizerDivs, Array.from(children));
const boundResizerKeydown = __privateMethod(this, _resizerKeydown, resizerKeydown_fn).bind(this);
const boundResizerBlur = __privateMethod(this, _resizerBlur, resizerBlur_fn).bind(this);
const signal = this._uiManager._signal;
for (const div of __privateGet(this, _allResizerDivs)) {
const name = div.getAttribute("data-resizer-name");
div.setAttribute("role", "spinbutton");
div.addEventListener("keydown", boundResizerKeydown, {
signal
});
div.addEventListener("blur", boundResizerBlur, {
signal
});
div.addEventListener("focus", __privateMethod(this, _resizerFocus, resizerFocus_fn).bind(this, name), {
signal
});
div.setAttribute("data-l10n-id", _AnnotationEditor._l10nResizer[name]);
}
}
const first = __privateGet(this, _allResizerDivs)[0];
let firstPosition = 0;
for (const div of children) {
if (div === first) {
break;
}
firstPosition++;
}
const nextFirstPosition = (360 - this.rotation + this.parentRotation) % 360 / 90 * (__privateGet(this, _allResizerDivs).length / 4);
if (nextFirstPosition !== firstPosition) {
if (nextFirstPosition < firstPosition) {
for (let i2 = 0; i2 < firstPosition - nextFirstPosition; i2++) {
__privateGet(this, _resizersDiv).append(__privateGet(this, _resizersDiv).firstChild);
}
} else if (nextFirstPosition > firstPosition) {
for (let i2 = 0; i2 < nextFirstPosition - firstPosition; i2++) {
__privateGet(this, _resizersDiv).firstChild.before(__privateGet(this, _resizersDiv).lastChild);
}
}
let i = 0;
for (const child of children) {
const div = __privateGet(this, _allResizerDivs)[i++];
const name = div.getAttribute("data-resizer-name");
child.setAttribute("data-l10n-id", _AnnotationEditor._l10nResizer[name]);
}
}
__privateMethod(this, _setResizerTabIndex, setResizerTabIndex_fn).call(this, 0);
__privateSet(this, _isResizerEnabledForKeyboard, true);
__privateGet(this, _resizersDiv).firstChild.focus({
focusVisible: true
});
event.preventDefault();
event.stopImmediatePropagation();
}
_resizeWithKeyboard(x, y) {
if (!__privateGet(this, _isResizerEnabledForKeyboard)) {
return;
}
__privateMethod(this, _resizerPointermove, resizerPointermove_fn).call(this, __privateGet(this, _focusedResizerName), {
movementX: x,
movementY: y
});
}
_stopResizingWithKeyboard() {
__privateMethod(this, _stopResizing, stopResizing_fn).call(this);
this.div.focus();
}
select() {
var _a2, _b, _c;
this.makeResizable();
(_a2 = this.div) == null ? void 0 : _a2.classList.add("selectedEditor");
if (!this._editToolbar) {
this.addEditToolbar().then(() => {
var _a3, _b2;
if ((_a3 = this.div) == null ? void 0 : _a3.classList.contains("selectedEditor")) {
(_b2 = this._editToolbar) == null ? void 0 : _b2.show();
}
});
return;
}
(_b = this._editToolbar) == null ? void 0 : _b.show();
(_c = __privateGet(this, _altText3)) == null ? void 0 : _c.toggleAltTextBadge(false);
}
unselect() {
var _a2, _b, _c, _d, _e;
(_a2 = __privateGet(this, _resizersDiv)) == null ? void 0 : _a2.classList.add("hidden");
(_b = this.div) == null ? void 0 : _b.classList.remove("selectedEditor");
if ((_c = this.div) == null ? void 0 : _c.contains(document.activeElement)) {
this._uiManager.currentLayer.div.focus({
preventScroll: true
});
}
(_d = this._editToolbar) == null ? void 0 : _d.hide();
(_e = __privateGet(this, _altText3)) == null ? void 0 : _e.toggleAltTextBadge(true);
}
updateParams(type, value) {
}
disableEditing() {
}
enableEditing() {
}
enterInEditMode() {
}
getImageForAltText() {
return null;
}
get contentDiv() {
return this.div;
}
get isEditing() {
return __privateGet(this, _isEditing);
}
set isEditing(value) {
__privateSet(this, _isEditing, value);
if (!this.parent) {
return;
}
if (value) {
this.parent.setSelected(this);
this.parent.setActiveEditor(this);
} else {
this.parent.setActiveEditor(null);
}
}
setAspectRatio(width, height) {
__privateSet(this, _keepAspectRatio, true);
const aspectRatio = width / height;
const {
style
} = this.div;
style.aspectRatio = aspectRatio;
style.height = "auto";
}
static get MIN_SIZE() {
return 16;
}
static canCreateNewEmptyEditor() {
return true;
}
get telemetryInitialData() {
return {
action: "added"
};
}
get telemetryFinalData() {
return null;
}
_reportTelemetry(data, mustWait = false) {
if (mustWait) {
__privateGet(this, _telemetryTimeouts) || __privateSet(this, _telemetryTimeouts, /* @__PURE__ */ new Map());
const {
action
} = data;
let timeout = __privateGet(this, _telemetryTimeouts).get(action);
if (timeout) {
clearTimeout(timeout);
}
timeout = setTimeout(() => {
this._reportTelemetry(data);
__privateGet(this, _telemetryTimeouts).delete(action);
if (__privateGet(this, _telemetryTimeouts).size === 0) {
__privateSet(this, _telemetryTimeouts, null);
}
}, _AnnotationEditor._telemetryTimeout);
__privateGet(this, _telemetryTimeouts).set(action, timeout);
return;
}
data.type || (data.type = this.editorType);
this._uiManager._eventBus.dispatch("reporttelemetry", {
source: this,
details: {
type: "editing",
data
}
});
}
show(visible = this._isVisible) {
this.div.classList.toggle("hidden", !visible);
this._isVisible = visible;
}
enable() {
if (this.div) {
this.div.tabIndex = 0;
}
__privateSet(this, _disabled, false);
}
disable() {
if (this.div) {
this.div.tabIndex = -1;
}
__privateSet(this, _disabled, true);
}
renderAnnotationElement(annotation) {
let content = annotation.container.querySelector(".annotationContent");
if (!content) {
content = document.createElement("div");
content.classList.add("annotationContent", this.editorType);
annotation.container.prepend(content);
} else if (content.nodeName === "CANVAS") {
const canvas = content;
content = document.createElement("div");
content.classList.add("annotationContent", this.editorType);
canvas.before(content);
}
return content;
}
resetAnnotationElement(annotation) {
const {
firstChild
} = annotation.container;
if (firstChild.nodeName === "DIV" && firstChild.classList.contains("annotationContent")) {
firstChild.remove();
}
}
};
var AnnotationEditor = _AnnotationEditor;
_accessibilityData = new WeakMap();
_allResizerDivs = new WeakMap();
_altText3 = new WeakMap();
_disabled = new WeakMap();
_keepAspectRatio = new WeakMap();
_resizersDiv = new WeakMap();
_savedDimensions = new WeakMap();
_focusAC = new WeakMap();
_focusedResizerName = new WeakMap();
_hasBeenClicked = new WeakMap();
_initialPosition = new WeakMap();
_isEditing = new WeakMap();
_isInEditMode = new WeakMap();
_isResizerEnabledForKeyboard = new WeakMap();
_moveInDOMTimeout = new WeakMap();
_prevDragX = new WeakMap();
_prevDragY = new WeakMap();
_telemetryTimeouts = new WeakMap();
_isDraggable = new WeakMap();
_zIndex = new WeakMap();
_translate = new WeakSet();
translate_fn = function([width, height], x, y) {
[x, y] = this.screenToPageTranslation(x, y);
this.x += x / width;
this.y += y / height;
this.fixAndSetPosition();
};
_rotatePoint = new WeakSet();
rotatePoint_fn = function(x, y, angle) {
switch (angle) {
case 90:
return [y, -x];
case 180:
return [-x, -y];
case 270:
return [-y, x];
default:
return [x, y];
}
};
_getRotationMatrix = new WeakSet();
getRotationMatrix_fn = function(rotation) {
switch (rotation) {
case 90: {
const [pageWidth, pageHeight] = this.pageDimensions;
return [0, -pageWidth / pageHeight, pageHeight / pageWidth, 0];
}
case 180:
return [-1, 0, 0, -1];
case 270: {
const [pageWidth, pageHeight] = this.pageDimensions;
return [0, pageWidth / pageHeight, -pageHeight / pageWidth, 0];
}
default:
return [1, 0, 0, 1];
}
};
_createResizers = new WeakSet();
createResizers_fn = function() {
if (__privateGet(this, _resizersDiv)) {
return;
}
__privateSet(this, _resizersDiv, document.createElement("div"));
__privateGet(this, _resizersDiv).classList.add("resizers");
const classes = this._willKeepAspectRatio ? ["topLeft", "topRight", "bottomRight", "bottomLeft"] : ["topLeft", "topMiddle", "topRight", "middleRight", "bottomRight", "bottomMiddle", "bottomLeft", "middleLeft"];
const signal = this._uiManager._signal;
for (const name of classes) {
const div = document.createElement("div");
__privateGet(this, _resizersDiv).append(div);
div.classList.add("resizer", name);
div.setAttribute("data-resizer-name", name);
div.addEventListener("pointerdown", __privateMethod(this, _resizerPointerdown, resizerPointerdown_fn).bind(this, name), {
signal
});
div.addEventListener("contextmenu", noContextMenu, {
signal
});
div.tabIndex = -1;
}
this.div.prepend(__privateGet(this, _resizersDiv));
};
_resizerPointerdown = new WeakSet();
resizerPointerdown_fn = function(name, event) {
var _a2;
event.preventDefault();
const {
isMac
} = util_FeatureTest.platform;
if (event.button !== 0 || event.ctrlKey && isMac) {
return;
}
(_a2 = __privateGet(this, _altText3)) == null ? void 0 : _a2.toggle(false);
const savedDraggable = this._isDraggable;
this._isDraggable = false;
const ac = new AbortController();
const signal = this._uiManager.combinedSignal(ac);
this.parent.togglePointerEvents(false);
window.addEventListener("pointermove", __privateMethod(this, _resizerPointermove, resizerPointermove_fn).bind(this, name), {
passive: true,
capture: true,
signal
});
window.addEventListener("contextmenu", noContextMenu, {
signal
});
const savedX = this.x;
const savedY = this.y;
const savedWidth = this.width;
const savedHeight = this.height;
const savedParentCursor = this.parent.div.style.cursor;
const savedCursor = this.div.style.cursor;
this.div.style.cursor = this.parent.div.style.cursor = window.getComputedStyle(event.target).cursor;
const pointerUpCallback = () => {
var _a3;
ac.abort();
this.parent.togglePointerEvents(true);
(_a3 = __privateGet(this, _altText3)) == null ? void 0 : _a3.toggle(true);
this._isDraggable = savedDraggable;
this.parent.div.style.cursor = savedParentCursor;
this.div.style.cursor = savedCursor;
__privateMethod(this, _addResizeToUndoStack, addResizeToUndoStack_fn).call(this, savedX, savedY, savedWidth, savedHeight);
};
window.addEventListener("pointerup", pointerUpCallback, {
signal
});
window.addEventListener("blur", pointerUpCallback, {
signal
});
};
_addResizeToUndoStack = new WeakSet();
addResizeToUndoStack_fn = function(savedX, savedY, savedWidth, savedHeight) {
const newX = this.x;
const newY = this.y;
const newWidth = this.width;
const newHeight = this.height;
if (newX === savedX && newY === savedY && newWidth === savedWidth && newHeight === savedHeight) {
return;
}
this.addCommands({
cmd: () => {
this.width = newWidth;
this.height = newHeight;
this.x = newX;
this.y = newY;
const [parentWidth, parentHeight] = this.parentDimensions;
this.setDims(parentWidth * newWidth, parentHeight * newHeight);
this.fixAndSetPosition();
},
undo: () => {
this.width = savedWidth;
this.height = savedHeight;
this.x = savedX;
this.y = savedY;
const [parentWidth, parentHeight] = this.parentDimensions;
this.setDims(parentWidth * savedWidth, parentHeight * savedHeight);
this.fixAndSetPosition();
},
mustExec: true
});
};
_resizerPointermove = new WeakSet();
resizerPointermove_fn = function(name, event) {
const [parentWidth, parentHeight] = this.parentDimensions;
const savedX = this.x;
const savedY = this.y;
const savedWidth = this.width;
const savedHeight = this.height;
const minWidth = _AnnotationEditor.MIN_SIZE / parentWidth;
const minHeight = _AnnotationEditor.MIN_SIZE / parentHeight;
const round = (x) => Math.round(x * 1e4) / 1e4;
const rotationMatrix = __privateMethod(this, _getRotationMatrix, getRotationMatrix_fn).call(this, this.rotation);
const transf = (x, y) => [rotationMatrix[0] * x + rotationMatrix[2] * y, rotationMatrix[1] * x + rotationMatrix[3] * y];
const invRotationMatrix = __privateMethod(this, _getRotationMatrix, getRotationMatrix_fn).call(this, 360 - this.rotation);
const invTransf = (x, y) => [invRotationMatrix[0] * x + invRotationMatrix[2] * y, invRotationMatrix[1] * x + invRotationMatrix[3] * y];
let getPoint;
let getOpposite;
let isDiagonal = false;
let isHorizontal = false;
switch (name) {
case "topLeft":
isDiagonal = true;
getPoint = (w, h) => [0, 0];
getOpposite = (w, h) => [w, h];
break;
case "topMiddle":
getPoint = (w, h) => [w / 2, 0];
getOpposite = (w, h) => [w / 2, h];
break;
case "topRight":
isDiagonal = true;
getPoint = (w, h) => [w, 0];
getOpposite = (w, h) => [0, h];
break;
case "middleRight":
isHorizontal = true;
getPoint = (w, h) => [w, h / 2];
getOpposite = (w, h) => [0, h / 2];
break;
case "bottomRight":
isDiagonal = true;
getPoint = (w, h) => [w, h];
getOpposite = (w, h) => [0, 0];
break;
case "bottomMiddle":
getPoint = (w, h) => [w / 2, h];
getOpposite = (w, h) => [w / 2, 0];
break;
case "bottomLeft":
isDiagonal = true;
getPoint = (w, h) => [0, h];
getOpposite = (w, h) => [w, 0];
break;
case "middleLeft":
isHorizontal = true;
getPoint = (w, h) => [0, h / 2];
getOpposite = (w, h) => [w, h / 2];
break;
}
const point = getPoint(savedWidth, savedHeight);
const oppositePoint = getOpposite(savedWidth, savedHeight);
let transfOppositePoint = transf(...oppositePoint);
const oppositeX = round(savedX + transfOppositePoint[0]);
const oppositeY = round(savedY + transfOppositePoint[1]);
let ratioX = 1;
let ratioY = 1;
let [deltaX, deltaY] = this.screenToPageTranslation(event.movementX, event.movementY);
[deltaX, deltaY] = invTransf(deltaX / parentWidth, deltaY / parentHeight);
if (isDiagonal) {
const oldDiag = Math.hypot(savedWidth, savedHeight);
ratioX = ratioY = Math.max(Math.min(Math.hypot(oppositePoint[0] - point[0] - deltaX, oppositePoint[1] - point[1] - deltaY) / oldDiag, 1 / savedWidth, 1 / savedHeight), minWidth / savedWidth, minHeight / savedHeight);
} else if (isHorizontal) {
ratioX = Math.max(minWidth, Math.min(1, Math.abs(oppositePoint[0] - point[0] - deltaX))) / savedWidth;
} else {
ratioY = Math.max(minHeight, Math.min(1, Math.abs(oppositePoint[1] - point[1] - deltaY))) / savedHeight;
}
const newWidth = round(savedWidth * ratioX);
const newHeight = round(savedHeight * ratioY);
transfOppositePoint = transf(...getOpposite(newWidth, newHeight));
const newX = oppositeX - transfOppositePoint[0];
const newY = oppositeY - transfOppositePoint[1];
this.width = newWidth;
this.height = newHeight;
this.x = newX;
this.y = newY;
this.setDims(parentWidth * newWidth, parentHeight * newHeight);
this.fixAndSetPosition();
};
_selectOnPointerEvent = new WeakSet();
selectOnPointerEvent_fn = function(event) {
const {
isMac
} = util_FeatureTest.platform;
if (event.ctrlKey && !isMac || event.shiftKey || event.metaKey && isMac) {
this.parent.toggleSelected(this);
} else {
this.parent.setSelected(this);
}
};
_setUpDragSession = new WeakSet();
setUpDragSession_fn = function(event) {
const isSelected = this._uiManager.isSelected(this);
this._uiManager.setUpDragSession();
const ac = new AbortController();
const signal = this._uiManager.combinedSignal(ac);
if (isSelected) {
this.div.classList.add("moving");
__privateSet(this, _prevDragX, event.clientX);
__privateSet(this, _prevDragY, event.clientY);
const pointerMoveCallback = (e) => {
const {
clientX: x,
clientY: y
} = e;
const [tx, ty] = this.screenToPageTranslation(x - __privateGet(this, _prevDragX), y - __privateGet(this, _prevDragY));
__privateSet(this, _prevDragX, x);
__privateSet(this, _prevDragY, y);
this._uiManager.dragSelectedEditors(tx, ty);
};
window.addEventListener("pointermove", pointerMoveCallback, {
passive: true,
capture: true,
signal
});
}
const pointerUpCallback = () => {
ac.abort();
if (isSelected) {
this.div.classList.remove("moving");
}
__privateSet(this, _hasBeenClicked, false);
if (!this._uiManager.endDragSession()) {
__privateMethod(this, _selectOnPointerEvent, selectOnPointerEvent_fn).call(this, event);
}
};
window.addEventListener("pointerup", pointerUpCallback, {
signal
});
window.addEventListener("blur", pointerUpCallback, {
signal
});
};
_addFocusListeners = new WeakSet();
addFocusListeners_fn = function() {
if (__privateGet(this, _focusAC) || !this.div) {
return;
}
__privateSet(this, _focusAC, new AbortController());
const signal = this._uiManager.combinedSignal(__privateGet(this, _focusAC));
this.div.addEventListener("focusin", this.focusin.bind(this), {
signal
});
this.div.addEventListener("focusout", this.focusout.bind(this), {
signal
});
};
_resizerKeydown = new WeakSet();
resizerKeydown_fn = function(event) {
_AnnotationEditor._resizerKeyboardManager.exec(this, event);
};
_resizerBlur = new WeakSet();
resizerBlur_fn = function(event) {
var _a2;
if (__privateGet(this, _isResizerEnabledForKeyboard) && ((_a2 = event.relatedTarget) == null ? void 0 : _a2.parentNode) !== __privateGet(this, _resizersDiv)) {
__privateMethod(this, _stopResizing, stopResizing_fn).call(this);
}
};
_resizerFocus = new WeakSet();
resizerFocus_fn = function(name) {
__privateSet(this, _focusedResizerName, __privateGet(this, _isResizerEnabledForKeyboard) ? name : "");
};
_setResizerTabIndex = new WeakSet();
setResizerTabIndex_fn = function(value) {
if (!__privateGet(this, _allResizerDivs)) {
return;
}
for (const div of __privateGet(this, _allResizerDivs)) {
div.tabIndex = value;
}
};
_stopResizing = new WeakSet();
stopResizing_fn = function() {
__privateSet(this, _isResizerEnabledForKeyboard, false);
__privateMethod(this, _setResizerTabIndex, setResizerTabIndex_fn).call(this, -1);
if (__privateGet(this, _savedDimensions)) {
const {
savedX,
savedY,
savedWidth,
savedHeight
} = __privateGet(this, _savedDimensions);
__privateMethod(this, _addResizeToUndoStack, addResizeToUndoStack_fn).call(this, savedX, savedY, savedWidth, savedHeight);
__privateSet(this, _savedDimensions, null);
}
};
__privateAdd(AnnotationEditor, _rotatePoint);
__publicField(AnnotationEditor, "_l10nPromise", null);
__publicField(AnnotationEditor, "_l10nResizer", null);
__publicField(AnnotationEditor, "_borderLineWidth", -1);
__publicField(AnnotationEditor, "_colorManager", new ColorManager());
__publicField(AnnotationEditor, "_zIndex", 1);
__publicField(AnnotationEditor, "_telemetryTimeout", 1e3);
var FakeEditor = class extends AnnotationEditor {
constructor(params) {
super(params);
this.annotationElementId = params.annotationElementId;
this.deleted = true;
}
serialize() {
return {
id: this.annotationElementId,
deleted: true,
pageIndex: this.pageIndex
};
}
};
var SEED = 3285377520;
var MASK_HIGH = 4294901760;
var MASK_LOW = 65535;
var MurmurHash3_64 = class {
constructor(seed) {
this.h1 = seed ? seed & 4294967295 : SEED;
this.h2 = seed ? seed & 4294967295 : SEED;
}
update(input) {
let data, length;
if (typeof input === "string") {
data = new Uint8Array(input.length * 2);
length = 0;
for (let i = 0, ii = input.length; i < ii; i++) {
const code = input.charCodeAt(i);
if (code <= 255) {
data[length++] = code;
} else {
data[length++] = code >>> 8;
data[length++] = code & 255;
}
}
} else if (ArrayBuffer.isView(input)) {
data = input.slice();
length = data.byteLength;
} else {
throw new Error("Invalid data format, must be a string or TypedArray.");
}
const blockCounts = length >> 2;
const tailLength = length - blockCounts * 4;
const dataUint32 = new Uint32Array(data.buffer, 0, blockCounts);
let k1 = 0, k2 = 0;
let h1 = this.h1, h2 = this.h2;
const C1 = 3432918353, C2 = 461845907;
const C1_LOW = C1 & MASK_LOW, C2_LOW = C2 & MASK_LOW;
for (let i = 0; i < blockCounts; i++) {
if (i & 1) {
k1 = dataUint32[i];
k1 = k1 * C1 & MASK_HIGH | k1 * C1_LOW & MASK_LOW;
k1 = k1 << 15 | k1 >>> 17;
k1 = k1 * C2 & MASK_HIGH | k1 * C2_LOW & MASK_LOW;
h1 ^= k1;
h1 = h1 << 13 | h1 >>> 19;
h1 = h1 * 5 + 3864292196;
} else {
k2 = dataUint32[i];
k2 = k2 * C1 & MASK_HIGH | k2 * C1_LOW & MASK_LOW;
k2 = k2 << 15 | k2 >>> 17;
k2 = k2 * C2 & MASK_HIGH | k2 * C2_LOW & MASK_LOW;
h2 ^= k2;
h2 = h2 << 13 | h2 >>> 19;
h2 = h2 * 5 + 3864292196;
}
}
k1 = 0;
switch (tailLength) {
case 3:
k1 ^= data[blockCounts * 4 + 2] << 16;
case 2:
k1 ^= data[blockCounts * 4 + 1] << 8;
case 1:
k1 ^= data[blockCounts * 4];
k1 = k1 * C1 & MASK_HIGH | k1 * C1_LOW & MASK_LOW;
k1 = k1 << 15 | k1 >>> 17;
k1 = k1 * C2 & MASK_HIGH | k1 * C2_LOW & MASK_LOW;
if (blockCounts & 1) {
h1 ^= k1;
} else {
h2 ^= k1;
}
}
this.h1 = h1;
this.h2 = h2;
}
hexdigest() {
let h1 = this.h1, h2 = this.h2;
h1 ^= h2 >>> 1;
h1 = h1 * 3981806797 & MASK_HIGH | h1 * 36045 & MASK_LOW;
h2 = h2 * 4283543511 & MASK_HIGH | ((h2 << 16 | h1 >>> 16) * 2950163797 & MASK_HIGH) >>> 16;
h1 ^= h2 >>> 1;
h1 = h1 * 444984403 & MASK_HIGH | h1 * 60499 & MASK_LOW;
h2 = h2 * 3301882366 & MASK_HIGH | ((h2 << 16 | h1 >>> 16) * 3120437893 & MASK_HIGH) >>> 16;
h1 ^= h2 >>> 1;
return (h1 >>> 0).toString(16).padStart(8, "0") + (h2 >>> 0).toString(16).padStart(8, "0");
}
};
var SerializableEmpty = Object.freeze({
map: null,
hash: "",
transfer: void 0
});
var _modified, _modifiedIds, _storage, _setModified, setModified_fn;
var AnnotationStorage = class {
constructor() {
__privateAdd(this, _setModified);
__privateAdd(this, _modified, false);
__privateAdd(this, _modifiedIds, null);
__privateAdd(this, _storage, /* @__PURE__ */ new Map());
this.onSetModified = null;
this.onResetModified = null;
this.onAnnotationEditor = null;
}
getValue(key, defaultValue) {
const value = __privateGet(this, _storage).get(key);
if (value === void 0) {
return defaultValue;
}
return Object.assign(defaultValue, value);
}
getRawValue(key) {
return __privateGet(this, _storage).get(key);
}
remove(key) {
__privateGet(this, _storage).delete(key);
if (__privateGet(this, _storage).size === 0) {
this.resetModified();
}
if (typeof this.onAnnotationEditor === "function") {
for (const value of __privateGet(this, _storage).values()) {
if (value instanceof AnnotationEditor) {
return;
}
}
this.onAnnotationEditor(null);
}
}
setValue(key, value) {
const obj = __privateGet(this, _storage).get(key);
let modified = false;
if (obj !== void 0) {
for (const [entry, val] of Object.entries(value)) {
if (obj[entry] !== val) {
modified = true;
obj[entry] = val;
}
}
} else {
modified = true;
__privateGet(this, _storage).set(key, value);
}
if (modified) {
__privateMethod(this, _setModified, setModified_fn).call(this);
}
if (value instanceof AnnotationEditor && typeof this.onAnnotationEditor === "function") {
this.onAnnotationEditor(value.constructor._type);
}
}
has(key) {
return __privateGet(this, _storage).has(key);
}
getAll() {
return __privateGet(this, _storage).size > 0 ? objectFromMap(__privateGet(this, _storage)) : null;
}
setAll(obj) {
for (const [key, val] of Object.entries(obj)) {
this.setValue(key, val);
}
}
get size() {
return __privateGet(this, _storage).size;
}
resetModified() {
if (__privateGet(this, _modified)) {
__privateSet(this, _modified, false);
if (typeof this.onResetModified === "function") {
this.onResetModified();
}
}
}
get print() {
return new PrintAnnotationStorage(this);
}
get serializable() {
if (__privateGet(this, _storage).size === 0) {
return SerializableEmpty;
}
const map = /* @__PURE__ */ new Map(), hash = new MurmurHash3_64(), transfer = [];
const context = /* @__PURE__ */ Object.create(null);
let hasBitmap = false;
for (const [key, val] of __privateGet(this, _storage)) {
const serialized = val instanceof AnnotationEditor ? val.serialize(false, context) : val;
if (serialized) {
map.set(key, serialized);
hash.update(`${key}:${JSON.stringify(serialized)}`);
hasBitmap || (hasBitmap = !!serialized.bitmap);
}
}
if (hasBitmap) {
for (const value of map.values()) {
if (value.bitmap) {
transfer.push(value.bitmap);
}
}
}
return map.size > 0 ? {
map,
hash: hash.hexdigest(),
transfer
} : SerializableEmpty;
}
get editorStats() {
var _a2;
let stats = null;
const typeToEditor = /* @__PURE__ */ new Map();
for (const value of __privateGet(this, _storage).values()) {
if (!(value instanceof AnnotationEditor)) {
continue;
}
const editorStats = value.telemetryFinalData;
if (!editorStats) {
continue;
}
const {
type
} = editorStats;
if (!typeToEditor.has(type)) {
typeToEditor.set(type, Object.getPrototypeOf(value).constructor);
}
stats || (stats = /* @__PURE__ */ Object.create(null));
const map = stats[type] || (stats[type] = /* @__PURE__ */ new Map());
for (const [key, val] of Object.entries(editorStats)) {
if (key === "type") {
continue;
}
let counters = map.get(key);
if (!counters) {
counters = /* @__PURE__ */ new Map();
map.set(key, counters);
}
const count = (_a2 = counters.get(val)) != null ? _a2 : 0;
counters.set(val, count + 1);
}
}
for (const [type, editor] of typeToEditor) {
stats[type] = editor.computeTelemetryFinalData(stats[type]);
}
return stats;
}
resetModifiedIds() {
__privateSet(this, _modifiedIds, null);
}
get modifiedIds() {
if (__privateGet(this, _modifiedIds)) {
return __privateGet(this, _modifiedIds);
}
const ids = [];
for (const value of __privateGet(this, _storage).values()) {
if (!(value instanceof AnnotationEditor) || !value.annotationElementId || !value.serialize()) {
continue;
}
ids.push(value.annotationElementId);
}
return __privateSet(this, _modifiedIds, {
ids: new Set(ids),
hash: ids.join(",")
});
}
};
_modified = new WeakMap();
_modifiedIds = new WeakMap();
_storage = new WeakMap();
_setModified = new WeakSet();
setModified_fn = function() {
if (!__privateGet(this, _modified)) {
__privateSet(this, _modified, true);
if (typeof this.onSetModified === "function") {
this.onSetModified();
}
}
};
var _serializable;
var PrintAnnotationStorage = class extends AnnotationStorage {
constructor(parent) {
super();
__privateAdd(this, _serializable, void 0);
const {
map,
hash,
transfer
} = parent.serializable;
const clone = structuredClone(map, transfer ? {
transfer
} : null);
__privateSet(this, _serializable, {
map: clone,
hash,
transfer
});
}
get print() {
unreachable("Should not call PrintAnnotationStorage.print");
}
get serializable() {
return __privateGet(this, _serializable);
}
get modifiedIds() {
return shadow(this, "modifiedIds", {
ids: /* @__PURE__ */ new Set(),
hash: ""
});
}
};
_serializable = new WeakMap();
var _systemFonts;
var FontLoader = class {
constructor({
ownerDocument = globalThis.document,
styleElement = null
}) {
__privateAdd(this, _systemFonts, /* @__PURE__ */ new Set());
this._document = ownerDocument;
this.nativeFontFaces = /* @__PURE__ */ new Set();
this.styleElement = null;
this.loadingRequests = [];
this.loadTestFontId = 0;
}
addNativeFontFace(nativeFontFace) {
this.nativeFontFaces.add(nativeFontFace);
this._document.fonts.add(nativeFontFace);
}
removeNativeFontFace(nativeFontFace) {
this.nativeFontFaces.delete(nativeFontFace);
this._document.fonts.delete(nativeFontFace);
}
insertRule(rule) {
if (!this.styleElement) {
this.styleElement = this._document.createElement("style");
this._document.documentElement.getElementsByTagName("head")[0].append(this.styleElement);
}
const styleSheet = this.styleElement.sheet;
styleSheet.insertRule(rule, styleSheet.cssRules.length);
}
clear() {
for (const nativeFontFace of this.nativeFontFaces) {
this._document.fonts.delete(nativeFontFace);
}
this.nativeFontFaces.clear();
__privateGet(this, _systemFonts).clear();
if (this.styleElement) {
this.styleElement.remove();
this.styleElement = null;
}
}
async loadSystemFont({
systemFontInfo: info2,
_inspectFont
}) {
if (!info2 || __privateGet(this, _systemFonts).has(info2.loadedName)) {
return;
}
assert(!this.disableFontFace, "loadSystemFont shouldn't be called when `disableFontFace` is set.");
if (this.isFontLoadingAPISupported) {
const {
loadedName,
src,
style
} = info2;
const fontFace = new FontFace(loadedName, src, style);
this.addNativeFontFace(fontFace);
try {
await fontFace.load();
__privateGet(this, _systemFonts).add(loadedName);
_inspectFont == null ? void 0 : _inspectFont(info2);
} catch (e) {
warn(`Cannot load system font: ${info2.baseFontName}, installing it could help to improve PDF rendering.`);
this.removeNativeFontFace(fontFace);
}
return;
}
unreachable("Not implemented: loadSystemFont without the Font Loading API.");
}
async bind(font) {
if (font.attached || font.missingFile && !font.systemFontInfo) {
return;
}
font.attached = true;
if (font.systemFontInfo) {
await this.loadSystemFont(font);
return;
}
if (this.isFontLoadingAPISupported) {
const nativeFontFace = font.createNativeFontFace();
if (nativeFontFace) {
this.addNativeFontFace(nativeFontFace);
try {
await nativeFontFace.loaded;
} catch (ex) {
warn(`Failed to load font '${nativeFontFace.family}': '${ex}'.`);
font.disableFontFace = true;
throw ex;
}
}
return;
}
const rule = font.createFontFaceRule();
if (rule) {
this.insertRule(rule);
if (this.isSyncFontLoadingSupported) {
return;
}
await new Promise((resolve) => {
const request = this._queueLoadingCallback(resolve);
this._prepareFontLoadEvent(font, request);
});
}
}
get isFontLoadingAPISupported() {
var _a2;
const hasFonts = !!((_a2 = this._document) == null ? void 0 : _a2.fonts);
return shadow(this, "isFontLoadingAPISupported", hasFonts);
}
get isSyncFontLoadingSupported() {
let supported = false;
if (isNodeJS) {
supported = true;
} else if (typeof navigator !== "undefined" && typeof (navigator == null ? void 0 : navigator.userAgent) === "string" && /Mozilla\/5.0.*?rv:\d+.*? Gecko/.test(navigator.userAgent)) {
supported = true;
}
return shadow(this, "isSyncFontLoadingSupported", supported);
}
_queueLoadingCallback(callback) {
function completeRequest() {
assert(!request.done, "completeRequest() cannot be called twice.");
request.done = true;
while (loadingRequests.length > 0 && loadingRequests[0].done) {
const otherRequest = loadingRequests.shift();
setTimeout(otherRequest.callback, 0);
}
}
const {
loadingRequests
} = this;
const request = {
done: false,
complete: completeRequest,
callback
};
loadingRequests.push(request);
return request;
}
get _loadTestFont() {
const testFont = atob("T1RUTwALAIAAAwAwQ0ZGIDHtZg4AAAOYAAAAgUZGVE1lkzZwAAAEHAAAABxHREVGABQAFQAABDgAAAAeT1MvMlYNYwkAAAEgAAAAYGNtYXABDQLUAAACNAAAAUJoZWFk/xVFDQAAALwAAAA2aGhlYQdkA+oAAAD0AAAAJGhtdHgD6AAAAAAEWAAAAAZtYXhwAAJQAAAAARgAAAAGbmFtZVjmdH4AAAGAAAAAsXBvc3T/hgAzAAADeAAAACAAAQAAAAEAALZRFsRfDzz1AAsD6AAAAADOBOTLAAAAAM4KHDwAAAAAA+gDIQAAAAgAAgAAAAAAAAABAAADIQAAAFoD6AAAAAAD6AABAAAAAAAAAAAAAAAAAAAAAQAAUAAAAgAAAAQD6AH0AAUAAAKKArwAAACMAooCvAAAAeAAMQECAAACAAYJAAAAAAAAAAAAAQAAAAAAAAAAAAAAAFBmRWQAwAAuAC4DIP84AFoDIQAAAAAAAQAAAAAAAAAAACAAIAABAAAADgCuAAEAAAAAAAAAAQAAAAEAAAAAAAEAAQAAAAEAAAAAAAIAAQAAAAEAAAAAAAMAAQAAAAEAAAAAAAQAAQAAAAEAAAAAAAUAAQAAAAEAAAAAAAYAAQAAAAMAAQQJAAAAAgABAAMAAQQJAAEAAgABAAMAAQQJAAIAAgABAAMAAQQJAAMAAgABAAMAAQQJAAQAAgABAAMAAQQJAAUAAgABAAMAAQQJAAYAAgABWABYAAAAAAAAAwAAAAMAAAAcAAEAAAAAADwAAwABAAAAHAAEACAAAAAEAAQAAQAAAC7//wAAAC7////TAAEAAAAAAAABBgAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAAAAD/gwAyAAAAAQAAAAAAAAAAAAAAAAAAAAABAAQEAAEBAQJYAAEBASH4DwD4GwHEAvgcA/gXBIwMAYuL+nz5tQXkD5j3CBLnEQACAQEBIVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYAAABAQAADwACAQEEE/t3Dov6fAH6fAT+fPp8+nwHDosMCvm1Cvm1DAz6fBQAAAAAAAABAAAAAMmJbzEAAAAAzgTjFQAAAADOBOQpAAEAAAAAAAAADAAUAAQAAAABAAAAAgABAAAAAAAAAAAD6AAAAAAAAA==");
return shadow(this, "_loadTestFont", testFont);
}
_prepareFontLoadEvent(font, request) {
function int32(data2, offset) {
return data2.charCodeAt(offset) << 24 | data2.charCodeAt(offset + 1) << 16 | data2.charCodeAt(offset + 2) << 8 | data2.charCodeAt(offset + 3) & 255;
}
function spliceString(s, offset, remove, insert) {
const chunk1 = s.substring(0, offset);
const chunk2 = s.substring(offset + remove);
return chunk1 + insert + chunk2;
}
let i, ii;
const canvas = this._document.createElement("canvas");
canvas.width = 1;
canvas.height = 1;
const ctx = canvas.getContext("2d");
let called = 0;
function isFontReady(name, callback) {
if (++called > 30) {
warn("Load test font never loaded.");
callback();
return;
}
ctx.font = "30px " + name;
ctx.fillText(".", 0, 20);
const imageData = ctx.getImageData(0, 0, 1, 1);
if (imageData.data[3] > 0) {
callback();
return;
}
setTimeout(isFontReady.bind(null, name, callback));
}
const loadTestFontId = `lt${Date.now()}${this.loadTestFontId++}`;
let data = this._loadTestFont;
const COMMENT_OFFSET = 976;
data = spliceString(data, COMMENT_OFFSET, loadTestFontId.length, loadTestFontId);
const CFF_CHECKSUM_OFFSET = 16;
const XXXX_VALUE = 1482184792;
let checksum = int32(data, CFF_CHECKSUM_OFFSET);
for (i = 0, ii = loadTestFontId.length - 3; i < ii; i += 4) {
checksum = checksum - XXXX_VALUE + int32(loadTestFontId, i) | 0;
}
if (i < loadTestFontId.length) {
checksum = checksum - XXXX_VALUE + int32(loadTestFontId + "XXX", i) | 0;
}
data = spliceString(data, CFF_CHECKSUM_OFFSET, 4, string32(checksum));
const url = `url(data:font/opentype;base64,${btoa(data)});`;
const rule = `@font-face {font-family:"${loadTestFontId}";src:${url}}`;
this.insertRule(rule);
const div = this._document.createElement("div");
div.style.visibility = "hidden";
div.style.width = div.style.height = "10px";
div.style.position = "absolute";
div.style.top = div.style.left = "0px";
for (const name of [font.loadedName, loadTestFontId]) {
const span = this._document.createElement("span");
span.textContent = "Hi";
span.style.fontFamily = name;
div.append(span);
}
this._document.body.append(div);
isFontReady(loadTestFontId, () => {
div.remove();
request.complete();
});
}
};
_systemFonts = new WeakMap();
var FontFaceObject = class {
constructor(translatedData, {
disableFontFace = false,
inspectFont = null
}) {
this.compiledGlyphs = /* @__PURE__ */ Object.create(null);
for (const i in translatedData) {
this[i] = translatedData[i];
}
this.disableFontFace = disableFontFace === true;
this._inspectFont = inspectFont;
}
createNativeFontFace() {
var _a2;
if (!this.data || this.disableFontFace) {
return null;
}
let nativeFontFace;
if (!this.cssFontInfo) {
nativeFontFace = new FontFace(this.loadedName, this.data, {});
} else {
const css = {
weight: this.cssFontInfo.fontWeight
};
if (this.cssFontInfo.italicAngle) {
css.style = `oblique ${this.cssFontInfo.italicAngle}deg`;
}
nativeFontFace = new FontFace(this.cssFontInfo.fontFamily, this.data, css);
}
(_a2 = this._inspectFont) == null ? void 0 : _a2.call(this, this);
return nativeFontFace;
}
createFontFaceRule() {
var _a2;
if (!this.data || this.disableFontFace) {
return null;
}
const data = bytesToString(this.data);
const url = `url(data:${this.mimetype};base64,${btoa(data)});`;
let rule;
if (!this.cssFontInfo) {
rule = `@font-face {font-family:"${this.loadedName}";src:${url}}`;
} else {
let css = `font-weight: ${this.cssFontInfo.fontWeight};`;
if (this.cssFontInfo.italicAngle) {
css += `font-style: oblique ${this.cssFontInfo.italicAngle}deg;`;
}
rule = `@font-face {font-family:"${this.cssFontInfo.fontFamily}";${css}src:${url}}`;
}
(_a2 = this._inspectFont) == null ? void 0 : _a2.call(this, this, url);
return rule;
}
getPathGenerator(objs, character) {
if (this.compiledGlyphs[character] !== void 0) {
return this.compiledGlyphs[character];
}
let cmds;
try {
cmds = objs.get(this.loadedName + "_path_" + character);
} catch (ex) {
warn(`getPathGenerator - ignoring character: "${ex}".`);
}
if (!Array.isArray(cmds) || cmds.length === 0) {
return this.compiledGlyphs[character] = function(c, size) {
};
}
const commands = [];
for (let i = 0, ii = cmds.length; i < ii; ) {
switch (cmds[i++]) {
case FontRenderOps.BEZIER_CURVE_TO:
{
const [a, b, c, d, e, f] = cmds.slice(i, i + 6);
commands.push((ctx) => ctx.bezierCurveTo(a, b, c, d, e, f));
i += 6;
}
break;
case FontRenderOps.MOVE_TO:
{
const [a, b] = cmds.slice(i, i + 2);
commands.push((ctx) => ctx.moveTo(a, b));
i += 2;
}
break;
case FontRenderOps.LINE_TO:
{
const [a, b] = cmds.slice(i, i + 2);
commands.push((ctx) => ctx.lineTo(a, b));
i += 2;
}
break;
case FontRenderOps.QUADRATIC_CURVE_TO:
{
const [a, b, c, d] = cmds.slice(i, i + 4);
commands.push((ctx) => ctx.quadraticCurveTo(a, b, c, d));
i += 4;
}
break;
case FontRenderOps.RESTORE:
commands.push((ctx) => ctx.restore());
break;
case FontRenderOps.SAVE:
commands.push((ctx) => ctx.save());
break;
case FontRenderOps.SCALE:
assert(commands.length === 2, "Scale command is only valid at the third position.");
break;
case FontRenderOps.TRANSFORM:
{
const [a, b, c, d, e, f] = cmds.slice(i, i + 6);
commands.push((ctx) => ctx.transform(a, b, c, d, e, f));
i += 6;
}
break;
case FontRenderOps.TRANSLATE:
{
const [a, b] = cmds.slice(i, i + 2);
commands.push((ctx) => ctx.translate(a, b));
i += 2;
}
break;
}
}
return this.compiledGlyphs[character] = function glyphDrawer(ctx, size) {
commands[0](ctx);
commands[1](ctx);
ctx.scale(size, -size);
for (let i = 2, ii = commands.length; i < ii; i++) {
commands[i](ctx);
}
};
}
};
if (isNodeJS) {
packageCapability = Promise.withResolvers();
packageMap = null;
const loadPackages = async () => {
const fs = await import(
/*webpackIgnore: true*/
"fs"
), http = await import(
/*webpackIgnore: true*/
"http"
), https = await import(
/*webpackIgnore: true*/
"https"
), url = await import(
/*webpackIgnore: true*/
"url"
);
let canvas, path2d;
return new Map(Object.entries({
fs,
http,
https,
url,
canvas,
path2d
}));
};
loadPackages().then((map) => {
packageMap = map;
packageCapability.resolve();
}, (reason) => {
warn(`loadPackages: ${reason}`);
packageMap = /* @__PURE__ */ new Map();
packageCapability.resolve();
});
}
var packageCapability;
var packageMap;
var NodePackages = class {
static get promise() {
return packageCapability.promise;
}
static get(name) {
return packageMap == null ? void 0 : packageMap.get(name);
}
};
var node_utils_fetchData = function(url) {
const fs = NodePackages.get("fs");
return fs.promises.readFile(url).then((data) => new Uint8Array(data));
};
var NodeFilterFactory = class extends BaseFilterFactory {
};
var NodeCanvasFactory = class extends BaseCanvasFactory {
_createCanvas(width, height) {
const canvas = NodePackages.get("canvas");
return canvas.createCanvas(width, height);
}
};
var NodeCMapReaderFactory = class extends BaseCMapReaderFactory {
_fetchData(url, compressionType) {
return node_utils_fetchData(url).then((data) => ({
cMapData: data,
compressionType
}));
}
};
var NodeStandardFontDataFactory = class extends BaseStandardFontDataFactory {
_fetchData(url) {
return node_utils_fetchData(url);
}
};
var PathType = {
FILL: "Fill",
STROKE: "Stroke",
SHADING: "Shading"
};
function applyBoundingBox(ctx, bbox) {
if (!bbox) {
return;
}
const width = bbox[2] - bbox[0];
const height = bbox[3] - bbox[1];
const region = new Path2D();
region.rect(bbox[0], bbox[1], width, height);
ctx.clip(region);
}
var BaseShadingPattern = class {
getPattern() {
unreachable("Abstract method `getPattern` called.");
}
};
var RadialAxialShadingPattern = class extends BaseShadingPattern {
constructor(IR) {
super();
this._type = IR[1];
this._bbox = IR[2];
this._colorStops = IR[3];
this._p0 = IR[4];
this._p1 = IR[5];
this._r0 = IR[6];
this._r1 = IR[7];
this.matrix = null;
}
_createGradient(ctx) {
let grad;
if (this._type === "axial") {
grad = ctx.createLinearGradient(this._p0[0], this._p0[1], this._p1[0], this._p1[1]);
} else if (this._type === "radial") {
grad = ctx.createRadialGradient(this._p0[0], this._p0[1], this._r0, this._p1[0], this._p1[1], this._r1);
}
for (const colorStop of this._colorStops) {
grad.addColorStop(colorStop[0], colorStop[1]);
}
return grad;
}
getPattern(ctx, owner, inverse, pathType) {
let pattern;
if (pathType === PathType.STROKE || pathType === PathType.FILL) {
const ownerBBox = owner.current.getClippedPathBoundingBox(pathType, getCurrentTransform(ctx)) || [0, 0, 0, 0];
const width = Math.ceil(ownerBBox[2] - ownerBBox[0]) || 1;
const height = Math.ceil(ownerBBox[3] - ownerBBox[1]) || 1;
const tmpCanvas = owner.cachedCanvases.getCanvas("pattern", width, height, true);
const tmpCtx = tmpCanvas.context;
tmpCtx.clearRect(0, 0, tmpCtx.canvas.width, tmpCtx.canvas.height);
tmpCtx.beginPath();
tmpCtx.rect(0, 0, tmpCtx.canvas.width, tmpCtx.canvas.height);
tmpCtx.translate(-ownerBBox[0], -ownerBBox[1]);
inverse = Util.transform(inverse, [1, 0, 0, 1, ownerBBox[0], ownerBBox[1]]);
tmpCtx.transform(...owner.baseTransform);
if (this.matrix) {
tmpCtx.transform(...this.matrix);
}
applyBoundingBox(tmpCtx, this._bbox);
tmpCtx.fillStyle = this._createGradient(tmpCtx);
tmpCtx.fill();
pattern = ctx.createPattern(tmpCanvas.canvas, "no-repeat");
const domMatrix = new DOMMatrix(inverse);
pattern.setTransform(domMatrix);
} else {
applyBoundingBox(ctx, this._bbox);
pattern = this._createGradient(ctx);
}
return pattern;
}
};
function drawTriangle(data, context, p1, p2, p3, c1, c2, c3) {
const coords = context.coords, colors = context.colors;
const bytes = data.data, rowSize = data.width * 4;
let tmp;
if (coords[p1 + 1] > coords[p2 + 1]) {
tmp = p1;
p1 = p2;
p2 = tmp;
tmp = c1;
c1 = c2;
c2 = tmp;
}
if (coords[p2 + 1] > coords[p3 + 1]) {
tmp = p2;
p2 = p3;
p3 = tmp;
tmp = c2;
c2 = c3;
c3 = tmp;
}
if (coords[p1 + 1] > coords[p2 + 1]) {
tmp = p1;
p1 = p2;
p2 = tmp;
tmp = c1;
c1 = c2;
c2 = tmp;
}
const x1 = (coords[p1] + context.offsetX) * context.scaleX;
const y1 = (coords[p1 + 1] + context.offsetY) * context.scaleY;
const x2 = (coords[p2] + context.offsetX) * context.scaleX;
const y2 = (coords[p2 + 1] + context.offsetY) * context.scaleY;
const x3 = (coords[p3] + context.offsetX) * context.scaleX;
const y3 = (coords[p3 + 1] + context.offsetY) * context.scaleY;
if (y1 >= y3) {
return;
}
const c1r = colors[c1], c1g = colors[c1 + 1], c1b = colors[c1 + 2];
const c2r = colors[c2], c2g = colors[c2 + 1], c2b = colors[c2 + 2];
const c3r = colors[c3], c3g = colors[c3 + 1], c3b = colors[c3 + 2];
const minY = Math.round(y1), maxY = Math.round(y3);
let xa, car, cag, cab;
let xb, cbr, cbg, cbb;
for (let y = minY; y <= maxY; y++) {
if (y < y2) {
const k2 = y < y1 ? 0 : (y1 - y) / (y1 - y2);
xa = x1 - (x1 - x2) * k2;
car = c1r - (c1r - c2r) * k2;
cag = c1g - (c1g - c2g) * k2;
cab = c1b - (c1b - c2b) * k2;
} else {
let k2;
if (y > y3) {
k2 = 1;
} else if (y2 === y3) {
k2 = 0;
} else {
k2 = (y2 - y) / (y2 - y3);
}
xa = x2 - (x2 - x3) * k2;
car = c2r - (c2r - c3r) * k2;
cag = c2g - (c2g - c3g) * k2;
cab = c2b - (c2b - c3b) * k2;
}
let k;
if (y < y1) {
k = 0;
} else if (y > y3) {
k = 1;
} else {
k = (y1 - y) / (y1 - y3);
}
xb = x1 - (x1 - x3) * k;
cbr = c1r - (c1r - c3r) * k;
cbg = c1g - (c1g - c3g) * k;
cbb = c1b - (c1b - c3b) * k;
const x1_ = Math.round(Math.min(xa, xb));
const x2_ = Math.round(Math.max(xa, xb));
let j = rowSize * y + x1_ * 4;
for (let x = x1_; x <= x2_; x++) {
k = (xa - x) / (xa - xb);
if (k < 0) {
k = 0;
} else if (k > 1) {
k = 1;
}
bytes[j++] = car - (car - cbr) * k | 0;
bytes[j++] = cag - (cag - cbg) * k | 0;
bytes[j++] = cab - (cab - cbb) * k | 0;
bytes[j++] = 255;
}
}
}
function drawFigure(data, figure, context) {
const ps = figure.coords;
const cs = figure.colors;
let i, ii;
switch (figure.type) {
case "lattice":
const verticesPerRow = figure.verticesPerRow;
const rows = Math.floor(ps.length / verticesPerRow) - 1;
const cols = verticesPerRow - 1;
for (i = 0; i < rows; i++) {
let q = i * verticesPerRow;
for (let j = 0; j < cols; j++, q++) {
drawTriangle(data, context, ps[q], ps[q + 1], ps[q + verticesPerRow], cs[q], cs[q + 1], cs[q + verticesPerRow]);
drawTriangle(data, context, ps[q + verticesPerRow + 1], ps[q + 1], ps[q + verticesPerRow], cs[q + verticesPerRow + 1], cs[q + 1], cs[q + verticesPerRow]);
}
}
break;
case "triangles":
for (i = 0, ii = ps.length; i < ii; i += 3) {
drawTriangle(data, context, ps[i], ps[i + 1], ps[i + 2], cs[i], cs[i + 1], cs[i + 2]);
}
break;
default:
throw new Error("illegal figure");
}
}
var MeshShadingPattern = class extends BaseShadingPattern {
constructor(IR) {
super();
this._coords = IR[2];
this._colors = IR[3];
this._figures = IR[4];
this._bounds = IR[5];
this._bbox = IR[7];
this._background = IR[8];
this.matrix = null;
}
_createMeshCanvas(combinedScale, backgroundColor, cachedCanvases) {
const EXPECTED_SCALE = 1.1;
const MAX_PATTERN_SIZE = 3e3;
const BORDER_SIZE = 2;
const offsetX = Math.floor(this._bounds[0]);
const offsetY = Math.floor(this._bounds[1]);
const boundsWidth = Math.ceil(this._bounds[2]) - offsetX;
const boundsHeight = Math.ceil(this._bounds[3]) - offsetY;
const width = Math.min(Math.ceil(Math.abs(boundsWidth * combinedScale[0] * EXPECTED_SCALE)), MAX_PATTERN_SIZE);
const height = Math.min(Math.ceil(Math.abs(boundsHeight * combinedScale[1] * EXPECTED_SCALE)), MAX_PATTERN_SIZE);
const scaleX = boundsWidth / width;
const scaleY = boundsHeight / height;
const context = {
coords: this._coords,
colors: this._colors,
offsetX: -offsetX,
offsetY: -offsetY,
scaleX: 1 / scaleX,
scaleY: 1 / scaleY
};
const paddedWidth = width + BORDER_SIZE * 2;
const paddedHeight = height + BORDER_SIZE * 2;
const tmpCanvas = cachedCanvases.getCanvas("mesh", paddedWidth, paddedHeight, false);
const tmpCtx = tmpCanvas.context;
const data = tmpCtx.createImageData(width, height);
if (backgroundColor) {
const bytes = data.data;
for (let i = 0, ii = bytes.length; i < ii; i += 4) {
bytes[i] = backgroundColor[0];
bytes[i + 1] = backgroundColor[1];
bytes[i + 2] = backgroundColor[2];
bytes[i + 3] = 255;
}
}
for (const figure of this._figures) {
drawFigure(data, figure, context);
}
tmpCtx.putImageData(data, BORDER_SIZE, BORDER_SIZE);
const canvas = tmpCanvas.canvas;
return {
canvas,
offsetX: offsetX - BORDER_SIZE * scaleX,
offsetY: offsetY - BORDER_SIZE * scaleY,
scaleX,
scaleY
};
}
getPattern(ctx, owner, inverse, pathType) {
applyBoundingBox(ctx, this._bbox);
let scale;
if (pathType === PathType.SHADING) {
scale = Util.singularValueDecompose2dScale(getCurrentTransform(ctx));
} else {
scale = Util.singularValueDecompose2dScale(owner.baseTransform);
if (this.matrix) {
const matrixScale = Util.singularValueDecompose2dScale(this.matrix);
scale = [scale[0] * matrixScale[0], scale[1] * matrixScale[1]];
}
}
const temporaryPatternCanvas = this._createMeshCanvas(scale, pathType === PathType.SHADING ? null : this._background, owner.cachedCanvases);
if (pathType !== PathType.SHADING) {
ctx.setTransform(...owner.baseTransform);
if (this.matrix) {
ctx.transform(...this.matrix);
}
}
ctx.translate(temporaryPatternCanvas.offsetX, temporaryPatternCanvas.offsetY);
ctx.scale(temporaryPatternCanvas.scaleX, temporaryPatternCanvas.scaleY);
return ctx.createPattern(temporaryPatternCanvas.canvas, "no-repeat");
}
};
var DummyShadingPattern = class extends BaseShadingPattern {
getPattern() {
return "hotpink";
}
};
function getShadingPattern(IR) {
switch (IR[0]) {
case "RadialAxial":
return new RadialAxialShadingPattern(IR);
case "Mesh":
return new MeshShadingPattern(IR);
case "Dummy":
return new DummyShadingPattern();
}
throw new Error(`Unknown IR type: ${IR[0]}`);
}
var PaintType = {
COLORED: 1,
UNCOLORED: 2
};
var _TilingPattern = class {
constructor(IR, color2, ctx, canvasGraphicsFactory, baseTransform) {
this.operatorList = IR[2];
this.matrix = IR[3];
this.bbox = IR[4];
this.xstep = IR[5];
this.ystep = IR[6];
this.paintType = IR[7];
this.tilingType = IR[8];
this.color = color2;
this.ctx = ctx;
this.canvasGraphicsFactory = canvasGraphicsFactory;
this.baseTransform = baseTransform;
}
createPatternCanvas(owner) {
const operatorList = this.operatorList;
const bbox = this.bbox;
const xstep = this.xstep;
const ystep = this.ystep;
const paintType = this.paintType;
const tilingType = this.tilingType;
const color2 = this.color;
const canvasGraphicsFactory = this.canvasGraphicsFactory;
info("TilingType: " + tilingType);
const x0 = bbox[0], y0 = bbox[1], x1 = bbox[2], y1 = bbox[3];
const matrixScale = Util.singularValueDecompose2dScale(this.matrix);
const curMatrixScale = Util.singularValueDecompose2dScale(this.baseTransform);
const combinedScale = [matrixScale[0] * curMatrixScale[0], matrixScale[1] * curMatrixScale[1]];
const dimx = this.getSizeAndScale(xstep, this.ctx.canvas.width, combinedScale[0]);
const dimy = this.getSizeAndScale(ystep, this.ctx.canvas.height, combinedScale[1]);
const tmpCanvas = owner.cachedCanvases.getCanvas("pattern", dimx.size, dimy.size, true);
const tmpCtx = tmpCanvas.context;
const graphics = canvasGraphicsFactory.createCanvasGraphics(tmpCtx);
graphics.groupLevel = owner.groupLevel;
this.setFillAndStrokeStyleToContext(graphics, paintType, color2);
let adjustedX0 = x0;
let adjustedY0 = y0;
let adjustedX1 = x1;
let adjustedY1 = y1;
if (x0 < 0) {
adjustedX0 = 0;
adjustedX1 += Math.abs(x0);
}
if (y0 < 0) {
adjustedY0 = 0;
adjustedY1 += Math.abs(y0);
}
tmpCtx.translate(-(dimx.scale * adjustedX0), -(dimy.scale * adjustedY0));
graphics.transform(dimx.scale, 0, 0, dimy.scale, 0, 0);
tmpCtx.save();
this.clipBbox(graphics, adjustedX0, adjustedY0, adjustedX1, adjustedY1);
graphics.baseTransform = getCurrentTransform(graphics.ctx);
graphics.executeOperatorList(operatorList);
graphics.endDrawing();
return {
canvas: tmpCanvas.canvas,
scaleX: dimx.scale,
scaleY: dimy.scale,
offsetX: adjustedX0,
offsetY: adjustedY0
};
}
getSizeAndScale(step, realOutputSize, scale) {
step = Math.abs(step);
const maxSize = Math.max(_TilingPattern.MAX_PATTERN_SIZE, realOutputSize);
let size = Math.ceil(step * scale);
if (size >= maxSize) {
size = maxSize;
} else {
scale = size / step;
}
return {
scale,
size
};
}
clipBbox(graphics, x0, y0, x1, y1) {
const bboxWidth = x1 - x0;
const bboxHeight = y1 - y0;
graphics.ctx.rect(x0, y0, bboxWidth, bboxHeight);
graphics.current.updateRectMinMax(getCurrentTransform(graphics.ctx), [x0, y0, x1, y1]);
graphics.clip();
graphics.endPath();
}
setFillAndStrokeStyleToContext(graphics, paintType, color2) {
const context = graphics.ctx, current = graphics.current;
switch (paintType) {
case PaintType.COLORED:
const ctx = this.ctx;
context.fillStyle = ctx.fillStyle;
context.strokeStyle = ctx.strokeStyle;
current.fillColor = ctx.fillStyle;
current.strokeColor = ctx.strokeStyle;
break;
case PaintType.UNCOLORED:
const cssColor = Util.makeHexColor(color2[0], color2[1], color2[2]);
context.fillStyle = cssColor;
context.strokeStyle = cssColor;
current.fillColor = cssColor;
current.strokeColor = cssColor;
break;
default:
throw new FormatError(`Unsupported paint type: ${paintType}`);
}
}
getPattern(ctx, owner, inverse, pathType) {
let matrix = inverse;
if (pathType !== PathType.SHADING) {
matrix = Util.transform(matrix, owner.baseTransform);
if (this.matrix) {
matrix = Util.transform(matrix, this.matrix);
}
}
const temporaryPatternCanvas = this.createPatternCanvas(owner);
let domMatrix = new DOMMatrix(matrix);
domMatrix = domMatrix.translate(temporaryPatternCanvas.offsetX, temporaryPatternCanvas.offsetY);
domMatrix = domMatrix.scale(1 / temporaryPatternCanvas.scaleX, 1 / temporaryPatternCanvas.scaleY);
const pattern = ctx.createPattern(temporaryPatternCanvas.canvas, "repeat");
pattern.setTransform(domMatrix);
return pattern;
}
};
var TilingPattern = _TilingPattern;
__publicField(TilingPattern, "MAX_PATTERN_SIZE", 3e3);
function convertBlackAndWhiteToRGBA({
src,
srcPos = 0,
dest,
width,
height,
nonBlackColor = 4294967295,
inverseDecode = false
}) {
const black = util_FeatureTest.isLittleEndian ? 4278190080 : 255;
const [zeroMapping, oneMapping] = inverseDecode ? [nonBlackColor, black] : [black, nonBlackColor];
const widthInSource = width >> 3;
const widthRemainder = width & 7;
const srcLength = src.length;
dest = new Uint32Array(dest.buffer);
let destPos = 0;
for (let i = 0; i < height; i++) {
for (const max = srcPos + widthInSource; srcPos < max; srcPos++) {
const elem2 = srcPos < srcLength ? src[srcPos] : 255;
dest[destPos++] = elem2 & 128 ? oneMapping : zeroMapping;
dest[destPos++] = elem2 & 64 ? oneMapping : zeroMapping;
dest[destPos++] = elem2 & 32 ? oneMapping : zeroMapping;
dest[destPos++] = elem2 & 16 ? oneMapping : zeroMapping;
dest[destPos++] = elem2 & 8 ? oneMapping : zeroMapping;
dest[destPos++] = elem2 & 4 ? oneMapping : zeroMapping;
dest[destPos++] = elem2 & 2 ? oneMapping : zeroMapping;
dest[destPos++] = elem2 & 1 ? oneMapping : zeroMapping;
}
if (widthRemainder === 0) {
continue;
}
const elem = srcPos < srcLength ? src[srcPos++] : 255;
for (let j = 0; j < widthRemainder; j++) {
dest[destPos++] = elem & 1 << 7 - j ? oneMapping : zeroMapping;
}
}
return {
srcPos,
destPos
};
}
var MIN_FONT_SIZE = 16;
var MAX_FONT_SIZE = 100;
var EXECUTION_TIME = 15;
var EXECUTION_STEPS = 10;
var MAX_SIZE_TO_COMPILE = 1e3;
var FULL_CHUNK_HEIGHT = 16;
function mirrorContextOperations(ctx, destCtx) {
if (ctx._removeMirroring) {
throw new Error("Context is already forwarding operations.");
}
ctx.__originalSave = ctx.save;
ctx.__originalRestore = ctx.restore;
ctx.__originalRotate = ctx.rotate;
ctx.__originalScale = ctx.scale;
ctx.__originalTranslate = ctx.translate;
ctx.__originalTransform = ctx.transform;
ctx.__originalSetTransform = ctx.setTransform;
ctx.__originalResetTransform = ctx.resetTransform;
ctx.__originalClip = ctx.clip;
ctx.__originalMoveTo = ctx.moveTo;
ctx.__originalLineTo = ctx.lineTo;
ctx.__originalBezierCurveTo = ctx.bezierCurveTo;
ctx.__originalRect = ctx.rect;
ctx.__originalClosePath = ctx.closePath;
ctx.__originalBeginPath = ctx.beginPath;
ctx._removeMirroring = () => {
ctx.save = ctx.__originalSave;
ctx.restore = ctx.__originalRestore;
ctx.rotate = ctx.__originalRotate;
ctx.scale = ctx.__originalScale;
ctx.translate = ctx.__originalTranslate;
ctx.transform = ctx.__originalTransform;
ctx.setTransform = ctx.__originalSetTransform;
ctx.resetTransform = ctx.__originalResetTransform;
ctx.clip = ctx.__originalClip;
ctx.moveTo = ctx.__originalMoveTo;
ctx.lineTo = ctx.__originalLineTo;
ctx.bezierCurveTo = ctx.__originalBezierCurveTo;
ctx.rect = ctx.__originalRect;
ctx.closePath = ctx.__originalClosePath;
ctx.beginPath = ctx.__originalBeginPath;
delete ctx._removeMirroring;
};
ctx.save = function ctxSave() {
destCtx.save();
this.__originalSave();
};
ctx.restore = function ctxRestore() {
destCtx.restore();
this.__originalRestore();
};
ctx.translate = function ctxTranslate(x, y) {
destCtx.translate(x, y);
this.__originalTranslate(x, y);
};
ctx.scale = function ctxScale(x, y) {
destCtx.scale(x, y);
this.__originalScale(x, y);
};
ctx.transform = function ctxTransform(a, b, c, d, e, f) {
destCtx.transform(a, b, c, d, e, f);
this.__originalTransform(a, b, c, d, e, f);
};
ctx.setTransform = function ctxSetTransform(a, b, c, d, e, f) {
destCtx.setTransform(a, b, c, d, e, f);
this.__originalSetTransform(a, b, c, d, e, f);
};
ctx.resetTransform = function ctxResetTransform() {
destCtx.resetTransform();
this.__originalResetTransform();
};
ctx.rotate = function ctxRotate(angle) {
destCtx.rotate(angle);
this.__originalRotate(angle);
};
ctx.clip = function ctxRotate(rule) {
destCtx.clip(rule);
this.__originalClip(rule);
};
ctx.moveTo = function(x, y) {
destCtx.moveTo(x, y);
this.__originalMoveTo(x, y);
};
ctx.lineTo = function(x, y) {
destCtx.lineTo(x, y);
this.__originalLineTo(x, y);
};
ctx.bezierCurveTo = function(cp1x, cp1y, cp2x, cp2y, x, y) {
destCtx.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y);
this.__originalBezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y);
};
ctx.rect = function(x, y, width, height) {
destCtx.rect(x, y, width, height);
this.__originalRect(x, y, width, height);
};
ctx.closePath = function() {
destCtx.closePath();
this.__originalClosePath();
};
ctx.beginPath = function() {
destCtx.beginPath();
this.__originalBeginPath();
};
}
var CachedCanvases = class {
constructor(canvasFactory) {
this.canvasFactory = canvasFactory;
this.cache = /* @__PURE__ */ Object.create(null);
}
getCanvas(id, width, height) {
let canvasEntry;
if (this.cache[id] !== void 0) {
canvasEntry = this.cache[id];
this.canvasFactory.reset(canvasEntry, width, height);
} else {
canvasEntry = this.canvasFactory.create(width, height);
this.cache[id] = canvasEntry;
}
return canvasEntry;
}
delete(id) {
delete this.cache[id];
}
clear() {
for (const id in this.cache) {
const canvasEntry = this.cache[id];
this.canvasFactory.destroy(canvasEntry);
delete this.cache[id];
}
}
};
function drawImageAtIntegerCoords(ctx, srcImg, srcX, srcY, srcW, srcH, destX, destY, destW, destH) {
const [a, b, c, d, tx, ty] = getCurrentTransform(ctx);
if (b === 0 && c === 0) {
const tlX = destX * a + tx;
const rTlX = Math.round(tlX);
const tlY = destY * d + ty;
const rTlY = Math.round(tlY);
const brX = (destX + destW) * a + tx;
const rWidth = Math.abs(Math.round(brX) - rTlX) || 1;
const brY = (destY + destH) * d + ty;
const rHeight = Math.abs(Math.round(brY) - rTlY) || 1;
ctx.setTransform(Math.sign(a), 0, 0, Math.sign(d), rTlX, rTlY);
ctx.drawImage(srcImg, srcX, srcY, srcW, srcH, 0, 0, rWidth, rHeight);
ctx.setTransform(a, b, c, d, tx, ty);
return [rWidth, rHeight];
}
if (a === 0 && d === 0) {
const tlX = destY * c + tx;
const rTlX = Math.round(tlX);
const tlY = destX * b + ty;
const rTlY = Math.round(tlY);
const brX = (destY + destH) * c + tx;
const rWidth = Math.abs(Math.round(brX) - rTlX) || 1;
const brY = (destX + destW) * b + ty;
const rHeight = Math.abs(Math.round(brY) - rTlY) || 1;
ctx.setTransform(0, Math.sign(b), Math.sign(c), 0, rTlX, rTlY);
ctx.drawImage(srcImg, srcX, srcY, srcW, srcH, 0, 0, rHeight, rWidth);
ctx.setTransform(a, b, c, d, tx, ty);
return [rHeight, rWidth];
}
ctx.drawImage(srcImg, srcX, srcY, srcW, srcH, destX, destY, destW, destH);
const scaleX = Math.hypot(a, b);
const scaleY = Math.hypot(c, d);
return [scaleX * destW, scaleY * destH];
}
function compileType3Glyph(imgData) {
const {
width,
height
} = imgData;
if (width > MAX_SIZE_TO_COMPILE || height > MAX_SIZE_TO_COMPILE) {
return null;
}
const POINT_TO_PROCESS_LIMIT = 1e3;
const POINT_TYPES = new Uint8Array([0, 2, 4, 0, 1, 0, 5, 4, 8, 10, 0, 8, 0, 2, 1, 0]);
const width1 = width + 1;
let points = new Uint8Array(width1 * (height + 1));
let i, j, j0;
const lineSize = width + 7 & ~7;
let data = new Uint8Array(lineSize * height), pos = 0;
for (const elem of imgData.data) {
let mask = 128;
while (mask > 0) {
data[pos++] = elem & mask ? 0 : 255;
mask >>= 1;
}
}
let count = 0;
pos = 0;
if (data[pos] !== 0) {
points[0] = 1;
++count;
}
for (j = 1; j < width; j++) {
if (data[pos] !== data[pos + 1]) {
points[j] = data[pos] ? 2 : 1;
++count;
}
pos++;
}
if (data[pos] !== 0) {
points[j] = 2;
++count;
}
for (i = 1; i < height; i++) {
pos = i * lineSize;
j0 = i * width1;
if (data[pos - lineSize] !== data[pos]) {
points[j0] = data[pos] ? 1 : 8;
++count;
}
let sum2 = (data[pos] ? 4 : 0) + (data[pos - lineSize] ? 8 : 0);
for (j = 1; j < width; j++) {
sum2 = (sum2 >> 2) + (data[pos + 1] ? 4 : 0) + (data[pos - lineSize + 1] ? 8 : 0);
if (POINT_TYPES[sum2]) {
points[j0 + j] = POINT_TYPES[sum2];
++count;
}
pos++;
}
if (data[pos - lineSize] !== data[pos]) {
points[j0 + j] = data[pos] ? 2 : 4;
++count;
}
if (count > POINT_TO_PROCESS_LIMIT) {
return null;
}
}
pos = lineSize * (height - 1);
j0 = i * width1;
if (data[pos] !== 0) {
points[j0] = 8;
++count;
}
for (j = 1; j < width; j++) {
if (data[pos] !== data[pos + 1]) {
points[j0 + j] = data[pos] ? 4 : 8;
++count;
}
pos++;
}
if (data[pos] !== 0) {
points[j0 + j] = 4;
++count;
}
if (count > POINT_TO_PROCESS_LIMIT) {
return null;
}
const steps = new Int32Array([0, width1, -1, 0, -width1, 0, 0, 0, 1]);
const path = new Path2D();
for (i = 0; count && i <= height; i++) {
let p = i * width1;
const end = p + width;
while (p < end && !points[p]) {
p++;
}
if (p === end) {
continue;
}
path.moveTo(p % width1, i);
const p0 = p;
let type = points[p];
do {
const step = steps[type];
do {
p += step;
} while (!points[p]);
const pp = points[p];
if (pp !== 5 && pp !== 10) {
type = pp;
points[p] = 0;
} else {
type = pp & 51 * type >> 4;
points[p] &= type >> 2 | type << 2;
}
path.lineTo(p % width1, p / width1 | 0);
if (!points[p]) {
--count;
}
} while (p0 !== p);
--i;
}
data = null;
points = null;
const drawOutline = function(c) {
c.save();
c.scale(1 / width, -1 / height);
c.translate(0, -height);
c.fill(path);
c.beginPath();
c.restore();
};
return drawOutline;
}
var CanvasExtraState = class {
constructor(width, height) {
this.alphaIsShape = false;
this.fontSize = 0;
this.fontSizeScale = 1;
this.textMatrix = IDENTITY_MATRIX;
this.textMatrixScale = 1;
this.fontMatrix = FONT_IDENTITY_MATRIX;
this.leading = 0;
this.x = 0;
this.y = 0;
this.lineX = 0;
this.lineY = 0;
this.charSpacing = 0;
this.wordSpacing = 0;
this.textHScale = 1;
this.textRenderingMode = TextRenderingMode.FILL;
this.textRise = 0;
this.fillColor = "#000000";
this.strokeColor = "#000000";
this.patternFill = false;
this.fillAlpha = 1;
this.strokeAlpha = 1;
this.lineWidth = 1;
this.activeSMask = null;
this.transferMaps = "none";
this.startNewPathAndClipBox([0, 0, width, height]);
}
clone() {
const clone = Object.create(this);
clone.clipBox = this.clipBox.slice();
return clone;
}
setCurrentPoint(x, y) {
this.x = x;
this.y = y;
}
updatePathMinMax(transform, x, y) {
[x, y] = Util.applyTransform([x, y], transform);
this.minX = Math.min(this.minX, x);
this.minY = Math.min(this.minY, y);
this.maxX = Math.max(this.maxX, x);
this.maxY = Math.max(this.maxY, y);
}
updateRectMinMax(transform, rect) {
const p1 = Util.applyTransform(rect, transform);
const p2 = Util.applyTransform(rect.slice(2), transform);
const p3 = Util.applyTransform([rect[0], rect[3]], transform);
const p4 = Util.applyTransform([rect[2], rect[1]], transform);
this.minX = Math.min(this.minX, p1[0], p2[0], p3[0], p4[0]);
this.minY = Math.min(this.minY, p1[1], p2[1], p3[1], p4[1]);
this.maxX = Math.max(this.maxX, p1[0], p2[0], p3[0], p4[0]);
this.maxY = Math.max(this.maxY, p1[1], p2[1], p3[1], p4[1]);
}
updateScalingPathMinMax(transform, minMax) {
Util.scaleMinMax(transform, minMax);
this.minX = Math.min(this.minX, minMax[0]);
this.minY = Math.min(this.minY, minMax[1]);
this.maxX = Math.max(this.maxX, minMax[2]);
this.maxY = Math.max(this.maxY, minMax[3]);
}
updateCurvePathMinMax(transform, x0, y0, x1, y1, x2, y2, x3, y3, minMax) {
const box = Util.bezierBoundingBox(x0, y0, x1, y1, x2, y2, x3, y3, minMax);
if (minMax) {
return;
}
this.updateRectMinMax(transform, box);
}
getPathBoundingBox(pathType = PathType.FILL, transform = null) {
const box = [this.minX, this.minY, this.maxX, this.maxY];
if (pathType === PathType.STROKE) {
if (!transform) {
unreachable("Stroke bounding box must include transform.");
}
const scale = Util.singularValueDecompose2dScale(transform);
const xStrokePad = scale[0] * this.lineWidth / 2;
const yStrokePad = scale[1] * this.lineWidth / 2;
box[0] -= xStrokePad;
box[1] -= yStrokePad;
box[2] += xStrokePad;
box[3] += yStrokePad;
}
return box;
}
updateClipFromPath() {
const intersect = Util.intersect(this.clipBox, this.getPathBoundingBox());
this.startNewPathAndClipBox(intersect || [0, 0, 0, 0]);
}
isEmptyClip() {
return this.minX === Infinity;
}
startNewPathAndClipBox(box) {
this.clipBox = box;
this.minX = Infinity;
this.minY = Infinity;
this.maxX = 0;
this.maxY = 0;
}
getClippedPathBoundingBox(pathType = PathType.FILL, transform = null) {
return Util.intersect(this.clipBox, this.getPathBoundingBox(pathType, transform));
}
};
function putBinaryImageData(ctx, imgData) {
if (typeof ImageData !== "undefined" && imgData instanceof ImageData) {
ctx.putImageData(imgData, 0, 0);
return;
}
const height = imgData.height, width = imgData.width;
const partialChunkHeight = height % FULL_CHUNK_HEIGHT;
const fullChunks = (height - partialChunkHeight) / FULL_CHUNK_HEIGHT;
const totalChunks = partialChunkHeight === 0 ? fullChunks : fullChunks + 1;
const chunkImgData = ctx.createImageData(width, FULL_CHUNK_HEIGHT);
let srcPos = 0, destPos;
const src = imgData.data;
const dest = chunkImgData.data;
let i, j, thisChunkHeight, elemsInThisChunk;
if (imgData.kind === util_ImageKind.GRAYSCALE_1BPP) {
const srcLength = src.byteLength;
const dest32 = new Uint32Array(dest.buffer, 0, dest.byteLength >> 2);
const dest32DataLength = dest32.length;
const fullSrcDiff = width + 7 >> 3;
const white = 4294967295;
const black = util_FeatureTest.isLittleEndian ? 4278190080 : 255;
for (i = 0; i < totalChunks; i++) {
thisChunkHeight = i < fullChunks ? FULL_CHUNK_HEIGHT : partialChunkHeight;
destPos = 0;
for (j = 0; j < thisChunkHeight; j++) {
const srcDiff = srcLength - srcPos;
let k = 0;
const kEnd = srcDiff > fullSrcDiff ? width : srcDiff * 8 - 7;
const kEndUnrolled = kEnd & ~7;
let mask = 0;
let srcByte = 0;
for (; k < kEndUnrolled; k += 8) {
srcByte = src[srcPos++];
dest32[destPos++] = srcByte & 128 ? white : black;
dest32[destPos++] = srcByte & 64 ? white : black;
dest32[destPos++] = srcByte & 32 ? white : black;
dest32[destPos++] = srcByte & 16 ? white : black;
dest32[destPos++] = srcByte & 8 ? white : black;
dest32[destPos++] = srcByte & 4 ? white : black;
dest32[destPos++] = srcByte & 2 ? white : black;
dest32[destPos++] = srcByte & 1 ? white : black;
}
for (; k < kEnd; k++) {
if (mask === 0) {
srcByte = src[srcPos++];
mask = 128;
}
dest32[destPos++] = srcByte & mask ? white : black;
mask >>= 1;
}
}
while (destPos < dest32DataLength) {
dest32[destPos++] = 0;
}
ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT);
}
} else if (imgData.kind === util_ImageKind.RGBA_32BPP) {
j = 0;
elemsInThisChunk = width * FULL_CHUNK_HEIGHT * 4;
for (i = 0; i < fullChunks; i++) {
dest.set(src.subarray(srcPos, srcPos + elemsInThisChunk));
srcPos += elemsInThisChunk;
ctx.putImageData(chunkImgData, 0, j);
j += FULL_CHUNK_HEIGHT;
}
if (i < totalChunks) {
elemsInThisChunk = width * partialChunkHeight * 4;
dest.set(src.subarray(srcPos, srcPos + elemsInThisChunk));
ctx.putImageData(chunkImgData, 0, j);
}
} else if (imgData.kind === util_ImageKind.RGB_24BPP) {
thisChunkHeight = FULL_CHUNK_HEIGHT;
elemsInThisChunk = width * thisChunkHeight;
for (i = 0; i < totalChunks; i++) {
if (i >= fullChunks) {
thisChunkHeight = partialChunkHeight;
elemsInThisChunk = width * thisChunkHeight;
}
destPos = 0;
for (j = elemsInThisChunk; j--; ) {
dest[destPos++] = src[srcPos++];
dest[destPos++] = src[srcPos++];
dest[destPos++] = src[srcPos++];
dest[destPos++] = 255;
}
ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT);
}
} else {
throw new Error(`bad image kind: ${imgData.kind}`);
}
}
function putBinaryImageMask(ctx, imgData) {
if (imgData.bitmap) {
ctx.drawImage(imgData.bitmap, 0, 0);
return;
}
const height = imgData.height, width = imgData.width;
const partialChunkHeight = height % FULL_CHUNK_HEIGHT;
const fullChunks = (height - partialChunkHeight) / FULL_CHUNK_HEIGHT;
const totalChunks = partialChunkHeight === 0 ? fullChunks : fullChunks + 1;
const chunkImgData = ctx.createImageData(width, FULL_CHUNK_HEIGHT);
let srcPos = 0;
const src = imgData.data;
const dest = chunkImgData.data;
for (let i = 0; i < totalChunks; i++) {
const thisChunkHeight = i < fullChunks ? FULL_CHUNK_HEIGHT : partialChunkHeight;
({
srcPos
} = convertBlackAndWhiteToRGBA({
src,
srcPos,
dest,
width,
height: thisChunkHeight,
nonBlackColor: 0
}));
ctx.putImageData(chunkImgData, 0, i * FULL_CHUNK_HEIGHT);
}
}
function copyCtxState(sourceCtx, destCtx) {
const properties = ["strokeStyle", "fillStyle", "fillRule", "globalAlpha", "lineWidth", "lineCap", "lineJoin", "miterLimit", "globalCompositeOperation", "font", "filter"];
for (const property of properties) {
if (sourceCtx[property] !== void 0) {
destCtx[property] = sourceCtx[property];
}
}
if (sourceCtx.setLineDash !== void 0) {
destCtx.setLineDash(sourceCtx.getLineDash());
destCtx.lineDashOffset = sourceCtx.lineDashOffset;
}
}
function resetCtxToDefault(ctx) {
ctx.strokeStyle = ctx.fillStyle = "#000000";
ctx.fillRule = "nonzero";
ctx.globalAlpha = 1;
ctx.lineWidth = 1;
ctx.lineCap = "butt";
ctx.lineJoin = "miter";
ctx.miterLimit = 10;
ctx.globalCompositeOperation = "source-over";
ctx.font = "10px sans-serif";
if (ctx.setLineDash !== void 0) {
ctx.setLineDash([]);
ctx.lineDashOffset = 0;
}
if (!isNodeJS) {
const {
filter
} = ctx;
if (filter !== "none" && filter !== "") {
ctx.filter = "none";
}
}
}
function getImageSmoothingEnabled(transform, interpolate) {
if (interpolate) {
return true;
}
const scale = Util.singularValueDecompose2dScale(transform);
scale[0] = Math.fround(scale[0]);
scale[1] = Math.fround(scale[1]);
const actualScale = Math.fround((globalThis.devicePixelRatio || 1) * PixelsPerInch.PDF_TO_CSS_UNITS);
return scale[0] <= actualScale && scale[1] <= actualScale;
}
var LINE_CAP_STYLES = ["butt", "round", "square"];
var LINE_JOIN_STYLES = ["miter", "round", "bevel"];
var NORMAL_CLIP = {};
var EO_CLIP = {};
var _restoreInitialState, restoreInitialState_fn, _drawFilter, drawFilter_fn;
var _CanvasGraphics = class {
constructor(canvasCtx, commonObjs, objs, canvasFactory, filterFactory, {
optionalContentConfig,
markedContentStack = null
}, annotationCanvasMap, pageColors) {
__privateAdd(this, _restoreInitialState);
__privateAdd(this, _drawFilter);
this.ctx = canvasCtx;
this.current = new CanvasExtraState(this.ctx.canvas.width, this.ctx.canvas.height);
this.stateStack = [];
this.pendingClip = null;
this.pendingEOFill = false;
this.res = null;
this.xobjs = null;
this.commonObjs = commonObjs;
this.objs = objs;
this.canvasFactory = canvasFactory;
this.filterFactory = filterFactory;
this.groupStack = [];
this.processingType3 = null;
this.baseTransform = null;
this.baseTransformStack = [];
this.groupLevel = 0;
this.smaskStack = [];
this.smaskCounter = 0;
this.tempSMask = null;
this.suspendedCtx = null;
this.contentVisible = true;
this.markedContentStack = markedContentStack || [];
this.optionalContentConfig = optionalContentConfig;
this.cachedCanvases = new CachedCanvases(this.canvasFactory);
this.cachedPatterns = /* @__PURE__ */ new Map();
this.annotationCanvasMap = annotationCanvasMap;
this.viewportScale = 1;
this.outputScaleX = 1;
this.outputScaleY = 1;
this.pageColors = pageColors;
this._cachedScaleForStroking = [-1, 0];
this._cachedGetSinglePixelWidth = null;
this._cachedBitmapsMap = /* @__PURE__ */ new Map();
}
getObject(data, fallback = null) {
if (typeof data === "string") {
return data.startsWith("g_") ? this.commonObjs.get(data) : this.objs.get(data);
}
return fallback;
}
beginDrawing({
transform,
viewport,
transparency = false,
background = null
}) {
const width = this.ctx.canvas.width;
const height = this.ctx.canvas.height;
const savedFillStyle = this.ctx.fillStyle;
this.ctx.fillStyle = background || "#ffffff";
this.ctx.fillRect(0, 0, width, height);
this.ctx.fillStyle = savedFillStyle;
if (transparency) {
const transparentCanvas = this.cachedCanvases.getCanvas("transparent", width, height);
this.compositeCtx = this.ctx;
this.transparentCanvas = transparentCanvas.canvas;
this.ctx = transparentCanvas.context;
this.ctx.save();
this.ctx.transform(...getCurrentTransform(this.compositeCtx));
}
this.ctx.save();
resetCtxToDefault(this.ctx);
if (transform) {
this.ctx.transform(...transform);
this.outputScaleX = transform[0];
this.outputScaleY = transform[0];
}
this.ctx.transform(...viewport.transform);
this.viewportScale = viewport.scale;
this.baseTransform = getCurrentTransform(this.ctx);
}
executeOperatorList(operatorList, executionStartIdx, continueCallback, stepper) {
const argsArray = operatorList.argsArray;
const fnArray = operatorList.fnArray;
let i = executionStartIdx || 0;
const argsArrayLen = argsArray.length;
if (argsArrayLen === i) {
return i;
}
const chunkOperations = argsArrayLen - i > EXECUTION_STEPS && typeof continueCallback === "function";
const endTime = chunkOperations ? Date.now() + EXECUTION_TIME : 0;
let steps = 0;
const commonObjs = this.commonObjs;
const objs = this.objs;
let fnId;
while (true) {
if (stepper !== void 0 && i === stepper.nextBreakPoint) {
stepper.breakIt(i, continueCallback);
return i;
}
fnId = fnArray[i];
if (fnId !== OPS.dependency) {
this[fnId].apply(this, argsArray[i]);
} else {
for (const depObjId of argsArray[i]) {
const objsPool = depObjId.startsWith("g_") ? commonObjs : objs;
if (!objsPool.has(depObjId)) {
objsPool.get(depObjId, continueCallback);
return i;
}
}
}
i++;
if (i === argsArrayLen) {
return i;
}
if (chunkOperations && ++steps > EXECUTION_STEPS) {
if (Date.now() > endTime) {
continueCallback();
return i;
}
steps = 0;
}
}
}
endDrawing() {
__privateMethod(this, _restoreInitialState, restoreInitialState_fn).call(this);
this.cachedCanvases.clear();
this.cachedPatterns.clear();
for (const cache of this._cachedBitmapsMap.values()) {
for (const canvas of cache.values()) {
if (typeof HTMLCanvasElement !== "undefined" && canvas instanceof HTMLCanvasElement) {
canvas.width = canvas.height = 0;
}
}
cache.clear();
}
this._cachedBitmapsMap.clear();
__privateMethod(this, _drawFilter, drawFilter_fn).call(this);
}
_scaleImage(img, inverseTransform) {
const width = img.width;
const height = img.height;
let widthScale = Math.max(Math.hypot(inverseTransform[0], inverseTransform[1]), 1);
let heightScale = Math.max(Math.hypot(inverseTransform[2], inverseTransform[3]), 1);
let paintWidth = width, paintHeight = height;
let tmpCanvasId = "prescale1";
let tmpCanvas, tmpCtx;
while (widthScale > 2 && paintWidth > 1 || heightScale > 2 && paintHeight > 1) {
let newWidth = paintWidth, newHeight = paintHeight;
if (widthScale > 2 && paintWidth > 1) {
newWidth = paintWidth >= 16384 ? Math.floor(paintWidth / 2) - 1 || 1 : Math.ceil(paintWidth / 2);
widthScale /= paintWidth / newWidth;
}
if (heightScale > 2 && paintHeight > 1) {
newHeight = paintHeight >= 16384 ? Math.floor(paintHeight / 2) - 1 || 1 : Math.ceil(paintHeight) / 2;
heightScale /= paintHeight / newHeight;
}
tmpCanvas = this.cachedCanvases.getCanvas(tmpCanvasId, newWidth, newHeight);
tmpCtx = tmpCanvas.context;
tmpCtx.clearRect(0, 0, newWidth, newHeight);
tmpCtx.drawImage(img, 0, 0, paintWidth, paintHeight, 0, 0, newWidth, newHeight);
img = tmpCanvas.canvas;
paintWidth = newWidth;
paintHeight = newHeight;
tmpCanvasId = tmpCanvasId === "prescale1" ? "prescale2" : "prescale1";
}
return {
img,
paintWidth,
paintHeight
};
}
_createMaskCanvas(img) {
const ctx = this.ctx;
const {
width,
height
} = img;
const fillColor = this.current.fillColor;
const isPatternFill = this.current.patternFill;
const currentTransform = getCurrentTransform(ctx);
let cache, cacheKey, scaled, maskCanvas;
if ((img.bitmap || img.data) && img.count > 1) {
const mainKey = img.bitmap || img.data.buffer;
cacheKey = JSON.stringify(isPatternFill ? currentTransform : [currentTransform.slice(0, 4), fillColor]);
cache = this._cachedBitmapsMap.get(mainKey);
if (!cache) {
cache = /* @__PURE__ */ new Map();
this._cachedBitmapsMap.set(mainKey, cache);
}
const cachedImage = cache.get(cacheKey);
if (cachedImage && !isPatternFill) {
const offsetX2 = Math.round(Math.min(currentTransform[0], currentTransform[2]) + currentTransform[4]);
const offsetY2 = Math.round(Math.min(currentTransform[1], currentTransform[3]) + currentTransform[5]);
return {
canvas: cachedImage,
offsetX: offsetX2,
offsetY: offsetY2
};
}
scaled = cachedImage;
}
if (!scaled) {
maskCanvas = this.cachedCanvases.getCanvas("maskCanvas", width, height);
putBinaryImageMask(maskCanvas.context, img);
}
let maskToCanvas = Util.transform(currentTransform, [1 / width, 0, 0, -1 / height, 0, 0]);
maskToCanvas = Util.transform(maskToCanvas, [1, 0, 0, 1, 0, -height]);
const [minX, minY, maxX, maxY] = Util.getAxialAlignedBoundingBox([0, 0, width, height], maskToCanvas);
const drawnWidth = Math.round(maxX - minX) || 1;
const drawnHeight = Math.round(maxY - minY) || 1;
const fillCanvas = this.cachedCanvases.getCanvas("fillCanvas", drawnWidth, drawnHeight);
const fillCtx = fillCanvas.context;
const offsetX = minX;
const offsetY = minY;
fillCtx.translate(-offsetX, -offsetY);
fillCtx.transform(...maskToCanvas);
if (!scaled) {
scaled = this._scaleImage(maskCanvas.canvas, getCurrentTransformInverse(fillCtx));
scaled = scaled.img;
if (cache && isPatternFill) {
cache.set(cacheKey, scaled);
}
}
fillCtx.imageSmoothingEnabled = getImageSmoothingEnabled(getCurrentTransform(fillCtx), img.interpolate);
drawImageAtIntegerCoords(fillCtx, scaled, 0, 0, scaled.width, scaled.height, 0, 0, width, height);
fillCtx.globalCompositeOperation = "source-in";
const inverse = Util.transform(getCurrentTransformInverse(fillCtx), [1, 0, 0, 1, -offsetX, -offsetY]);
fillCtx.fillStyle = isPatternFill ? fillColor.getPattern(ctx, this, inverse, PathType.FILL) : fillColor;
fillCtx.fillRect(0, 0, width, height);
if (cache && !isPatternFill) {
this.cachedCanvases.delete("fillCanvas");
cache.set(cacheKey, fillCanvas.canvas);
}
return {
canvas: fillCanvas.canvas,
offsetX: Math.round(offsetX),
offsetY: Math.round(offsetY)
};
}
setLineWidth(width) {
if (width !== this.current.lineWidth) {
this._cachedScaleForStroking[0] = -1;
}
this.current.lineWidth = width;
this.ctx.lineWidth = width;
}
setLineCap(style) {
this.ctx.lineCap = LINE_CAP_STYLES[style];
}
setLineJoin(style) {
this.ctx.lineJoin = LINE_JOIN_STYLES[style];
}
setMiterLimit(limit) {
this.ctx.miterLimit = limit;
}
setDash(dashArray, dashPhase) {
const ctx = this.ctx;
if (ctx.setLineDash !== void 0) {
ctx.setLineDash(dashArray);
ctx.lineDashOffset = dashPhase;
}
}
setRenderingIntent(intent) {
}
setFlatness(flatness) {
}
setGState(states) {
for (const [key, value] of states) {
switch (key) {
case "LW":
this.setLineWidth(value);
break;
case "LC":
this.setLineCap(value);
break;
case "LJ":
this.setLineJoin(value);
break;
case "ML":
this.setMiterLimit(value);
break;
case "D":
this.setDash(value[0], value[1]);
break;
case "RI":
this.setRenderingIntent(value);
break;
case "FL":
this.setFlatness(value);
break;
case "Font":
this.setFont(value[0], value[1]);
break;
case "CA":
this.current.strokeAlpha = value;
break;
case "ca":
this.current.fillAlpha = value;
this.ctx.globalAlpha = value;
break;
case "BM":
this.ctx.globalCompositeOperation = value;
break;
case "SMask":
this.current.activeSMask = value ? this.tempSMask : null;
this.tempSMask = null;
this.checkSMaskState();
break;
case "TR":
this.ctx.filter = this.current.transferMaps = this.filterFactory.addFilter(value);
break;
}
}
}
get inSMaskMode() {
return !!this.suspendedCtx;
}
checkSMaskState() {
const inSMaskMode = this.inSMaskMode;
if (this.current.activeSMask && !inSMaskMode) {
this.beginSMaskMode();
} else if (!this.current.activeSMask && inSMaskMode) {
this.endSMaskMode();
}
}
beginSMaskMode() {
if (this.inSMaskMode) {
throw new Error("beginSMaskMode called while already in smask mode");
}
const drawnWidth = this.ctx.canvas.width;
const drawnHeight = this.ctx.canvas.height;
const cacheId = "smaskGroupAt" + this.groupLevel;
const scratchCanvas = this.cachedCanvases.getCanvas(cacheId, drawnWidth, drawnHeight);
this.suspendedCtx = this.ctx;
this.ctx = scratchCanvas.context;
const ctx = this.ctx;
ctx.setTransform(...getCurrentTransform(this.suspendedCtx));
copyCtxState(this.suspendedCtx, ctx);
mirrorContextOperations(ctx, this.suspendedCtx);
this.setGState([["BM", "source-over"], ["ca", 1], ["CA", 1]]);
}
endSMaskMode() {
if (!this.inSMaskMode) {
throw new Error("endSMaskMode called while not in smask mode");
}
this.ctx._removeMirroring();
copyCtxState(this.ctx, this.suspendedCtx);
this.ctx = this.suspendedCtx;
this.suspendedCtx = null;
}
compose(dirtyBox) {
if (!this.current.activeSMask) {
return;
}
if (!dirtyBox) {
dirtyBox = [0, 0, this.ctx.canvas.width, this.ctx.canvas.height];
} else {
dirtyBox[0] = Math.floor(dirtyBox[0]);
dirtyBox[1] = Math.floor(dirtyBox[1]);
dirtyBox[2] = Math.ceil(dirtyBox[2]);
dirtyBox[3] = Math.ceil(dirtyBox[3]);
}
const smask = this.current.activeSMask;
const suspendedCtx = this.suspendedCtx;
this.composeSMask(suspendedCtx, smask, this.ctx, dirtyBox);
this.ctx.save();
this.ctx.setTransform(1, 0, 0, 1, 0, 0);
this.ctx.clearRect(0, 0, this.ctx.canvas.width, this.ctx.canvas.height);
this.ctx.restore();
}
composeSMask(ctx, smask, layerCtx, layerBox) {
const layerOffsetX = layerBox[0];
const layerOffsetY = layerBox[1];
const layerWidth = layerBox[2] - layerOffsetX;
const layerHeight = layerBox[3] - layerOffsetY;
if (layerWidth === 0 || layerHeight === 0) {
return;
}
this.genericComposeSMask(smask.context, layerCtx, layerWidth, layerHeight, smask.subtype, smask.backdrop, smask.transferMap, layerOffsetX, layerOffsetY, smask.offsetX, smask.offsetY);
ctx.save();
ctx.globalAlpha = 1;
ctx.globalCompositeOperation = "source-over";
ctx.setTransform(1, 0, 0, 1, 0, 0);
ctx.drawImage(layerCtx.canvas, 0, 0);
ctx.restore();
}
genericComposeSMask(maskCtx, layerCtx, width, height, subtype, backdrop, transferMap, layerOffsetX, layerOffsetY, maskOffsetX, maskOffsetY) {
let maskCanvas = maskCtx.canvas;
let maskX = layerOffsetX - maskOffsetX;
let maskY = layerOffsetY - maskOffsetY;
if (backdrop) {
if (maskX < 0 || maskY < 0 || maskX + width > maskCanvas.width || maskY + height > maskCanvas.height) {
const canvas = this.cachedCanvases.getCanvas("maskExtension", width, height);
const ctx = canvas.context;
ctx.drawImage(maskCanvas, -maskX, -maskY);
if (backdrop.some((c) => c !== 0)) {
ctx.globalCompositeOperation = "destination-atop";
ctx.fillStyle = Util.makeHexColor(...backdrop);
ctx.fillRect(0, 0, width, height);
ctx.globalCompositeOperation = "source-over";
}
maskCanvas = canvas.canvas;
maskX = maskY = 0;
} else if (backdrop.some((c) => c !== 0)) {
maskCtx.save();
maskCtx.globalAlpha = 1;
maskCtx.setTransform(1, 0, 0, 1, 0, 0);
const clip2 = new Path2D();
clip2.rect(maskX, maskY, width, height);
maskCtx.clip(clip2);
maskCtx.globalCompositeOperation = "destination-atop";
maskCtx.fillStyle = Util.makeHexColor(...backdrop);
maskCtx.fillRect(maskX, maskY, width, height);
maskCtx.restore();
}
}
layerCtx.save();
layerCtx.globalAlpha = 1;
layerCtx.setTransform(1, 0, 0, 1, 0, 0);
if (subtype === "Alpha" && transferMap) {
layerCtx.filter = this.filterFactory.addAlphaFilter(transferMap);
} else if (subtype === "Luminosity") {
layerCtx.filter = this.filterFactory.addLuminosityFilter(transferMap);
}
const clip = new Path2D();
clip.rect(layerOffsetX, layerOffsetY, width, height);
layerCtx.clip(clip);
layerCtx.globalCompositeOperation = "destination-in";
layerCtx.drawImage(maskCanvas, maskX, maskY, width, height, layerOffsetX, layerOffsetY, width, height);
layerCtx.restore();
}
save() {
if (this.inSMaskMode) {
copyCtxState(this.ctx, this.suspendedCtx);
this.suspendedCtx.save();
} else {
this.ctx.save();
}
const old = this.current;
this.stateStack.push(old);
this.current = old.clone();
}
restore() {
if (this.stateStack.length === 0 && this.inSMaskMode) {
this.endSMaskMode();
}
if (this.stateStack.length !== 0) {
this.current = this.stateStack.pop();
if (this.inSMaskMode) {
this.suspendedCtx.restore();
copyCtxState(this.suspendedCtx, this.ctx);
} else {
this.ctx.restore();
}
this.checkSMaskState();
this.pendingClip = null;
this._cachedScaleForStroking[0] = -1;
this._cachedGetSinglePixelWidth = null;
}
}
transform(a, b, c, d, e, f) {
this.ctx.transform(a, b, c, d, e, f);
this._cachedScaleForStroking[0] = -1;
this._cachedGetSinglePixelWidth = null;
}
constructPath(ops, args, minMax) {
const ctx = this.ctx;
const current = this.current;
let x = current.x, y = current.y;
let startX, startY;
const currentTransform = getCurrentTransform(ctx);
const isScalingMatrix = currentTransform[0] === 0 && currentTransform[3] === 0 || currentTransform[1] === 0 && currentTransform[2] === 0;
const minMaxForBezier = isScalingMatrix ? minMax.slice(0) : null;
for (let i = 0, j = 0, ii = ops.length; i < ii; i++) {
switch (ops[i] | 0) {
case OPS.rectangle:
x = args[j++];
y = args[j++];
const width = args[j++];
const height = args[j++];
const xw = x + width;
const yh = y + height;
ctx.moveTo(x, y);
if (width === 0 || height === 0) {
ctx.lineTo(xw, yh);
} else {
ctx.lineTo(xw, y);
ctx.lineTo(xw, yh);
ctx.lineTo(x, yh);
}
if (!isScalingMatrix) {
current.updateRectMinMax(currentTransform, [x, y, xw, yh]);
}
ctx.closePath();
break;
case OPS.moveTo:
x = args[j++];
y = args[j++];
ctx.moveTo(x, y);
if (!isScalingMatrix) {
current.updatePathMinMax(currentTransform, x, y);
}
break;
case OPS.lineTo:
x = args[j++];
y = args[j++];
ctx.lineTo(x, y);
if (!isScalingMatrix) {
current.updatePathMinMax(currentTransform, x, y);
}
break;
case OPS.curveTo:
startX = x;
startY = y;
x = args[j + 4];
y = args[j + 5];
ctx.bezierCurveTo(args[j], args[j + 1], args[j + 2], args[j + 3], x, y);
current.updateCurvePathMinMax(currentTransform, startX, startY, args[j], args[j + 1], args[j + 2], args[j + 3], x, y, minMaxForBezier);
j += 6;
break;
case OPS.curveTo2:
startX = x;
startY = y;
ctx.bezierCurveTo(x, y, args[j], args[j + 1], args[j + 2], args[j + 3]);
current.updateCurvePathMinMax(currentTransform, startX, startY, x, y, args[j], args[j + 1], args[j + 2], args[j + 3], minMaxForBezier);
x = args[j + 2];
y = args[j + 3];
j += 4;
break;
case OPS.curveTo3:
startX = x;
startY = y;
x = args[j + 2];
y = args[j + 3];
ctx.bezierCurveTo(args[j], args[j + 1], x, y, x, y);
current.updateCurvePathMinMax(currentTransform, startX, startY, args[j], args[j + 1], x, y, x, y, minMaxForBezier);
j += 4;
break;
case OPS.closePath:
ctx.closePath();
break;
}
}
if (isScalingMatrix) {
current.updateScalingPathMinMax(currentTransform, minMaxForBezier);
}
current.setCurrentPoint(x, y);
}
closePath() {
this.ctx.closePath();
}
stroke(consumePath = true) {
const ctx = this.ctx;
const strokeColor = this.current.strokeColor;
ctx.globalAlpha = this.current.strokeAlpha;
if (this.contentVisible) {
if (typeof strokeColor === "object" && (strokeColor == null ? void 0 : strokeColor.getPattern)) {
ctx.save();
ctx.strokeStyle = strokeColor.getPattern(ctx, this, getCurrentTransformInverse(ctx), PathType.STROKE);
this.rescaleAndStroke(false);
ctx.restore();
} else {
this.rescaleAndStroke(true);
}
}
if (consumePath) {
this.consumePath(this.current.getClippedPathBoundingBox());
}
ctx.globalAlpha = this.current.fillAlpha;
}
closeStroke() {
this.closePath();
this.stroke();
}
fill(consumePath = true) {
const ctx = this.ctx;
const fillColor = this.current.fillColor;
const isPatternFill = this.current.patternFill;
let needRestore = false;
if (isPatternFill) {
ctx.save();
ctx.fillStyle = fillColor.getPattern(ctx, this, getCurrentTransformInverse(ctx), PathType.FILL);
needRestore = true;
}
const intersect = this.current.getClippedPathBoundingBox();
if (this.contentVisible && intersect !== null) {
if (this.pendingEOFill) {
ctx.fill("evenodd");
this.pendingEOFill = false;
} else {
ctx.fill();
}
}
if (needRestore) {
ctx.restore();
}
if (consumePath) {
this.consumePath(intersect);
}
}
eoFill() {
this.pendingEOFill = true;
this.fill();
}
fillStroke() {
this.fill(false);
this.stroke(false);
this.consumePath();
}
eoFillStroke() {
this.pendingEOFill = true;
this.fillStroke();
}
closeFillStroke() {
this.closePath();
this.fillStroke();
}
closeEOFillStroke() {
this.pendingEOFill = true;
this.closePath();
this.fillStroke();
}
endPath() {
this.consumePath();
}
clip() {
this.pendingClip = NORMAL_CLIP;
}
eoClip() {
this.pendingClip = EO_CLIP;
}
beginText() {
this.current.textMatrix = IDENTITY_MATRIX;
this.current.textMatrixScale = 1;
this.current.x = this.current.lineX = 0;
this.current.y = this.current.lineY = 0;
}
endText() {
const paths = this.pendingTextPaths;
const ctx = this.ctx;
if (paths === void 0) {
ctx.beginPath();
return;
}
ctx.save();
ctx.beginPath();
for (const path of paths) {
ctx.setTransform(...path.transform);
ctx.translate(path.x, path.y);
path.addToPath(ctx, path.fontSize);
}
ctx.restore();
ctx.clip();
ctx.beginPath();
delete this.pendingTextPaths;
}
setCharSpacing(spacing) {
this.current.charSpacing = spacing;
}
setWordSpacing(spacing) {
this.current.wordSpacing = spacing;
}
setHScale(scale) {
this.current.textHScale = scale / 100;
}
setLeading(leading) {
this.current.leading = -leading;
}
setFont(fontRefName, size) {
var _a2;
const fontObj = this.commonObjs.get(fontRefName);
const current = this.current;
if (!fontObj) {
throw new Error(`Can't find font for ${fontRefName}`);
}
current.fontMatrix = fontObj.fontMatrix || FONT_IDENTITY_MATRIX;
if (current.fontMatrix[0] === 0 || current.fontMatrix[3] === 0) {
warn("Invalid font matrix for font " + fontRefName);
}
if (size < 0) {
size = -size;
current.fontDirection = -1;
} else {
current.fontDirection = 1;
}
this.current.font = fontObj;
this.current.fontSize = size;
if (fontObj.isType3Font) {
return;
}
const name = fontObj.loadedName || "sans-serif";
const typeface = ((_a2 = fontObj.systemFontInfo) == null ? void 0 : _a2.css) || `"${name}", ${fontObj.fallbackName}`;
let bold = "normal";
if (fontObj.black) {
bold = "900";
} else if (fontObj.bold) {
bold = "bold";
}
const italic = fontObj.italic ? "italic" : "normal";
let browserFontSize = size;
if (size < MIN_FONT_SIZE) {
browserFontSize = MIN_FONT_SIZE;
} else if (size > MAX_FONT_SIZE) {
browserFontSize = MAX_FONT_SIZE;
}
this.current.fontSizeScale = size / browserFontSize;
this.ctx.font = `${italic} ${bold} ${browserFontSize}px ${typeface}`;
}
setTextRenderingMode(mode) {
this.current.textRenderingMode = mode;
}
setTextRise(rise) {
this.current.textRise = rise;
}
moveText(x, y) {
this.current.x = this.current.lineX += x;
this.current.y = this.current.lineY += y;
}
setLeadingMoveText(x, y) {
this.setLeading(-y);
this.moveText(x, y);
}
setTextMatrix(a, b, c, d, e, f) {
this.current.textMatrix = [a, b, c, d, e, f];
this.current.textMatrixScale = Math.hypot(a, b);
this.current.x = this.current.lineX = 0;
this.current.y = this.current.lineY = 0;
}
nextLine() {
this.moveText(0, this.current.leading);
}
paintChar(character, x, y, patternTransform) {
const ctx = this.ctx;
const current = this.current;
const font = current.font;
const textRenderingMode = current.textRenderingMode;
const fontSize = current.fontSize / current.fontSizeScale;
const fillStrokeMode = textRenderingMode & TextRenderingMode.FILL_STROKE_MASK;
const isAddToPathSet = !!(textRenderingMode & TextRenderingMode.ADD_TO_PATH_FLAG);
const patternFill = current.patternFill && !font.missingFile;
let addToPath;
if (font.disableFontFace || isAddToPathSet || patternFill) {
addToPath = font.getPathGenerator(this.commonObjs, character);
}
if (font.disableFontFace || patternFill) {
ctx.save();
ctx.translate(x, y);
ctx.beginPath();
addToPath(ctx, fontSize);
if (patternTransform) {
ctx.setTransform(...patternTransform);
}
if (fillStrokeMode === TextRenderingMode.FILL || fillStrokeMode === TextRenderingMode.FILL_STROKE) {
ctx.fill();
}
if (fillStrokeMode === TextRenderingMode.STROKE || fillStrokeMode === TextRenderingMode.FILL_STROKE) {
ctx.stroke();
}
ctx.restore();
} else {
if (fillStrokeMode === TextRenderingMode.FILL || fillStrokeMode === TextRenderingMode.FILL_STROKE) {
ctx.fillText(character, x, y);
}
if (fillStrokeMode === TextRenderingMode.STROKE || fillStrokeMode === TextRenderingMode.FILL_STROKE) {
ctx.strokeText(character, x, y);
}
}
if (isAddToPathSet) {
const paths = this.pendingTextPaths || (this.pendingTextPaths = []);
paths.push({
transform: getCurrentTransform(ctx),
x,
y,
fontSize,
addToPath
});
}
}
get isFontSubpixelAAEnabled() {
const {
context: ctx
} = this.cachedCanvases.getCanvas("isFontSubpixelAAEnabled", 10, 10);
ctx.scale(1.5, 1);
ctx.fillText("I", 0, 10);
const data = ctx.getImageData(0, 0, 10, 10).data;
let enabled = false;
for (let i = 3; i < data.length; i += 4) {
if (data[i] > 0 && data[i] < 255) {
enabled = true;
break;
}
}
return shadow(this, "isFontSubpixelAAEnabled", enabled);
}
showText(glyphs) {
const current = this.current;
const font = current.font;
if (font.isType3Font) {
return this.showType3Text(glyphs);
}
const fontSize = current.fontSize;
if (fontSize === 0) {
return void 0;
}
const ctx = this.ctx;
const fontSizeScale = current.fontSizeScale;
const charSpacing = current.charSpacing;
const wordSpacing = current.wordSpacing;
const fontDirection = current.fontDirection;
const textHScale = current.textHScale * fontDirection;
const glyphsLength = glyphs.length;
const vertical = font.vertical;
const spacingDir = vertical ? 1 : -1;
const defaultVMetrics = font.defaultVMetrics;
const widthAdvanceScale = fontSize * current.fontMatrix[0];
const simpleFillText = current.textRenderingMode === TextRenderingMode.FILL && !font.disableFontFace && !current.patternFill;
ctx.save();
ctx.transform(...current.textMatrix);
ctx.translate(current.x, current.y + current.textRise);
if (fontDirection > 0) {
ctx.scale(textHScale, -1);
} else {
ctx.scale(textHScale, 1);
}
let patternTransform;
if (current.patternFill) {
ctx.save();
const pattern = current.fillColor.getPattern(ctx, this, getCurrentTransformInverse(ctx), PathType.FILL);
patternTransform = getCurrentTransform(ctx);
ctx.restore();
ctx.fillStyle = pattern;
}
let lineWidth = current.lineWidth;
const scale = current.textMatrixScale;
if (scale === 0 || lineWidth === 0) {
const fillStrokeMode = current.textRenderingMode & TextRenderingMode.FILL_STROKE_MASK;
if (fillStrokeMode === TextRenderingMode.STROKE || fillStrokeMode === TextRenderingMode.FILL_STROKE) {
lineWidth = this.getSinglePixelWidth();
}
} else {
lineWidth /= scale;
}
if (fontSizeScale !== 1) {
ctx.scale(fontSizeScale, fontSizeScale);
lineWidth /= fontSizeScale;
}
ctx.lineWidth = lineWidth;
if (font.isInvalidPDFjsFont) {
const chars = [];
let width = 0;
for (const glyph of glyphs) {
chars.push(glyph.unicode);
width += glyph.width;
}
ctx.fillText(chars.join(""), 0, 0);
current.x += width * widthAdvanceScale * textHScale;
ctx.restore();
this.compose();
return void 0;
}
let x = 0, i;
for (i = 0; i < glyphsLength; ++i) {
const glyph = glyphs[i];
if (typeof glyph === "number") {
x += spacingDir * glyph * fontSize / 1e3;
continue;
}
let restoreNeeded = false;
const spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing;
const character = glyph.fontChar;
const accent = glyph.accent;
let scaledX, scaledY;
let width = glyph.width;
if (vertical) {
const vmetric = glyph.vmetric || defaultVMetrics;
const vx = -(glyph.vmetric ? vmetric[1] : width * 0.5) * widthAdvanceScale;
const vy = vmetric[2] * widthAdvanceScale;
width = vmetric ? -vmetric[0] : width;
scaledX = vx / fontSizeScale;
scaledY = (x + vy) / fontSizeScale;
} else {
scaledX = x / fontSizeScale;
scaledY = 0;
}
if (font.remeasure && width > 0) {
const measuredWidth = ctx.measureText(character).width * 1e3 / fontSize * fontSizeScale;
if (width < measuredWidth && this.isFontSubpixelAAEnabled) {
const characterScaleX = width / measuredWidth;
restoreNeeded = true;
ctx.save();
ctx.scale(characterScaleX, 1);
scaledX /= characterScaleX;
} else if (width !== measuredWidth) {
scaledX += (width - measuredWidth) / 2e3 * fontSize / fontSizeScale;
}
}
if (this.contentVisible && (glyph.isInFont || font.missingFile)) {
if (simpleFillText && !accent) {
ctx.fillText(character, scaledX, scaledY);
} else {
this.paintChar(character, scaledX, scaledY, patternTransform);
if (accent) {
const scaledAccentX = scaledX + fontSize * accent.offset.x / fontSizeScale;
const scaledAccentY = scaledY - fontSize * accent.offset.y / fontSizeScale;
this.paintChar(accent.fontChar, scaledAccentX, scaledAccentY, patternTransform);
}
}
}
const charWidth = vertical ? width * widthAdvanceScale - spacing * fontDirection : width * widthAdvanceScale + spacing * fontDirection;
x += charWidth;
if (restoreNeeded) {
ctx.restore();
}
}
if (vertical) {
current.y -= x;
} else {
current.x += x * textHScale;
}
ctx.restore();
this.compose();
return void 0;
}
showType3Text(glyphs) {
const ctx = this.ctx;
const current = this.current;
const font = current.font;
const fontSize = current.fontSize;
const fontDirection = current.fontDirection;
const spacingDir = font.vertical ? 1 : -1;
const charSpacing = current.charSpacing;
const wordSpacing = current.wordSpacing;
const textHScale = current.textHScale * fontDirection;
const fontMatrix = current.fontMatrix || FONT_IDENTITY_MATRIX;
const glyphsLength = glyphs.length;
const isTextInvisible = current.textRenderingMode === TextRenderingMode.INVISIBLE;
let i, glyph, width, spacingLength;
if (isTextInvisible || fontSize === 0) {
return;
}
this._cachedScaleForStroking[0] = -1;
this._cachedGetSinglePixelWidth = null;
ctx.save();
ctx.transform(...current.textMatrix);
ctx.translate(current.x, current.y);
ctx.scale(textHScale, fontDirection);
for (i = 0; i < glyphsLength; ++i) {
glyph = glyphs[i];
if (typeof glyph === "number") {
spacingLength = spacingDir * glyph * fontSize / 1e3;
this.ctx.translate(spacingLength, 0);
current.x += spacingLength * textHScale;
continue;
}
const spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing;
const operatorList = font.charProcOperatorList[glyph.operatorListId];
if (!operatorList) {
warn(`Type3 character "${glyph.operatorListId}" is not available.`);
continue;
}
if (this.contentVisible) {
this.processingType3 = glyph;
this.save();
ctx.scale(fontSize, fontSize);
ctx.transform(...fontMatrix);
this.executeOperatorList(operatorList);
this.restore();
}
const transformed = Util.applyTransform([glyph.width, 0], fontMatrix);
width = transformed[0] * fontSize + spacing;
ctx.translate(width, 0);
current.x += width * textHScale;
}
ctx.restore();
this.processingType3 = null;
}
setCharWidth(xWidth, yWidth) {
}
setCharWidthAndBounds(xWidth, yWidth, llx, lly, urx, ury) {
this.ctx.rect(llx, lly, urx - llx, ury - lly);
this.ctx.clip();
this.endPath();
}
getColorN_Pattern(IR) {
let pattern;
if (IR[0] === "TilingPattern") {
const color2 = IR[1];
const baseTransform = this.baseTransform || getCurrentTransform(this.ctx);
const canvasGraphicsFactory = {
createCanvasGraphics: (ctx) => new _CanvasGraphics(ctx, this.commonObjs, this.objs, this.canvasFactory, this.filterFactory, {
optionalContentConfig: this.optionalContentConfig,
markedContentStack: this.markedContentStack
})
};
pattern = new TilingPattern(IR, color2, this.ctx, canvasGraphicsFactory, baseTransform);
} else {
pattern = this._getPattern(IR[1], IR[2]);
}
return pattern;
}
setStrokeColorN() {
this.current.strokeColor = this.getColorN_Pattern(arguments);
}
setFillColorN() {
this.current.fillColor = this.getColorN_Pattern(arguments);
this.current.patternFill = true;
}
setStrokeRGBColor(r, g, b) {
this.ctx.strokeStyle = this.current.strokeColor = Util.makeHexColor(r, g, b);
}
setStrokeTransparent() {
this.ctx.strokeStyle = this.current.strokeColor = "transparent";
}
setFillRGBColor(r, g, b) {
this.ctx.fillStyle = this.current.fillColor = Util.makeHexColor(r, g, b);
this.current.patternFill = false;
}
setFillTransparent() {
this.ctx.fillStyle = this.current.fillColor = "transparent";
this.current.patternFill = false;
}
_getPattern(objId, matrix = null) {
let pattern;
if (this.cachedPatterns.has(objId)) {
pattern = this.cachedPatterns.get(objId);
} else {
pattern = getShadingPattern(this.getObject(objId));
this.cachedPatterns.set(objId, pattern);
}
if (matrix) {
pattern.matrix = matrix;
}
return pattern;
}
shadingFill(objId) {
if (!this.contentVisible) {
return;
}
const ctx = this.ctx;
this.save();
const pattern = this._getPattern(objId);
ctx.fillStyle = pattern.getPattern(ctx, this, getCurrentTransformInverse(ctx), PathType.SHADING);
const inv = getCurrentTransformInverse(ctx);
if (inv) {
const {
width,
height
} = ctx.canvas;
const [x0, y0, x1, y1] = Util.getAxialAlignedBoundingBox([0, 0, width, height], inv);
this.ctx.fillRect(x0, y0, x1 - x0, y1 - y0);
} else {
this.ctx.fillRect(-1e10, -1e10, 2e10, 2e10);
}
this.compose(this.current.getClippedPathBoundingBox());
this.restore();
}
beginInlineImage() {
unreachable("Should not call beginInlineImage");
}
beginImageData() {
unreachable("Should not call beginImageData");
}
paintFormXObjectBegin(matrix, bbox) {
if (!this.contentVisible) {
return;
}
this.save();
this.baseTransformStack.push(this.baseTransform);
if (matrix) {
this.transform(...matrix);
}
this.baseTransform = getCurrentTransform(this.ctx);
if (bbox) {
const width = bbox[2] - bbox[0];
const height = bbox[3] - bbox[1];
this.ctx.rect(bbox[0], bbox[1], width, height);
this.current.updateRectMinMax(getCurrentTransform(this.ctx), bbox);
this.clip();
this.endPath();
}
}
paintFormXObjectEnd() {
if (!this.contentVisible) {
return;
}
this.restore();
this.baseTransform = this.baseTransformStack.pop();
}
beginGroup(group) {
if (!this.contentVisible) {
return;
}
this.save();
if (this.inSMaskMode) {
this.endSMaskMode();
this.current.activeSMask = null;
}
const currentCtx = this.ctx;
if (!group.isolated) {
info("TODO: Support non-isolated groups.");
}
if (group.knockout) {
warn("Knockout groups not supported.");
}
const currentTransform = getCurrentTransform(currentCtx);
if (group.matrix) {
currentCtx.transform(...group.matrix);
}
if (!group.bbox) {
throw new Error("Bounding box is required.");
}
let bounds = Util.getAxialAlignedBoundingBox(group.bbox, getCurrentTransform(currentCtx));
const canvasBounds = [0, 0, currentCtx.canvas.width, currentCtx.canvas.height];
bounds = Util.intersect(bounds, canvasBounds) || [0, 0, 0, 0];
const offsetX = Math.floor(bounds[0]);
const offsetY = Math.floor(bounds[1]);
const drawnWidth = Math.max(Math.ceil(bounds[2]) - offsetX, 1);
const drawnHeight = Math.max(Math.ceil(bounds[3]) - offsetY, 1);
this.current.startNewPathAndClipBox([0, 0, drawnWidth, drawnHeight]);
let cacheId = "groupAt" + this.groupLevel;
if (group.smask) {
cacheId += "_smask_" + this.smaskCounter++ % 2;
}
const scratchCanvas = this.cachedCanvases.getCanvas(cacheId, drawnWidth, drawnHeight);
const groupCtx = scratchCanvas.context;
groupCtx.translate(-offsetX, -offsetY);
groupCtx.transform(...currentTransform);
if (group.smask) {
this.smaskStack.push({
canvas: scratchCanvas.canvas,
context: groupCtx,
offsetX,
offsetY,
subtype: group.smask.subtype,
backdrop: group.smask.backdrop,
transferMap: group.smask.transferMap || null,
startTransformInverse: null
});
} else {
currentCtx.setTransform(1, 0, 0, 1, 0, 0);
currentCtx.translate(offsetX, offsetY);
currentCtx.save();
}
copyCtxState(currentCtx, groupCtx);
this.ctx = groupCtx;
this.setGState([["BM", "source-over"], ["ca", 1], ["CA", 1]]);
this.groupStack.push(currentCtx);
this.groupLevel++;
}
endGroup(group) {
if (!this.contentVisible) {
return;
}
this.groupLevel--;
const groupCtx = this.ctx;
const ctx = this.groupStack.pop();
this.ctx = ctx;
this.ctx.imageSmoothingEnabled = false;
if (group.smask) {
this.tempSMask = this.smaskStack.pop();
this.restore();
} else {
this.ctx.restore();
const currentMtx = getCurrentTransform(this.ctx);
this.restore();
this.ctx.save();
this.ctx.setTransform(...currentMtx);
const dirtyBox = Util.getAxialAlignedBoundingBox([0, 0, groupCtx.canvas.width, groupCtx.canvas.height], currentMtx);
this.ctx.drawImage(groupCtx.canvas, 0, 0);
this.ctx.restore();
this.compose(dirtyBox);
}
}
beginAnnotation(id, rect, transform, matrix, hasOwnCanvas) {
__privateMethod(this, _restoreInitialState, restoreInitialState_fn).call(this);
resetCtxToDefault(this.ctx);
this.ctx.save();
this.save();
if (this.baseTransform) {
this.ctx.setTransform(...this.baseTransform);
}
if (rect) {
const width = rect[2] - rect[0];
const height = rect[3] - rect[1];
if (hasOwnCanvas && this.annotationCanvasMap) {
transform = transform.slice();
transform[4] -= rect[0];
transform[5] -= rect[1];
rect = rect.slice();
rect[0] = rect[1] = 0;
rect[2] = width;
rect[3] = height;
const [scaleX, scaleY] = Util.singularValueDecompose2dScale(getCurrentTransform(this.ctx));
const {
viewportScale
} = this;
const canvasWidth = Math.ceil(width * this.outputScaleX * viewportScale);
const canvasHeight = Math.ceil(height * this.outputScaleY * viewportScale);
this.annotationCanvas = this.canvasFactory.create(canvasWidth, canvasHeight);
const {
canvas,
context
} = this.annotationCanvas;
this.annotationCanvasMap.set(id, canvas);
this.annotationCanvas.savedCtx = this.ctx;
this.ctx = context;
this.ctx.save();
this.ctx.setTransform(scaleX, 0, 0, -scaleY, 0, height * scaleY);
resetCtxToDefault(this.ctx);
} else {
resetCtxToDefault(this.ctx);
this.ctx.rect(rect[0], rect[1], width, height);
this.ctx.clip();
this.endPath();
}
}
this.current = new CanvasExtraState(this.ctx.canvas.width, this.ctx.canvas.height);
this.transform(...transform);
this.transform(...matrix);
}
endAnnotation() {
if (this.annotationCanvas) {
this.ctx.restore();
__privateMethod(this, _drawFilter, drawFilter_fn).call(this);
this.ctx = this.annotationCanvas.savedCtx;
delete this.annotationCanvas.savedCtx;
delete this.annotationCanvas;
}
}
paintImageMaskXObject(img) {
if (!this.contentVisible) {
return;
}
const count = img.count;
img = this.getObject(img.data, img);
img.count = count;
const ctx = this.ctx;
const glyph = this.processingType3;
if (glyph) {
if (glyph.compiled === void 0) {
glyph.compiled = compileType3Glyph(img);
}
if (glyph.compiled) {
glyph.compiled(ctx);
return;
}
}
const mask = this._createMaskCanvas(img);
const maskCanvas = mask.canvas;
ctx.save();
ctx.setTransform(1, 0, 0, 1, 0, 0);
ctx.drawImage(maskCanvas, mask.offsetX, mask.offsetY);
ctx.restore();
this.compose();
}
paintImageMaskXObjectRepeat(img, scaleX, skewX = 0, skewY = 0, scaleY, positions) {
if (!this.contentVisible) {
return;
}
img = this.getObject(img.data, img);
const ctx = this.ctx;
ctx.save();
const currentTransform = getCurrentTransform(ctx);
ctx.transform(scaleX, skewX, skewY, scaleY, 0, 0);
const mask = this._createMaskCanvas(img);
ctx.setTransform(1, 0, 0, 1, mask.offsetX - currentTransform[4], mask.offsetY - currentTransform[5]);
for (let i = 0, ii = positions.length; i < ii; i += 2) {
const trans = Util.transform(currentTransform, [scaleX, skewX, skewY, scaleY, positions[i], positions[i + 1]]);
const [x, y] = Util.applyTransform([0, 0], trans);
ctx.drawImage(mask.canvas, x, y);
}
ctx.restore();
this.compose();
}
paintImageMaskXObjectGroup(images) {
if (!this.contentVisible) {
return;
}
const ctx = this.ctx;
const fillColor = this.current.fillColor;
const isPatternFill = this.current.patternFill;
for (const image of images) {
const {
data,
width,
height,
transform
} = image;
const maskCanvas = this.cachedCanvases.getCanvas("maskCanvas", width, height);
const maskCtx = maskCanvas.context;
maskCtx.save();
const img = this.getObject(data, image);
putBinaryImageMask(maskCtx, img);
maskCtx.globalCompositeOperation = "source-in";
maskCtx.fillStyle = isPatternFill ? fillColor.getPattern(maskCtx, this, getCurrentTransformInverse(ctx), PathType.FILL) : fillColor;
maskCtx.fillRect(0, 0, width, height);
maskCtx.restore();
ctx.save();
ctx.transform(...transform);
ctx.scale(1, -1);
drawImageAtIntegerCoords(ctx, maskCanvas.canvas, 0, 0, width, height, 0, -1, 1, 1);
ctx.restore();
}
this.compose();
}
paintImageXObject(objId) {
if (!this.contentVisible) {
return;
}
const imgData = this.getObject(objId);
if (!imgData) {
warn("Dependent image isn't ready yet");
return;
}
this.paintInlineImageXObject(imgData);
}
paintImageXObjectRepeat(objId, scaleX, scaleY, positions) {
if (!this.contentVisible) {
return;
}
const imgData = this.getObject(objId);
if (!imgData) {
warn("Dependent image isn't ready yet");
return;
}
const width = imgData.width;
const height = imgData.height;
const map = [];
for (let i = 0, ii = positions.length; i < ii; i += 2) {
map.push({
transform: [scaleX, 0, 0, scaleY, positions[i], positions[i + 1]],
x: 0,
y: 0,
w: width,
h: height
});
}
this.paintInlineImageXObjectGroup(imgData, map);
}
applyTransferMapsToCanvas(ctx) {
if (this.current.transferMaps !== "none") {
ctx.filter = this.current.transferMaps;
ctx.drawImage(ctx.canvas, 0, 0);
ctx.filter = "none";
}
return ctx.canvas;
}
applyTransferMapsToBitmap(imgData) {
if (this.current.transferMaps === "none") {
return imgData.bitmap;
}
const {
bitmap,
width,
height
} = imgData;
const tmpCanvas = this.cachedCanvases.getCanvas("inlineImage", width, height);
const tmpCtx = tmpCanvas.context;
tmpCtx.filter = this.current.transferMaps;
tmpCtx.drawImage(bitmap, 0, 0);
tmpCtx.filter = "none";
return tmpCanvas.canvas;
}
paintInlineImageXObject(imgData) {
if (!this.contentVisible) {
return;
}
const width = imgData.width;
const height = imgData.height;
const ctx = this.ctx;
this.save();
if (!isNodeJS) {
const {
filter
} = ctx;
if (filter !== "none" && filter !== "") {
ctx.filter = "none";
}
}
ctx.scale(1 / width, -1 / height);
let imgToPaint;
if (imgData.bitmap) {
imgToPaint = this.applyTransferMapsToBitmap(imgData);
} else if (typeof HTMLElement === "function" && imgData instanceof HTMLElement || !imgData.data) {
imgToPaint = imgData;
} else {
const tmpCanvas = this.cachedCanvases.getCanvas("inlineImage", width, height);
const tmpCtx = tmpCanvas.context;
putBinaryImageData(tmpCtx, imgData);
imgToPaint = this.applyTransferMapsToCanvas(tmpCtx);
}
const scaled = this._scaleImage(imgToPaint, getCurrentTransformInverse(ctx));
ctx.imageSmoothingEnabled = getImageSmoothingEnabled(getCurrentTransform(ctx), imgData.interpolate);
drawImageAtIntegerCoords(ctx, scaled.img, 0, 0, scaled.paintWidth, scaled.paintHeight, 0, -height, width, height);
this.compose();
this.restore();
}
paintInlineImageXObjectGroup(imgData, map) {
if (!this.contentVisible) {
return;
}
const ctx = this.ctx;
let imgToPaint;
if (imgData.bitmap) {
imgToPaint = imgData.bitmap;
} else {
const w = imgData.width;
const h = imgData.height;
const tmpCanvas = this.cachedCanvases.getCanvas("inlineImage", w, h);
const tmpCtx = tmpCanvas.context;
putBinaryImageData(tmpCtx, imgData);
imgToPaint = this.applyTransferMapsToCanvas(tmpCtx);
}
for (const entry of map) {
ctx.save();
ctx.transform(...entry.transform);
ctx.scale(1, -1);
drawImageAtIntegerCoords(ctx, imgToPaint, entry.x, entry.y, entry.w, entry.h, 0, -1, 1, 1);
ctx.restore();
}
this.compose();
}
paintSolidColorImageMask() {
if (!this.contentVisible) {
return;
}
this.ctx.fillRect(0, 0, 1, 1);
this.compose();
}
markPoint(tag) {
}
markPointProps(tag, properties) {
}
beginMarkedContent(tag) {
this.markedContentStack.push({
visible: true
});
}
beginMarkedContentProps(tag, properties) {
if (tag === "OC") {
this.markedContentStack.push({
visible: this.optionalContentConfig.isVisible(properties)
});
} else {
this.markedContentStack.push({
visible: true
});
}
this.contentVisible = this.isContentVisible();
}
endMarkedContent() {
this.markedContentStack.pop();
this.contentVisible = this.isContentVisible();
}
beginCompat() {
}
endCompat() {
}
consumePath(clipBox) {
const isEmpty = this.current.isEmptyClip();
if (this.pendingClip) {
this.current.updateClipFromPath();
}
if (!this.pendingClip) {
this.compose(clipBox);
}
const ctx = this.ctx;
if (this.pendingClip) {
if (!isEmpty) {
if (this.pendingClip === EO_CLIP) {
ctx.clip("evenodd");
} else {
ctx.clip();
}
}
this.pendingClip = null;
}
this.current.startNewPathAndClipBox(this.current.clipBox);
ctx.beginPath();
}
getSinglePixelWidth() {
if (!this._cachedGetSinglePixelWidth) {
const m = getCurrentTransform(this.ctx);
if (m[1] === 0 && m[2] === 0) {
this._cachedGetSinglePixelWidth = 1 / Math.min(Math.abs(m[0]), Math.abs(m[3]));
} else {
const absDet = Math.abs(m[0] * m[3] - m[2] * m[1]);
const normX = Math.hypot(m[0], m[2]);
const normY = Math.hypot(m[1], m[3]);
this._cachedGetSinglePixelWidth = Math.max(normX, normY) / absDet;
}
}
return this._cachedGetSinglePixelWidth;
}
getScaleForStroking() {
if (this._cachedScaleForStroking[0] === -1) {
const {
lineWidth
} = this.current;
const {
a,
b,
c,
d
} = this.ctx.getTransform();
let scaleX, scaleY;
if (b === 0 && c === 0) {
const normX = Math.abs(a);
const normY = Math.abs(d);
if (normX === normY) {
if (lineWidth === 0) {
scaleX = scaleY = 1 / normX;
} else {
const scaledLineWidth = normX * lineWidth;
scaleX = scaleY = scaledLineWidth < 1 ? 1 / scaledLineWidth : 1;
}
} else if (lineWidth === 0) {
scaleX = 1 / normX;
scaleY = 1 / normY;
} else {
const scaledXLineWidth = normX * lineWidth;
const scaledYLineWidth = normY * lineWidth;
scaleX = scaledXLineWidth < 1 ? 1 / scaledXLineWidth : 1;
scaleY = scaledYLineWidth < 1 ? 1 / scaledYLineWidth : 1;
}
} else {
const absDet = Math.abs(a * d - b * c);
const normX = Math.hypot(a, b);
const normY = Math.hypot(c, d);
if (lineWidth === 0) {
scaleX = normY / absDet;
scaleY = normX / absDet;
} else {
const baseArea = lineWidth * absDet;
scaleX = normY > baseArea ? normY / baseArea : 1;
scaleY = normX > baseArea ? normX / baseArea : 1;
}
}
this._cachedScaleForStroking[0] = scaleX;
this._cachedScaleForStroking[1] = scaleY;
}
return this._cachedScaleForStroking;
}
rescaleAndStroke(saveRestore) {
const {
ctx
} = this;
const {
lineWidth
} = this.current;
const [scaleX, scaleY] = this.getScaleForStroking();
ctx.lineWidth = lineWidth || 1;
if (scaleX === 1 && scaleY === 1) {
ctx.stroke();
return;
}
const dashes = ctx.getLineDash();
if (saveRestore) {
ctx.save();
}
ctx.scale(scaleX, scaleY);
if (dashes.length > 0) {
const scale = Math.max(scaleX, scaleY);
ctx.setLineDash(dashes.map((x) => x / scale));
ctx.lineDashOffset /= scale;
}
ctx.stroke();
if (saveRestore) {
ctx.restore();
}
}
isContentVisible() {
for (let i = this.markedContentStack.length - 1; i >= 0; i--) {
if (!this.markedContentStack[i].visible) {
return false;
}
}
return true;
}
};
var CanvasGraphics = _CanvasGraphics;
_restoreInitialState = new WeakSet();
restoreInitialState_fn = function() {
while (this.stateStack.length || this.inSMaskMode) {
this.restore();
}
this.current.activeSMask = null;
this.ctx.restore();
if (this.transparentCanvas) {
this.ctx = this.compositeCtx;
this.ctx.save();
this.ctx.setTransform(1, 0, 0, 1, 0, 0);
this.ctx.drawImage(this.transparentCanvas, 0, 0);
this.ctx.restore();
this.transparentCanvas = null;
}
};
_drawFilter = new WeakSet();
drawFilter_fn = function() {
if (this.pageColors) {
const hcmFilterId = this.filterFactory.addHCMFilter(this.pageColors.foreground, this.pageColors.background);
if (hcmFilterId !== "none") {
const savedFilter = this.ctx.filter;
this.ctx.filter = hcmFilterId;
this.ctx.drawImage(this.ctx.canvas, 0, 0);
this.ctx.filter = savedFilter;
}
}
};
for (const op in OPS) {
if (CanvasGraphics.prototype[op] !== void 0) {
CanvasGraphics.prototype[OPS[op]] = CanvasGraphics.prototype[op];
}
}
var _port, _src;
var GlobalWorkerOptions = class {
static get workerPort() {
return __privateGet(this, _port);
}
static set workerPort(val) {
if (!(typeof Worker !== "undefined" && val instanceof Worker) && val !== null) {
throw new Error("Invalid `workerPort` type.");
}
__privateSet(this, _port, val);
}
static get workerSrc() {
return __privateGet(this, _src);
}
static set workerSrc(val) {
if (typeof val !== "string") {
throw new Error("Invalid `workerSrc` type.");
}
__privateSet(this, _src, val);
}
};
_port = new WeakMap();
_src = new WeakMap();
__privateAdd(GlobalWorkerOptions, _port, null);
__privateAdd(GlobalWorkerOptions, _src, "");
var CallbackKind = {
UNKNOWN: 0,
DATA: 1,
ERROR: 2
};
var StreamKind = {
UNKNOWN: 0,
CANCEL: 1,
CANCEL_COMPLETE: 2,
CLOSE: 3,
ENQUEUE: 4,
ERROR: 5,
PULL: 6,
PULL_COMPLETE: 7,
START_COMPLETE: 8
};
function wrapReason(reason) {
if (!(reason instanceof Error || typeof reason === "object" && reason !== null)) {
unreachable('wrapReason: Expected "reason" to be a (possibly cloned) Error.');
}
switch (reason.name) {
case "AbortException":
return new AbortException(reason.message);
case "MissingPDFException":
return new MissingPDFException(reason.message);
case "PasswordException":
return new PasswordException(reason.message, reason.code);
case "UnexpectedResponseException":
return new UnexpectedResponseException(reason.message, reason.status);
case "UnknownErrorException":
return new UnknownErrorException(reason.message, reason.details);
default:
return new UnknownErrorException(reason.message, reason.toString());
}
}
var _createStreamSink, createStreamSink_fn, _processStreamMessage, processStreamMessage_fn, _deleteStreamController, deleteStreamController_fn;
var MessageHandler = class {
constructor(sourceName, targetName, comObj) {
__privateAdd(this, _createStreamSink);
__privateAdd(this, _processStreamMessage);
__privateAdd(this, _deleteStreamController);
this.sourceName = sourceName;
this.targetName = targetName;
this.comObj = comObj;
this.callbackId = 1;
this.streamId = 1;
this.streamSinks = /* @__PURE__ */ Object.create(null);
this.streamControllers = /* @__PURE__ */ Object.create(null);
this.callbackCapabilities = /* @__PURE__ */ Object.create(null);
this.actionHandler = /* @__PURE__ */ Object.create(null);
this._onComObjOnMessage = (event) => {
const data = event.data;
if (data.targetName !== this.sourceName) {
return;
}
if (data.stream) {
__privateMethod(this, _processStreamMessage, processStreamMessage_fn).call(this, data);
return;
}
if (data.callback) {
const callbackId = data.callbackId;
const capability = this.callbackCapabilities[callbackId];
if (!capability) {
throw new Error(`Cannot resolve callback ${callbackId}`);
}
delete this.callbackCapabilities[callbackId];
if (data.callback === CallbackKind.DATA) {
capability.resolve(data.data);
} else if (data.callback === CallbackKind.ERROR) {
capability.reject(wrapReason(data.reason));
} else {
throw new Error("Unexpected callback case");
}
return;
}
const action = this.actionHandler[data.action];
if (!action) {
throw new Error(`Unknown action from worker: ${data.action}`);
}
if (data.callbackId) {
const cbSourceName = this.sourceName;
const cbTargetName = data.sourceName;
new Promise(function(resolve) {
resolve(action(data.data));
}).then(function(result) {
comObj.postMessage({
sourceName: cbSourceName,
targetName: cbTargetName,
callback: CallbackKind.DATA,
callbackId: data.callbackId,
data: result
});
}, function(reason) {
comObj.postMessage({
sourceName: cbSourceName,
targetName: cbTargetName,
callback: CallbackKind.ERROR,
callbackId: data.callbackId,
reason: wrapReason(reason)
});
});
return;
}
if (data.streamId) {
__privateMethod(this, _createStreamSink, createStreamSink_fn).call(this, data);
return;
}
action(data.data);
};
comObj.addEventListener("message", this._onComObjOnMessage);
}
on(actionName, handler) {
const ah = this.actionHandler;
if (ah[actionName]) {
throw new Error(`There is already an actionName called "${actionName}"`);
}
ah[actionName] = handler;
}
send(actionName, data, transfers) {
this.comObj.postMessage({
sourceName: this.sourceName,
targetName: this.targetName,
action: actionName,
data
}, transfers);
}
sendWithPromise(actionName, data, transfers) {
const callbackId = this.callbackId++;
const capability = Promise.withResolvers();
this.callbackCapabilities[callbackId] = capability;
try {
this.comObj.postMessage({
sourceName: this.sourceName,
targetName: this.targetName,
action: actionName,
callbackId,
data
}, transfers);
} catch (ex) {
capability.reject(ex);
}
return capability.promise;
}
sendWithStream(actionName, data, queueingStrategy, transfers) {
const streamId = this.streamId++, sourceName = this.sourceName, targetName = this.targetName, comObj = this.comObj;
return new ReadableStream({
start: (controller) => {
const startCapability = Promise.withResolvers();
this.streamControllers[streamId] = {
controller,
startCall: startCapability,
pullCall: null,
cancelCall: null,
isClosed: false
};
comObj.postMessage({
sourceName,
targetName,
action: actionName,
streamId,
data,
desiredSize: controller.desiredSize
}, transfers);
return startCapability.promise;
},
pull: (controller) => {
const pullCapability = Promise.withResolvers();
this.streamControllers[streamId].pullCall = pullCapability;
comObj.postMessage({
sourceName,
targetName,
stream: StreamKind.PULL,
streamId,
desiredSize: controller.desiredSize
});
return pullCapability.promise;
},
cancel: (reason) => {
assert(reason instanceof Error, "cancel must have a valid reason");
const cancelCapability = Promise.withResolvers();
this.streamControllers[streamId].cancelCall = cancelCapability;
this.streamControllers[streamId].isClosed = true;
comObj.postMessage({
sourceName,
targetName,
stream: StreamKind.CANCEL,
streamId,
reason: wrapReason(reason)
});
return cancelCapability.promise;
}
}, queueingStrategy);
}
destroy() {
this.comObj.removeEventListener("message", this._onComObjOnMessage);
}
};
_createStreamSink = new WeakSet();
createStreamSink_fn = function(data) {
const streamId = data.streamId, sourceName = this.sourceName, targetName = data.sourceName, comObj = this.comObj;
const self = this, action = this.actionHandler[data.action];
const streamSink = {
enqueue(chunk, size = 1, transfers) {
if (this.isCancelled) {
return;
}
const lastDesiredSize = this.desiredSize;
this.desiredSize -= size;
if (lastDesiredSize > 0 && this.desiredSize <= 0) {
this.sinkCapability = Promise.withResolvers();
this.ready = this.sinkCapability.promise;
}
comObj.postMessage({
sourceName,
targetName,
stream: StreamKind.ENQUEUE,
streamId,
chunk
}, transfers);
},
close() {
if (this.isCancelled) {
return;
}
this.isCancelled = true;
comObj.postMessage({
sourceName,
targetName,
stream: StreamKind.CLOSE,
streamId
});
delete self.streamSinks[streamId];
},
error(reason) {
assert(reason instanceof Error, "error must have a valid reason");
if (this.isCancelled) {
return;
}
this.isCancelled = true;
comObj.postMessage({
sourceName,
targetName,
stream: StreamKind.ERROR,
streamId,
reason: wrapReason(reason)
});
},
sinkCapability: Promise.withResolvers(),
onPull: null,
onCancel: null,
isCancelled: false,
desiredSize: data.desiredSize,
ready: null
};
streamSink.sinkCapability.resolve();
streamSink.ready = streamSink.sinkCapability.promise;
this.streamSinks[streamId] = streamSink;
new Promise(function(resolve) {
resolve(action(data.data, streamSink));
}).then(function() {
comObj.postMessage({
sourceName,
targetName,
stream: StreamKind.START_COMPLETE,
streamId,
success: true
});
}, function(reason) {
comObj.postMessage({
sourceName,
targetName,
stream: StreamKind.START_COMPLETE,
streamId,
reason: wrapReason(reason)
});
});
};
_processStreamMessage = new WeakSet();
processStreamMessage_fn = function(data) {
const streamId = data.streamId, sourceName = this.sourceName, targetName = data.sourceName, comObj = this.comObj;
const streamController = this.streamControllers[streamId], streamSink = this.streamSinks[streamId];
switch (data.stream) {
case StreamKind.START_COMPLETE:
if (data.success) {
streamController.startCall.resolve();
} else {
streamController.startCall.reject(wrapReason(data.reason));
}
break;
case StreamKind.PULL_COMPLETE:
if (data.success) {
streamController.pullCall.resolve();
} else {
streamController.pullCall.reject(wrapReason(data.reason));
}
break;
case StreamKind.PULL:
if (!streamSink) {
comObj.postMessage({
sourceName,
targetName,
stream: StreamKind.PULL_COMPLETE,
streamId,
success: true
});
break;
}
if (streamSink.desiredSize <= 0 && data.desiredSize > 0) {
streamSink.sinkCapability.resolve();
}
streamSink.desiredSize = data.desiredSize;
new Promise(function(resolve) {
var _a2;
resolve((_a2 = streamSink.onPull) == null ? void 0 : _a2.call(streamSink));
}).then(function() {
comObj.postMessage({
sourceName,
targetName,
stream: StreamKind.PULL_COMPLETE,
streamId,
success: true
});
}, function(reason) {
comObj.postMessage({
sourceName,
targetName,
stream: StreamKind.PULL_COMPLETE,
streamId,
reason: wrapReason(reason)
});
});
break;
case StreamKind.ENQUEUE:
assert(streamController, "enqueue should have stream controller");
if (streamController.isClosed) {
break;
}
streamController.controller.enqueue(data.chunk);
break;
case StreamKind.CLOSE:
assert(streamController, "close should have stream controller");
if (streamController.isClosed) {
break;
}
streamController.isClosed = true;
streamController.controller.close();
__privateMethod(this, _deleteStreamController, deleteStreamController_fn).call(this, streamController, streamId);
break;
case StreamKind.ERROR:
assert(streamController, "error should have stream controller");
streamController.controller.error(wrapReason(data.reason));
__privateMethod(this, _deleteStreamController, deleteStreamController_fn).call(this, streamController, streamId);
break;
case StreamKind.CANCEL_COMPLETE:
if (data.success) {
streamController.cancelCall.resolve();
} else {
streamController.cancelCall.reject(wrapReason(data.reason));
}
__privateMethod(this, _deleteStreamController, deleteStreamController_fn).call(this, streamController, streamId);
break;
case StreamKind.CANCEL:
if (!streamSink) {
break;
}
new Promise(function(resolve) {
var _a2;
resolve((_a2 = streamSink.onCancel) == null ? void 0 : _a2.call(streamSink, wrapReason(data.reason)));
}).then(function() {
comObj.postMessage({
sourceName,
targetName,
stream: StreamKind.CANCEL_COMPLETE,
streamId,
success: true
});
}, function(reason) {
comObj.postMessage({
sourceName,
targetName,
stream: StreamKind.CANCEL_COMPLETE,
streamId,
reason: wrapReason(reason)
});
});
streamSink.sinkCapability.reject(wrapReason(data.reason));
streamSink.isCancelled = true;
delete this.streamSinks[streamId];
break;
default:
throw new Error("Unexpected stream case");
}
};
_deleteStreamController = new WeakSet();
deleteStreamController_fn = async function(streamController, streamId) {
var _a2, _b, _c;
await Promise.allSettled([(_a2 = streamController.startCall) == null ? void 0 : _a2.promise, (_b = streamController.pullCall) == null ? void 0 : _b.promise, (_c = streamController.cancelCall) == null ? void 0 : _c.promise]);
delete this.streamControllers[streamId];
};
var _metadataMap, _data;
var Metadata = class {
constructor({
parsedData,
rawData
}) {
__privateAdd(this, _metadataMap, void 0);
__privateAdd(this, _data, void 0);
__privateSet(this, _metadataMap, parsedData);
__privateSet(this, _data, rawData);
}
getRaw() {
return __privateGet(this, _data);
}
get(name) {
var _a2;
return (_a2 = __privateGet(this, _metadataMap).get(name)) != null ? _a2 : null;
}
getAll() {
return objectFromMap(__privateGet(this, _metadataMap));
}
has(name) {
return __privateGet(this, _metadataMap).has(name);
}
};
_metadataMap = new WeakMap();
_data = new WeakMap();
var INTERNAL = Symbol("INTERNAL");
var _isDisplay, _isPrint, _userSet, _visible;
var OptionalContentGroup = class {
constructor(renderingIntent, {
name,
intent,
usage
}) {
__privateAdd(this, _isDisplay, false);
__privateAdd(this, _isPrint, false);
__privateAdd(this, _userSet, false);
__privateAdd(this, _visible, true);
__privateSet(this, _isDisplay, !!(renderingIntent & RenderingIntentFlag.DISPLAY));
__privateSet(this, _isPrint, !!(renderingIntent & RenderingIntentFlag.PRINT));
this.name = name;
this.intent = intent;
this.usage = usage;
}
get visible() {
if (__privateGet(this, _userSet)) {
return __privateGet(this, _visible);
}
if (!__privateGet(this, _visible)) {
return false;
}
const {
print,
view
} = this.usage;
if (__privateGet(this, _isDisplay)) {
return (view == null ? void 0 : view.viewState) !== "OFF";
} else if (__privateGet(this, _isPrint)) {
return (print == null ? void 0 : print.printState) !== "OFF";
}
return true;
}
_setVisible(internal, visible, userSet = false) {
if (internal !== INTERNAL) {
unreachable("Internal method `_setVisible` called.");
}
__privateSet(this, _userSet, userSet);
__privateSet(this, _visible, visible);
}
};
_isDisplay = new WeakMap();
_isPrint = new WeakMap();
_userSet = new WeakMap();
_visible = new WeakMap();
var _cachedGetHash, _groups, _initialHash, _order, _evaluateVisibilityExpression, evaluateVisibilityExpression_fn;
var OptionalContentConfig = class {
constructor(data, renderingIntent = RenderingIntentFlag.DISPLAY) {
__privateAdd(this, _evaluateVisibilityExpression);
__privateAdd(this, _cachedGetHash, null);
__privateAdd(this, _groups, /* @__PURE__ */ new Map());
__privateAdd(this, _initialHash, null);
__privateAdd(this, _order, null);
this.renderingIntent = renderingIntent;
this.name = null;
this.creator = null;
if (data === null) {
return;
}
this.name = data.name;
this.creator = data.creator;
__privateSet(this, _order, data.order);
for (const group of data.groups) {
__privateGet(this, _groups).set(group.id, new OptionalContentGroup(renderingIntent, group));
}
if (data.baseState === "OFF") {
for (const group of __privateGet(this, _groups).values()) {
group._setVisible(INTERNAL, false);
}
}
for (const on of data.on) {
__privateGet(this, _groups).get(on)._setVisible(INTERNAL, true);
}
for (const off of data.off) {
__privateGet(this, _groups).get(off)._setVisible(INTERNAL, false);
}
__privateSet(this, _initialHash, this.getHash());
}
isVisible(group) {
if (__privateGet(this, _groups).size === 0) {
return true;
}
if (!group) {
info("Optional content group not defined.");
return true;
}
if (group.type === "OCG") {
if (!__privateGet(this, _groups).has(group.id)) {
warn(`Optional content group not found: ${group.id}`);
return true;
}
return __privateGet(this, _groups).get(group.id).visible;
} else if (group.type === "OCMD") {
if (group.expression) {
return __privateMethod(this, _evaluateVisibilityExpression, evaluateVisibilityExpression_fn).call(this, group.expression);
}
if (!group.policy || group.policy === "AnyOn") {
for (const id of group.ids) {
if (!__privateGet(this, _groups).has(id)) {
warn(`Optional content group not found: ${id}`);
return true;
}
if (__privateGet(this, _groups).get(id).visible) {
return true;
}
}
return false;
} else if (group.policy === "AllOn") {
for (const id of group.ids) {
if (!__privateGet(this, _groups).has(id)) {
warn(`Optional content group not found: ${id}`);
return true;
}
if (!__privateGet(this, _groups).get(id).visible) {
return false;
}
}
return true;
} else if (group.policy === "AnyOff") {
for (const id of group.ids) {
if (!__privateGet(this, _groups).has(id)) {
warn(`Optional content group not found: ${id}`);
return true;
}
if (!__privateGet(this, _groups).get(id).visible) {
return true;
}
}
return false;
} else if (group.policy === "AllOff") {
for (const id of group.ids) {
if (!__privateGet(this, _groups).has(id)) {
warn(`Optional content group not found: ${id}`);
return true;
}
if (__privateGet(this, _groups).get(id).visible) {
return false;
}
}
return true;
}
warn(`Unknown optional content policy ${group.policy}.`);
return true;
}
warn(`Unknown group type ${group.type}.`);
return true;
}
setVisibility(id, visible = true) {
const group = __privateGet(this, _groups).get(id);
if (!group) {
warn(`Optional content group not found: ${id}`);
return;
}
group._setVisible(INTERNAL, !!visible, true);
__privateSet(this, _cachedGetHash, null);
}
setOCGState({
state,
preserveRB
}) {
let operator;
for (const elem of state) {
switch (elem) {
case "ON":
case "OFF":
case "Toggle":
operator = elem;
continue;
}
const group = __privateGet(this, _groups).get(elem);
if (!group) {
continue;
}
switch (operator) {
case "ON":
group._setVisible(INTERNAL, true);
break;
case "OFF":
group._setVisible(INTERNAL, false);
break;
case "Toggle":
group._setVisible(INTERNAL, !group.visible);
break;
}
}
__privateSet(this, _cachedGetHash, null);
}
get hasInitialVisibility() {
return __privateGet(this, _initialHash) === null || this.getHash() === __privateGet(this, _initialHash);
}
getOrder() {
if (!__privateGet(this, _groups).size) {
return null;
}
if (__privateGet(this, _order)) {
return __privateGet(this, _order).slice();
}
return [...__privateGet(this, _groups).keys()];
}
getGroups() {
return __privateGet(this, _groups).size > 0 ? objectFromMap(__privateGet(this, _groups)) : null;
}
getGroup(id) {
return __privateGet(this, _groups).get(id) || null;
}
getHash() {
if (__privateGet(this, _cachedGetHash) !== null) {
return __privateGet(this, _cachedGetHash);
}
const hash = new MurmurHash3_64();
for (const [id, group] of __privateGet(this, _groups)) {
hash.update(`${id}:${group.visible}`);
}
return __privateSet(this, _cachedGetHash, hash.hexdigest());
}
};
_cachedGetHash = new WeakMap();
_groups = new WeakMap();
_initialHash = new WeakMap();
_order = new WeakMap();
_evaluateVisibilityExpression = new WeakSet();
evaluateVisibilityExpression_fn = function(array) {
const length = array.length;
if (length < 2) {
return true;
}
const operator = array[0];
for (let i = 1; i < length; i++) {
const element = array[i];
let state;
if (Array.isArray(element)) {
state = __privateMethod(this, _evaluateVisibilityExpression, evaluateVisibilityExpression_fn).call(this, element);
} else if (__privateGet(this, _groups).has(element)) {
state = __privateGet(this, _groups).get(element).visible;
} else {
warn(`Optional content group not found: ${element}`);
return true;
}
switch (operator) {
case "And":
if (!state) {
return false;
}
break;
case "Or":
if (state) {
return true;
}
break;
case "Not":
return !state;
default:
return true;
}
}
return operator === "And";
};
var PDFDataTransportStream = class {
constructor(pdfDataRangeTransport, {
disableRange = false,
disableStream = false
}) {
assert(pdfDataRangeTransport, 'PDFDataTransportStream - missing required "pdfDataRangeTransport" argument.');
const {
length,
initialData,
progressiveDone,
contentDispositionFilename
} = pdfDataRangeTransport;
this._queuedChunks = [];
this._progressiveDone = progressiveDone;
this._contentDispositionFilename = contentDispositionFilename;
if ((initialData == null ? void 0 : initialData.length) > 0) {
const buffer = initialData instanceof Uint8Array && initialData.byteLength === initialData.buffer.byteLength ? initialData.buffer : new Uint8Array(initialData).buffer;
this._queuedChunks.push(buffer);
}
this._pdfDataRangeTransport = pdfDataRangeTransport;
this._isStreamingSupported = !disableStream;
this._isRangeSupported = !disableRange;
this._contentLength = length;
this._fullRequestReader = null;
this._rangeReaders = [];
pdfDataRangeTransport.addRangeListener((begin, chunk) => {
this._onReceiveData({
begin,
chunk
});
});
pdfDataRangeTransport.addProgressListener((loaded, total) => {
this._onProgress({
loaded,
total
});
});
pdfDataRangeTransport.addProgressiveReadListener((chunk) => {
this._onReceiveData({
chunk
});
});
pdfDataRangeTransport.addProgressiveDoneListener(() => {
this._onProgressiveDone();
});
pdfDataRangeTransport.transportReady();
}
_onReceiveData({
begin,
chunk
}) {
const buffer = chunk instanceof Uint8Array && chunk.byteLength === chunk.buffer.byteLength ? chunk.buffer : new Uint8Array(chunk).buffer;
if (begin === void 0) {
if (this._fullRequestReader) {
this._fullRequestReader._enqueue(buffer);
} else {
this._queuedChunks.push(buffer);
}
} else {
const found = this._rangeReaders.some(function(rangeReader) {
if (rangeReader._begin !== begin) {
return false;
}
rangeReader._enqueue(buffer);
return true;
});
assert(found, "_onReceiveData - no `PDFDataTransportStreamRangeReader` instance found.");
}
}
get _progressiveDataLength() {
var _a2, _b;
return (_b = (_a2 = this._fullRequestReader) == null ? void 0 : _a2._loaded) != null ? _b : 0;
}
_onProgress(evt) {
var _a2, _b, _c, _d;
if (evt.total === void 0) {
(_b = (_a2 = this._rangeReaders[0]) == null ? void 0 : _a2.onProgress) == null ? void 0 : _b.call(_a2, {
loaded: evt.loaded
});
} else {
(_d = (_c = this._fullRequestReader) == null ? void 0 : _c.onProgress) == null ? void 0 : _d.call(_c, {
loaded: evt.loaded,
total: evt.total
});
}
}
_onProgressiveDone() {
var _a2;
(_a2 = this._fullRequestReader) == null ? void 0 : _a2.progressiveDone();
this._progressiveDone = true;
}
_removeRangeReader(reader) {
const i = this._rangeReaders.indexOf(reader);
if (i >= 0) {
this._rangeReaders.splice(i, 1);
}
}
getFullReader() {
assert(!this._fullRequestReader, "PDFDataTransportStream.getFullReader can only be called once.");
const queuedChunks = this._queuedChunks;
this._queuedChunks = null;
return new PDFDataTransportStreamReader(this, queuedChunks, this._progressiveDone, this._contentDispositionFilename);
}
getRangeReader(begin, end) {
if (end <= this._progressiveDataLength) {
return null;
}
const reader = new PDFDataTransportStreamRangeReader(this, begin, end);
this._pdfDataRangeTransport.requestDataRange(begin, end);
this._rangeReaders.push(reader);
return reader;
}
cancelAllRequests(reason) {
var _a2;
(_a2 = this._fullRequestReader) == null ? void 0 : _a2.cancel(reason);
for (const reader of this._rangeReaders.slice(0)) {
reader.cancel(reason);
}
this._pdfDataRangeTransport.abort();
}
};
var PDFDataTransportStreamReader = class {
constructor(stream, queuedChunks, progressiveDone = false, contentDispositionFilename = null) {
this._stream = stream;
this._done = progressiveDone || false;
this._filename = isPdfFile(contentDispositionFilename) ? contentDispositionFilename : null;
this._queuedChunks = queuedChunks || [];
this._loaded = 0;
for (const chunk of this._queuedChunks) {
this._loaded += chunk.byteLength;
}
this._requests = [];
this._headersReady = Promise.resolve();
stream._fullRequestReader = this;
this.onProgress = null;
}
_enqueue(chunk) {
if (this._done) {
return;
}
if (this._requests.length > 0) {
const requestCapability = this._requests.shift();
requestCapability.resolve({
value: chunk,
done: false
});
} else {
this._queuedChunks.push(chunk);
}
this._loaded += chunk.byteLength;
}
get headersReady() {
return this._headersReady;
}
get filename() {
return this._filename;
}
get isRangeSupported() {
return this._stream._isRangeSupported;
}
get isStreamingSupported() {
return this._stream._isStreamingSupported;
}
get contentLength() {
return this._stream._contentLength;
}
async read() {
if (this._queuedChunks.length > 0) {
const chunk = this._queuedChunks.shift();
return {
value: chunk,
done: false
};
}
if (this._done) {
return {
value: void 0,
done: true
};
}
const requestCapability = Promise.withResolvers();
this._requests.push(requestCapability);
return requestCapability.promise;
}
cancel(reason) {
this._done = true;
for (const requestCapability of this._requests) {
requestCapability.resolve({
value: void 0,
done: true
});
}
this._requests.length = 0;
}
progressiveDone() {
if (this._done) {
return;
}
this._done = true;
}
};
var PDFDataTransportStreamRangeReader = class {
constructor(stream, begin, end) {
this._stream = stream;
this._begin = begin;
this._end = end;
this._queuedChunk = null;
this._requests = [];
this._done = false;
this.onProgress = null;
}
_enqueue(chunk) {
if (this._done) {
return;
}
if (this._requests.length === 0) {
this._queuedChunk = chunk;
} else {
const requestsCapability = this._requests.shift();
requestsCapability.resolve({
value: chunk,
done: false
});
for (const requestCapability of this._requests) {
requestCapability.resolve({
value: void 0,
done: true
});
}
this._requests.length = 0;
}
this._done = true;
this._stream._removeRangeReader(this);
}
get isStreamingSupported() {
return false;
}
async read() {
if (this._queuedChunk) {
const chunk = this._queuedChunk;
this._queuedChunk = null;
return {
value: chunk,
done: false
};
}
if (this._done) {
return {
value: void 0,
done: true
};
}
const requestCapability = Promise.withResolvers();
this._requests.push(requestCapability);
return requestCapability.promise;
}
cancel(reason) {
this._done = true;
for (const requestCapability of this._requests) {
requestCapability.resolve({
value: void 0,
done: true
});
}
this._requests.length = 0;
this._stream._removeRangeReader(this);
}
};
function getFilenameFromContentDispositionHeader(contentDisposition) {
let needsEncodingFixup = true;
let tmp = toParamRegExp("filename\\*", "i").exec(contentDisposition);
if (tmp) {
tmp = tmp[1];
let filename = rfc2616unquote(tmp);
filename = unescape(filename);
filename = rfc5987decode(filename);
filename = rfc2047decode(filename);
return fixupEncoding(filename);
}
tmp = rfc2231getparam(contentDisposition);
if (tmp) {
const filename = rfc2047decode(tmp);
return fixupEncoding(filename);
}
tmp = toParamRegExp("filename", "i").exec(contentDisposition);
if (tmp) {
tmp = tmp[1];
let filename = rfc2616unquote(tmp);
filename = rfc2047decode(filename);
return fixupEncoding(filename);
}
function toParamRegExp(attributePattern, flags) {
return new RegExp("(?:^|;)\\s*" + attributePattern + '\\s*=\\s*([^";\\s][^;\\s]*|"(?:[^"\\\\]|\\\\"?)+"?)', flags);
}
function textdecode(encoding, value) {
if (encoding) {
if (!/^[\x00-\xFF]+$/.test(value)) {
return value;
}
try {
const decoder = new TextDecoder(encoding, {
fatal: true
});
const buffer = stringToBytes(value);
value = decoder.decode(buffer);
needsEncodingFixup = false;
} catch (e) {
}
}
return value;
}
function fixupEncoding(value) {
if (needsEncodingFixup && /[\x80-\xff]/.test(value)) {
value = textdecode("utf-8", value);
if (needsEncodingFixup) {
value = textdecode("iso-8859-1", value);
}
}
return value;
}
function rfc2231getparam(contentDispositionStr) {
const matches = [];
let match;
const iter = toParamRegExp("filename\\*((?!0\\d)\\d+)(\\*?)", "ig");
while ((match = iter.exec(contentDispositionStr)) !== null) {
let [, n, quot, part] = match;
n = parseInt(n, 10);
if (n in matches) {
if (n === 0) {
break;
}
continue;
}
matches[n] = [quot, part];
}
const parts = [];
for (let n = 0; n < matches.length; ++n) {
if (!(n in matches)) {
break;
}
let [quot, part] = matches[n];
part = rfc2616unquote(part);
if (quot) {
part = unescape(part);
if (n === 0) {
part = rfc5987decode(part);
}
}
parts.push(part);
}
return parts.join("");
}
function rfc2616unquote(value) {
if (value.startsWith('"')) {
const parts = value.slice(1).split('\\"');
for (let i = 0; i < parts.length; ++i) {
const quotindex = parts[i].indexOf('"');
if (quotindex !== -1) {
parts[i] = parts[i].slice(0, quotindex);
parts.length = i + 1;
}
parts[i] = parts[i].replaceAll(/\\(.)/g, "$1");
}
value = parts.join('"');
}
return value;
}
function rfc5987decode(extvalue) {
const encodingend = extvalue.indexOf("'");
if (encodingend === -1) {
return extvalue;
}
const encoding = extvalue.slice(0, encodingend);
const langvalue = extvalue.slice(encodingend + 1);
const value = langvalue.replace(/^[^']*'/, "");
return textdecode(encoding, value);
}
function rfc2047decode(value) {
if (!value.startsWith("=?") || /[\x00-\x19\x80-\xff]/.test(value)) {
return value;
}
return value.replaceAll(/=\?([\w-]*)\?([QqBb])\?((?:[^?]|\?(?!=))*)\?=/g, function(matches, charset, encoding, text) {
if (encoding === "q" || encoding === "Q") {
text = text.replaceAll("_", " ");
text = text.replaceAll(/=([0-9a-fA-F]{2})/g, function(match, hex) {
return String.fromCharCode(parseInt(hex, 16));
});
return textdecode(charset, text);
}
try {
text = atob(text);
} catch (e) {
}
return textdecode(charset, text);
});
}
return "";
}
function validateRangeRequestCapabilities({
getResponseHeader,
isHttp,
rangeChunkSize,
disableRange
}) {
const returnValues = {
allowRangeRequests: false,
suggestedLength: void 0
};
const length = parseInt(getResponseHeader("Content-Length"), 10);
if (!Number.isInteger(length)) {
return returnValues;
}
returnValues.suggestedLength = length;
if (length <= 2 * rangeChunkSize) {
return returnValues;
}
if (disableRange || !isHttp) {
return returnValues;
}
if (getResponseHeader("Accept-Ranges") !== "bytes") {
return returnValues;
}
const contentEncoding = getResponseHeader("Content-Encoding") || "identity";
if (contentEncoding !== "identity") {
return returnValues;
}
returnValues.allowRangeRequests = true;
return returnValues;
}
function extractFilenameFromHeader(getResponseHeader) {
const contentDisposition = getResponseHeader("Content-Disposition");
if (contentDisposition) {
let filename = getFilenameFromContentDispositionHeader(contentDisposition);
if (filename.includes("%")) {
try {
filename = decodeURIComponent(filename);
} catch (e) {
}
}
if (isPdfFile(filename)) {
return filename;
}
}
return null;
}
function createResponseStatusError(status, url) {
if (status === 404 || status === 0 && url.startsWith("file:")) {
return new MissingPDFException('Missing PDF "' + url + '".');
}
return new UnexpectedResponseException(`Unexpected server response (${status}) while retrieving PDF "${url}".`, status);
}
function validateResponseStatus(status) {
return status === 200 || status === 206;
}
function createFetchOptions(headers, withCredentials, abortController) {
return {
method: "GET",
headers,
signal: abortController.signal,
mode: "cors",
credentials: withCredentials ? "include" : "same-origin",
redirect: "follow"
};
}
function createHeaders(httpHeaders) {
const headers = new Headers();
for (const property in httpHeaders) {
const value = httpHeaders[property];
if (value === void 0) {
continue;
}
headers.append(property, value);
}
return headers;
}
function getArrayBuffer(val) {
if (val instanceof Uint8Array) {
return val.buffer;
}
if (val instanceof ArrayBuffer) {
return val;
}
warn(`getArrayBuffer - unexpected data format: ${val}`);
return new Uint8Array(val).buffer;
}
var PDFFetchStream = class {
constructor(source) {
this.source = source;
this.isHttp = /^https?:/i.test(source.url);
this.httpHeaders = this.isHttp && source.httpHeaders || {};
this._fullRequestReader = null;
this._rangeRequestReaders = [];
}
get _progressiveDataLength() {
var _a2, _b;
return (_b = (_a2 = this._fullRequestReader) == null ? void 0 : _a2._loaded) != null ? _b : 0;
}
getFullReader() {
assert(!this._fullRequestReader, "PDFFetchStream.getFullReader can only be called once.");
this._fullRequestReader = new PDFFetchStreamReader(this);
return this._fullRequestReader;
}
getRangeReader(begin, end) {
if (end <= this._progressiveDataLength) {
return null;
}
const reader = new PDFFetchStreamRangeReader(this, begin, end);
this._rangeRequestReaders.push(reader);
return reader;
}
cancelAllRequests(reason) {
var _a2;
(_a2 = this._fullRequestReader) == null ? void 0 : _a2.cancel(reason);
for (const reader of this._rangeRequestReaders.slice(0)) {
reader.cancel(reason);
}
}
};
var PDFFetchStreamReader = class {
constructor(stream) {
this._stream = stream;
this._reader = null;
this._loaded = 0;
this._filename = null;
const source = stream.source;
this._withCredentials = source.withCredentials || false;
this._contentLength = source.length;
this._headersCapability = Promise.withResolvers();
this._disableRange = source.disableRange || false;
this._rangeChunkSize = source.rangeChunkSize;
if (!this._rangeChunkSize && !this._disableRange) {
this._disableRange = true;
}
this._abortController = new AbortController();
this._isStreamingSupported = !source.disableStream;
this._isRangeSupported = !source.disableRange;
this._headers = createHeaders(this._stream.httpHeaders);
const url = source.url;
fetch(url, createFetchOptions(this._headers, this._withCredentials, this._abortController)).then((response) => {
if (!validateResponseStatus(response.status)) {
throw createResponseStatusError(response.status, url);
}
this._reader = response.body.getReader();
this._headersCapability.resolve();
const getResponseHeader = (name) => response.headers.get(name);
const {
allowRangeRequests,
suggestedLength
} = validateRangeRequestCapabilities({
getResponseHeader,
isHttp: this._stream.isHttp,
rangeChunkSize: this._rangeChunkSize,
disableRange: this._disableRange
});
this._isRangeSupported = allowRangeRequests;
this._contentLength = suggestedLength || this._contentLength;
this._filename = extractFilenameFromHeader(getResponseHeader);
if (!this._isStreamingSupported && this._isRangeSupported) {
this.cancel(new AbortException("Streaming is disabled."));
}
}).catch(this._headersCapability.reject);
this.onProgress = null;
}
get headersReady() {
return this._headersCapability.promise;
}
get filename() {
return this._filename;
}
get contentLength() {
return this._contentLength;
}
get isRangeSupported() {
return this._isRangeSupported;
}
get isStreamingSupported() {
return this._isStreamingSupported;
}
async read() {
var _a2;
await this._headersCapability.promise;
const {
value,
done
} = await this._reader.read();
if (done) {
return {
value,
done
};
}
this._loaded += value.byteLength;
(_a2 = this.onProgress) == null ? void 0 : _a2.call(this, {
loaded: this._loaded,
total: this._contentLength
});
return {
value: getArrayBuffer(value),
done: false
};
}
cancel(reason) {
var _a2;
(_a2 = this._reader) == null ? void 0 : _a2.cancel(reason);
this._abortController.abort();
}
};
var PDFFetchStreamRangeReader = class {
constructor(stream, begin, end) {
this._stream = stream;
this._reader = null;
this._loaded = 0;
const source = stream.source;
this._withCredentials = source.withCredentials || false;
this._readCapability = Promise.withResolvers();
this._isStreamingSupported = !source.disableStream;
this._abortController = new AbortController();
this._headers = createHeaders(this._stream.httpHeaders);
this._headers.append("Range", `bytes=${begin}-${end - 1}`);
const url = source.url;
fetch(url, createFetchOptions(this._headers, this._withCredentials, this._abortController)).then((response) => {
if (!validateResponseStatus(response.status)) {
throw createResponseStatusError(response.status, url);
}
this._readCapability.resolve();
this._reader = response.body.getReader();
}).catch(this._readCapability.reject);
this.onProgress = null;
}
get isStreamingSupported() {
return this._isStreamingSupported;
}
async read() {
var _a2;
await this._readCapability.promise;
const {
value,
done
} = await this._reader.read();
if (done) {
return {
value,
done
};
}
this._loaded += value.byteLength;
(_a2 = this.onProgress) == null ? void 0 : _a2.call(this, {
loaded: this._loaded
});
return {
value: getArrayBuffer(value),
done: false
};
}
cancel(reason) {
var _a2;
(_a2 = this._reader) == null ? void 0 : _a2.cancel(reason);
this._abortController.abort();
}
};
var OK_RESPONSE = 200;
var PARTIAL_CONTENT_RESPONSE = 206;
function network_getArrayBuffer(xhr) {
const data = xhr.response;
if (typeof data !== "string") {
return data;
}
return stringToBytes(data).buffer;
}
var NetworkManager = class {
constructor(url, args = {}) {
this.url = url;
this.isHttp = /^https?:/i.test(url);
this.httpHeaders = this.isHttp && args.httpHeaders || /* @__PURE__ */ Object.create(null);
this.withCredentials = args.withCredentials || false;
this.currXhrId = 0;
this.pendingRequests = /* @__PURE__ */ Object.create(null);
}
requestRange(begin, end, listeners) {
const args = {
begin,
end
};
for (const prop in listeners) {
args[prop] = listeners[prop];
}
return this.request(args);
}
requestFull(listeners) {
return this.request(listeners);
}
request(args) {
const xhr = new XMLHttpRequest();
const xhrId = this.currXhrId++;
const pendingRequest = this.pendingRequests[xhrId] = {
xhr
};
xhr.open("GET", this.url);
xhr.withCredentials = this.withCredentials;
for (const property in this.httpHeaders) {
const value = this.httpHeaders[property];
if (value === void 0) {
continue;
}
xhr.setRequestHeader(property, value);
}
if (this.isHttp && "begin" in args && "end" in args) {
xhr.setRequestHeader("Range", `bytes=${args.begin}-${args.end - 1}`);
pendingRequest.expectedStatus = PARTIAL_CONTENT_RESPONSE;
} else {
pendingRequest.expectedStatus = OK_RESPONSE;
}
xhr.responseType = "arraybuffer";
if (args.onError) {
xhr.onerror = function(evt) {
args.onError(xhr.status);
};
}
xhr.onreadystatechange = this.onStateChange.bind(this, xhrId);
xhr.onprogress = this.onProgress.bind(this, xhrId);
pendingRequest.onHeadersReceived = args.onHeadersReceived;
pendingRequest.onDone = args.onDone;
pendingRequest.onError = args.onError;
pendingRequest.onProgress = args.onProgress;
xhr.send(null);
return xhrId;
}
onProgress(xhrId, evt) {
var _a2;
const pendingRequest = this.pendingRequests[xhrId];
if (!pendingRequest) {
return;
}
(_a2 = pendingRequest.onProgress) == null ? void 0 : _a2.call(pendingRequest, evt);
}
onStateChange(xhrId, evt) {
var _a2, _b, _c;
const pendingRequest = this.pendingRequests[xhrId];
if (!pendingRequest) {
return;
}
const xhr = pendingRequest.xhr;
if (xhr.readyState >= 2 && pendingRequest.onHeadersReceived) {
pendingRequest.onHeadersReceived();
delete pendingRequest.onHeadersReceived;
}
if (xhr.readyState !== 4) {
return;
}
if (!(xhrId in this.pendingRequests)) {
return;
}
delete this.pendingRequests[xhrId];
if (xhr.status === 0 && this.isHttp) {
(_a2 = pendingRequest.onError) == null ? void 0 : _a2.call(pendingRequest, xhr.status);
return;
}
const xhrStatus = xhr.status || OK_RESPONSE;
const ok_response_on_range_request = xhrStatus === OK_RESPONSE && pendingRequest.expectedStatus === PARTIAL_CONTENT_RESPONSE;
if (!ok_response_on_range_request && xhrStatus !== pendingRequest.expectedStatus) {
(_b = pendingRequest.onError) == null ? void 0 : _b.call(pendingRequest, xhr.status);
return;
}
const chunk = network_getArrayBuffer(xhr);
if (xhrStatus === PARTIAL_CONTENT_RESPONSE) {
const rangeHeader = xhr.getResponseHeader("Content-Range");
const matches = /bytes (\d+)-(\d+)\/(\d+)/.exec(rangeHeader);
pendingRequest.onDone({
begin: parseInt(matches[1], 10),
chunk
});
} else if (chunk) {
pendingRequest.onDone({
begin: 0,
chunk
});
} else {
(_c = pendingRequest.onError) == null ? void 0 : _c.call(pendingRequest, xhr.status);
}
}
getRequestXhr(xhrId) {
return this.pendingRequests[xhrId].xhr;
}
isPendingRequest(xhrId) {
return xhrId in this.pendingRequests;
}
abortRequest(xhrId) {
const xhr = this.pendingRequests[xhrId].xhr;
delete this.pendingRequests[xhrId];
xhr.abort();
}
};
var PDFNetworkStream = class {
constructor(source) {
this._source = source;
this._manager = new NetworkManager(source.url, {
httpHeaders: source.httpHeaders,
withCredentials: source.withCredentials
});
this._rangeChunkSize = source.rangeChunkSize;
this._fullRequestReader = null;
this._rangeRequestReaders = [];
}
_onRangeRequestReaderClosed(reader) {
const i = this._rangeRequestReaders.indexOf(reader);
if (i >= 0) {
this._rangeRequestReaders.splice(i, 1);
}
}
getFullReader() {
assert(!this._fullRequestReader, "PDFNetworkStream.getFullReader can only be called once.");
this._fullRequestReader = new PDFNetworkStreamFullRequestReader(this._manager, this._source);
return this._fullRequestReader;
}
getRangeReader(begin, end) {
const reader = new PDFNetworkStreamRangeRequestReader(this._manager, begin, end);
reader.onClosed = this._onRangeRequestReaderClosed.bind(this);
this._rangeRequestReaders.push(reader);
return reader;
}
cancelAllRequests(reason) {
var _a2;
(_a2 = this._fullRequestReader) == null ? void 0 : _a2.cancel(reason);
for (const reader of this._rangeRequestReaders.slice(0)) {
reader.cancel(reason);
}
}
};
var PDFNetworkStreamFullRequestReader = class {
constructor(manager, source) {
this._manager = manager;
const args = {
onHeadersReceived: this._onHeadersReceived.bind(this),
onDone: this._onDone.bind(this),
onError: this._onError.bind(this),
onProgress: this._onProgress.bind(this)
};
this._url = source.url;
this._fullRequestId = manager.requestFull(args);
this._headersReceivedCapability = Promise.withResolvers();
this._disableRange = source.disableRange || false;
this._contentLength = source.length;
this._rangeChunkSize = source.rangeChunkSize;
if (!this._rangeChunkSize && !this._disableRange) {
this._disableRange = true;
}
this._isStreamingSupported = false;
this._isRangeSupported = false;
this._cachedChunks = [];
this._requests = [];
this._done = false;
this._storedError = void 0;
this._filename = null;
this.onProgress = null;
}
_onHeadersReceived() {
const fullRequestXhrId = this._fullRequestId;
const fullRequestXhr = this._manager.getRequestXhr(fullRequestXhrId);
const getResponseHeader = (name) => fullRequestXhr.getResponseHeader(name);
const {
allowRangeRequests,
suggestedLength
} = validateRangeRequestCapabilities({
getResponseHeader,
isHttp: this._manager.isHttp,
rangeChunkSize: this._rangeChunkSize,
disableRange: this._disableRange
});
if (allowRangeRequests) {
this._isRangeSupported = true;
}
this._contentLength = suggestedLength || this._contentLength;
this._filename = extractFilenameFromHeader(getResponseHeader);
if (this._isRangeSupported) {
this._manager.abortRequest(fullRequestXhrId);
}
this._headersReceivedCapability.resolve();
}
_onDone(data) {
if (data) {
if (this._requests.length > 0) {
const requestCapability = this._requests.shift();
requestCapability.resolve({
value: data.chunk,
done: false
});
} else {
this._cachedChunks.push(data.chunk);
}
}
this._done = true;
if (this._cachedChunks.length > 0) {
return;
}
for (const requestCapability of this._requests) {
requestCapability.resolve({
value: void 0,
done: true
});
}
this._requests.length = 0;
}
_onError(status) {
this._storedError = createResponseStatusError(status, this._url);
this._headersReceivedCapability.reject(this._storedError);
for (const requestCapability of this._requests) {
requestCapability.reject(this._storedError);
}
this._requests.length = 0;
this._cachedChunks.length = 0;
}
_onProgress(evt) {
var _a2;
(_a2 = this.onProgress) == null ? void 0 : _a2.call(this, {
loaded: evt.loaded,
total: evt.lengthComputable ? evt.total : this._contentLength
});
}
get filename() {
return this._filename;
}
get isRangeSupported() {
return this._isRangeSupported;
}
get isStreamingSupported() {
return this._isStreamingSupported;
}
get contentLength() {
return this._contentLength;
}
get headersReady() {
return this._headersReceivedCapability.promise;
}
async read() {
if (this._storedError) {
throw this._storedError;
}
if (this._cachedChunks.length > 0) {
const chunk = this._cachedChunks.shift();
return {
value: chunk,
done: false
};
}
if (this._done) {
return {
value: void 0,
done: true
};
}
const requestCapability = Promise.withResolvers();
this._requests.push(requestCapability);
return requestCapability.promise;
}
cancel(reason) {
this._done = true;
this._headersReceivedCapability.reject(reason);
for (const requestCapability of this._requests) {
requestCapability.resolve({
value: void 0,
done: true
});
}
this._requests.length = 0;
if (this._manager.isPendingRequest(this._fullRequestId)) {
this._manager.abortRequest(this._fullRequestId);
}
this._fullRequestReader = null;
}
};
var PDFNetworkStreamRangeRequestReader = class {
constructor(manager, begin, end) {
this._manager = manager;
const args = {
onDone: this._onDone.bind(this),
onError: this._onError.bind(this),
onProgress: this._onProgress.bind(this)
};
this._url = manager.url;
this._requestId = manager.requestRange(begin, end, args);
this._requests = [];
this._queuedChunk = null;
this._done = false;
this._storedError = void 0;
this.onProgress = null;
this.onClosed = null;
}
_close() {
var _a2;
(_a2 = this.onClosed) == null ? void 0 : _a2.call(this, this);
}
_onDone(data) {
const chunk = data.chunk;
if (this._requests.length > 0) {
const requestCapability = this._requests.shift();
requestCapability.resolve({
value: chunk,
done: false
});
} else {
this._queuedChunk = chunk;
}
this._done = true;
for (const requestCapability of this._requests) {
requestCapability.resolve({
value: void 0,
done: true
});
}
this._requests.length = 0;
this._close();
}
_onError(status) {
this._storedError = createResponseStatusError(status, this._url);
for (const requestCapability of this._requests) {
requestCapability.reject(this._storedError);
}
this._requests.length = 0;
this._queuedChunk = null;
}
_onProgress(evt) {
var _a2;
if (!this.isStreamingSupported) {
(_a2 = this.onProgress) == null ? void 0 : _a2.call(this, {
loaded: evt.loaded
});
}
}
get isStreamingSupported() {
return false;
}
async read() {
if (this._storedError) {
throw this._storedError;
}
if (this._queuedChunk !== null) {
const chunk = this._queuedChunk;
this._queuedChunk = null;
return {
value: chunk,
done: false
};
}
if (this._done) {
return {
value: void 0,
done: true
};
}
const requestCapability = Promise.withResolvers();
this._requests.push(requestCapability);
return requestCapability.promise;
}
cancel(reason) {
this._done = true;
for (const requestCapability of this._requests) {
requestCapability.resolve({
value: void 0,
done: true
});
}
this._requests.length = 0;
if (this._manager.isPendingRequest(this._requestId)) {
this._manager.abortRequest(this._requestId);
}
this._close();
}
};
var urlRegex = /^[a-z][a-z0-9\-+.]+:/i;
function parseUrlOrPath(sourceUrl) {
if (urlRegex.test(sourceUrl)) {
return new URL(sourceUrl);
}
const url = NodePackages.get("url");
return new URL(url.pathToFileURL(sourceUrl));
}
function createRequest(url, headers, callback) {
if (url.protocol === "http:") {
const http = NodePackages.get("http");
return http.request(url, {
headers
}, callback);
}
const https = NodePackages.get("https");
return https.request(url, {
headers
}, callback);
}
var PDFNodeStream = class {
constructor(source) {
this.source = source;
this.url = parseUrlOrPath(source.url);
this.isHttp = this.url.protocol === "http:" || this.url.protocol === "https:";
this.isFsUrl = this.url.protocol === "file:";
this.httpHeaders = this.isHttp && source.httpHeaders || {};
this._fullRequestReader = null;
this._rangeRequestReaders = [];
}
get _progressiveDataLength() {
var _a2, _b;
return (_b = (_a2 = this._fullRequestReader) == null ? void 0 : _a2._loaded) != null ? _b : 0;
}
getFullReader() {
assert(!this._fullRequestReader, "PDFNodeStream.getFullReader can only be called once.");
this._fullRequestReader = this.isFsUrl ? new PDFNodeStreamFsFullReader(this) : new PDFNodeStreamFullReader(this);
return this._fullRequestReader;
}
getRangeReader(start, end) {
if (end <= this._progressiveDataLength) {
return null;
}
const rangeReader = this.isFsUrl ? new PDFNodeStreamFsRangeReader(this, start, end) : new PDFNodeStreamRangeReader(this, start, end);
this._rangeRequestReaders.push(rangeReader);
return rangeReader;
}
cancelAllRequests(reason) {
var _a2;
(_a2 = this._fullRequestReader) == null ? void 0 : _a2.cancel(reason);
for (const reader of this._rangeRequestReaders.slice(0)) {
reader.cancel(reason);
}
}
};
var BaseFullReader = class {
constructor(stream) {
this._url = stream.url;
this._done = false;
this._storedError = null;
this.onProgress = null;
const source = stream.source;
this._contentLength = source.length;
this._loaded = 0;
this._filename = null;
this._disableRange = source.disableRange || false;
this._rangeChunkSize = source.rangeChunkSize;
if (!this._rangeChunkSize && !this._disableRange) {
this._disableRange = true;
}
this._isStreamingSupported = !source.disableStream;
this._isRangeSupported = !source.disableRange;
this._readableStream = null;
this._readCapability = Promise.withResolvers();
this._headersCapability = Promise.withResolvers();
}
get headersReady() {
return this._headersCapability.promise;
}
get filename() {
return this._filename;
}
get contentLength() {
return this._contentLength;
}
get isRangeSupported() {
return this._isRangeSupported;
}
get isStreamingSupported() {
return this._isStreamingSupported;
}
async read() {
var _a2;
await this._readCapability.promise;
if (this._done) {
return {
value: void 0,
done: true
};
}
if (this._storedError) {
throw this._storedError;
}
const chunk = this._readableStream.read();
if (chunk === null) {
this._readCapability = Promise.withResolvers();
return this.read();
}
this._loaded += chunk.length;
(_a2 = this.onProgress) == null ? void 0 : _a2.call(this, {
loaded: this._loaded,
total: this._contentLength
});
const buffer = new Uint8Array(chunk).buffer;
return {
value: buffer,
done: false
};
}
cancel(reason) {
if (!this._readableStream) {
this._error(reason);
return;
}
this._readableStream.destroy(reason);
}
_error(reason) {
this._storedError = reason;
this._readCapability.resolve();
}
_setReadableStream(readableStream) {
this._readableStream = readableStream;
readableStream.on("readable", () => {
this._readCapability.resolve();
});
readableStream.on("end", () => {
readableStream.destroy();
this._done = true;
this._readCapability.resolve();
});
readableStream.on("error", (reason) => {
this._error(reason);
});
if (!this._isStreamingSupported && this._isRangeSupported) {
this._error(new AbortException("streaming is disabled"));
}
if (this._storedError) {
this._readableStream.destroy(this._storedError);
}
}
};
var BaseRangeReader = class {
constructor(stream) {
this._url = stream.url;
this._done = false;
this._storedError = null;
this.onProgress = null;
this._loaded = 0;
this._readableStream = null;
this._readCapability = Promise.withResolvers();
const source = stream.source;
this._isStreamingSupported = !source.disableStream;
}
get isStreamingSupported() {
return this._isStreamingSupported;
}
async read() {
var _a2;
await this._readCapability.promise;
if (this._done) {
return {
value: void 0,
done: true
};
}
if (this._storedError) {
throw this._storedError;
}
const chunk = this._readableStream.read();
if (chunk === null) {
this._readCapability = Promise.withResolvers();
return this.read();
}
this._loaded += chunk.length;
(_a2 = this.onProgress) == null ? void 0 : _a2.call(this, {
loaded: this._loaded
});
const buffer = new Uint8Array(chunk).buffer;
return {
value: buffer,
done: false
};
}
cancel(reason) {
if (!this._readableStream) {
this._error(reason);
return;
}
this._readableStream.destroy(reason);
}
_error(reason) {
this._storedError = reason;
this._readCapability.resolve();
}
_setReadableStream(readableStream) {
this._readableStream = readableStream;
readableStream.on("readable", () => {
this._readCapability.resolve();
});
readableStream.on("end", () => {
readableStream.destroy();
this._done = true;
this._readCapability.resolve();
});
readableStream.on("error", (reason) => {
this._error(reason);
});
if (this._storedError) {
this._readableStream.destroy(this._storedError);
}
}
};
var PDFNodeStreamFullReader = class extends BaseFullReader {
constructor(stream) {
super(stream);
const handleResponse = (response) => {
if (response.statusCode === 404) {
const error = new MissingPDFException(`Missing PDF "${this._url}".`);
this._storedError = error;
this._headersCapability.reject(error);
return;
}
this._headersCapability.resolve();
this._setReadableStream(response);
const getResponseHeader = (name) => this._readableStream.headers[name.toLowerCase()];
const {
allowRangeRequests,
suggestedLength
} = validateRangeRequestCapabilities({
getResponseHeader,
isHttp: stream.isHttp,
rangeChunkSize: this._rangeChunkSize,
disableRange: this._disableRange
});
this._isRangeSupported = allowRangeRequests;
this._contentLength = suggestedLength || this._contentLength;
this._filename = extractFilenameFromHeader(getResponseHeader);
};
this._request = createRequest(this._url, stream.httpHeaders, handleResponse);
this._request.on("error", (reason) => {
this._storedError = reason;
this._headersCapability.reject(reason);
});
this._request.end();
}
};
var PDFNodeStreamRangeReader = class extends BaseRangeReader {
constructor(stream, start, end) {
super(stream);
this._httpHeaders = {};
for (const property in stream.httpHeaders) {
const value = stream.httpHeaders[property];
if (value === void 0) {
continue;
}
this._httpHeaders[property] = value;
}
this._httpHeaders.Range = `bytes=${start}-${end - 1}`;
const handleResponse = (response) => {
if (response.statusCode === 404) {
const error = new MissingPDFException(`Missing PDF "${this._url}".`);
this._storedError = error;
return;
}
this._setReadableStream(response);
};
this._request = createRequest(this._url, this._httpHeaders, handleResponse);
this._request.on("error", (reason) => {
this._storedError = reason;
});
this._request.end();
}
};
var PDFNodeStreamFsFullReader = class extends BaseFullReader {
constructor(stream) {
super(stream);
const fs = NodePackages.get("fs");
fs.promises.lstat(this._url).then((stat) => {
this._contentLength = stat.size;
this._setReadableStream(fs.createReadStream(this._url));
this._headersCapability.resolve();
}, (error) => {
if (error.code === "ENOENT") {
error = new MissingPDFException(`Missing PDF "${this._url}".`);
}
this._storedError = error;
this._headersCapability.reject(error);
});
}
};
var PDFNodeStreamFsRangeReader = class extends BaseRangeReader {
constructor(stream, start, end) {
super(stream);
const fs = NodePackages.get("fs");
this._setReadableStream(fs.createReadStream(this._url, {
start,
end: end - 1
}));
}
};
var MAX_TEXT_DIVS_TO_RENDER = 1e5;
var DEFAULT_FONT_SIZE = 30;
var DEFAULT_FONT_ASCENT = 0.8;
var _a, _capability, _container2, _disableProcessItems, _fontInspectorEnabled, _lang, _layoutTextParams, _pageHeight, _pageWidth, _reader, _rootContainer, _rotation, _scale, _styleCache, _textContentItemsStr, _textContentSource, _textDivs, _textDivProperties, _transform, _ascentCache, _canvasContexts, _minFontSize, _pendingTextLayers, _processItems, processItems_fn, _appendText, appendText_fn, _layout, layout_fn, _getCtx, getCtx_fn, _ensureMinFontSizeComputed, ensureMinFontSizeComputed_fn, _getAscent, getAscent_fn;
var _TextLayer = class {
constructor({
textContentSource,
container,
viewport
}) {
__privateAdd(this, _processItems);
__privateAdd(this, _appendText);
__privateAdd(this, _layout);
__privateAdd(this, _capability, Promise.withResolvers());
__privateAdd(this, _container2, null);
__privateAdd(this, _disableProcessItems, false);
__privateAdd(this, _fontInspectorEnabled, !!((_a = globalThis.FontInspector) == null ? void 0 : _a.enabled));
__privateAdd(this, _lang, null);
__privateAdd(this, _layoutTextParams, null);
__privateAdd(this, _pageHeight, 0);
__privateAdd(this, _pageWidth, 0);
__privateAdd(this, _reader, null);
__privateAdd(this, _rootContainer, null);
__privateAdd(this, _rotation, 0);
__privateAdd(this, _scale, 0);
__privateAdd(this, _styleCache, /* @__PURE__ */ Object.create(null));
__privateAdd(this, _textContentItemsStr, []);
__privateAdd(this, _textContentSource, null);
__privateAdd(this, _textDivs, []);
__privateAdd(this, _textDivProperties, /* @__PURE__ */ new WeakMap());
__privateAdd(this, _transform, null);
var _a2;
if (textContentSource instanceof ReadableStream) {
__privateSet(this, _textContentSource, textContentSource);
} else if (typeof textContentSource === "object") {
__privateSet(this, _textContentSource, new ReadableStream({
start(controller) {
controller.enqueue(textContentSource);
controller.close();
}
}));
} else {
throw new Error('No "textContentSource" parameter specified.');
}
__privateSet(this, _container2, __privateSet(this, _rootContainer, container));
__privateSet(this, _scale, viewport.scale * (globalThis.devicePixelRatio || 1));
__privateSet(this, _rotation, viewport.rotation);
__privateSet(this, _layoutTextParams, {
prevFontSize: null,
prevFontFamily: null,
div: null,
properties: null,
ctx: null
});
const {
pageWidth,
pageHeight,
pageX,
pageY
} = viewport.rawDims;
__privateSet(this, _transform, [1, 0, 0, -1, -pageX, pageY + pageHeight]);
__privateSet(this, _pageWidth, pageWidth);
__privateSet(this, _pageHeight, pageHeight);
__privateMethod(_a2 = _TextLayer, _ensureMinFontSizeComputed, ensureMinFontSizeComputed_fn).call(_a2);
setLayerDimensions(container, viewport);
__privateGet(this, _capability).promise.catch(() => {
}).then(() => {
__privateGet(_TextLayer, _pendingTextLayers).delete(this);
__privateSet(this, _layoutTextParams, null);
__privateSet(this, _styleCache, null);
});
}
render() {
const pump = () => {
__privateGet(this, _reader).read().then(({
value,
done
}) => {
var _a2;
if (done) {
__privateGet(this, _capability).resolve();
return;
}
(_a2 = __privateGet(this, _lang)) != null ? _a2 : __privateSet(this, _lang, value.lang);
Object.assign(__privateGet(this, _styleCache), value.styles);
__privateMethod(this, _processItems, processItems_fn).call(this, value.items);
pump();
}, __privateGet(this, _capability).reject);
};
__privateSet(this, _reader, __privateGet(this, _textContentSource).getReader());
__privateGet(_TextLayer, _pendingTextLayers).add(this);
pump();
return __privateGet(this, _capability).promise;
}
update({
viewport,
onBefore = null
}) {
var _a2;
const scale = viewport.scale * (globalThis.devicePixelRatio || 1);
const rotation = viewport.rotation;
if (rotation !== __privateGet(this, _rotation)) {
onBefore == null ? void 0 : onBefore();
__privateSet(this, _rotation, rotation);
setLayerDimensions(__privateGet(this, _rootContainer), {
rotation
});
}
if (scale !== __privateGet(this, _scale)) {
onBefore == null ? void 0 : onBefore();
__privateSet(this, _scale, scale);
const params = {
prevFontSize: null,
prevFontFamily: null,
div: null,
properties: null,
ctx: __privateMethod(_a2 = _TextLayer, _getCtx, getCtx_fn).call(_a2, __privateGet(this, _lang))
};
for (const div of __privateGet(this, _textDivs)) {
params.properties = __privateGet(this, _textDivProperties).get(div);
params.div = div;
__privateMethod(this, _layout, layout_fn).call(this, params);
}
}
}
cancel() {
var _a2;
const abortEx = new AbortException("TextLayer task cancelled.");
(_a2 = __privateGet(this, _reader)) == null ? void 0 : _a2.cancel(abortEx).catch(() => {
});
__privateSet(this, _reader, null);
__privateGet(this, _capability).reject(abortEx);
}
get textDivs() {
return __privateGet(this, _textDivs);
}
get textContentItemsStr() {
return __privateGet(this, _textContentItemsStr);
}
static cleanup() {
if (__privateGet(this, _pendingTextLayers).size > 0) {
return;
}
__privateGet(this, _ascentCache).clear();
for (const {
canvas
} of __privateGet(this, _canvasContexts).values()) {
canvas.remove();
}
__privateGet(this, _canvasContexts).clear();
}
};
var TextLayer = _TextLayer;
_capability = new WeakMap();
_container2 = new WeakMap();
_disableProcessItems = new WeakMap();
_fontInspectorEnabled = new WeakMap();
_lang = new WeakMap();
_layoutTextParams = new WeakMap();
_pageHeight = new WeakMap();
_pageWidth = new WeakMap();
_reader = new WeakMap();
_rootContainer = new WeakMap();
_rotation = new WeakMap();
_scale = new WeakMap();
_styleCache = new WeakMap();
_textContentItemsStr = new WeakMap();
_textContentSource = new WeakMap();
_textDivs = new WeakMap();
_textDivProperties = new WeakMap();
_transform = new WeakMap();
_ascentCache = new WeakMap();
_canvasContexts = new WeakMap();
_minFontSize = new WeakMap();
_pendingTextLayers = new WeakMap();
_processItems = new WeakSet();
processItems_fn = function(items) {
var _a2, _b, _c;
if (__privateGet(this, _disableProcessItems)) {
return;
}
(_c = (_b = __privateGet(this, _layoutTextParams)).ctx) != null ? _c : _b.ctx = __privateMethod(_a2 = _TextLayer, _getCtx, getCtx_fn).call(_a2, __privateGet(this, _lang));
const textDivs = __privateGet(this, _textDivs), textContentItemsStr = __privateGet(this, _textContentItemsStr);
for (const item of items) {
if (textDivs.length > MAX_TEXT_DIVS_TO_RENDER) {
warn("Ignoring additional textDivs for performance reasons.");
__privateSet(this, _disableProcessItems, true);
return;
}
if (item.str === void 0) {
if (item.type === "beginMarkedContentProps" || item.type === "beginMarkedContent") {
const parent = __privateGet(this, _container2);
__privateSet(this, _container2, document.createElement("span"));
__privateGet(this, _container2).classList.add("markedContent");
if (item.id !== null) {
__privateGet(this, _container2).setAttribute("id", `${item.id}`);
}
parent.append(__privateGet(this, _container2));
} else if (item.type === "endMarkedContent") {
__privateSet(this, _container2, __privateGet(this, _container2).parentNode);
}
continue;
}
textContentItemsStr.push(item.str);
__privateMethod(this, _appendText, appendText_fn).call(this, item);
}
};
_appendText = new WeakSet();
appendText_fn = function(geom) {
var _a2;
const textDiv = document.createElement("span");
const textDivProperties = {
angle: 0,
canvasWidth: 0,
hasText: geom.str !== "",
hasEOL: geom.hasEOL,
fontSize: 0
};
__privateGet(this, _textDivs).push(textDiv);
const tx = Util.transform(__privateGet(this, _transform), geom.transform);
let angle = Math.atan2(tx[1], tx[0]);
const style = __privateGet(this, _styleCache)[geom.fontName];
if (style.vertical) {
angle += Math.PI / 2;
}
const fontFamily = __privateGet(this, _fontInspectorEnabled) && style.fontSubstitution || style.fontFamily;
const fontHeight = Math.hypot(tx[2], tx[3]);
const fontAscent = fontHeight * __privateMethod(_a2 = _TextLayer, _getAscent, getAscent_fn).call(_a2, fontFamily, __privateGet(this, _lang));
let left, top;
if (angle === 0) {
left = tx[4];
top = tx[5] - fontAscent;
} else {
left = tx[4] + fontAscent * Math.sin(angle);
top = tx[5] - fontAscent * Math.cos(angle);
}
const scaleFactorStr = "calc(var(--scale-factor)*";
const divStyle = textDiv.style;
if (__privateGet(this, _container2) === __privateGet(this, _rootContainer)) {
divStyle.left = `${(100 * left / __privateGet(this, _pageWidth)).toFixed(2)}%`;
divStyle.top = `${(100 * top / __privateGet(this, _pageHeight)).toFixed(2)}%`;
} else {
divStyle.left = `${scaleFactorStr}${left.toFixed(2)}px)`;
divStyle.top = `${scaleFactorStr}${top.toFixed(2)}px)`;
}
divStyle.fontSize = `${scaleFactorStr}${(__privateGet(_TextLayer, _minFontSize) * fontHeight).toFixed(2)}px)`;
divStyle.fontFamily = fontFamily;
textDivProperties.fontSize = fontHeight;
textDiv.setAttribute("role", "presentation");
textDiv.textContent = geom.str;
textDiv.dir = geom.dir;
if (__privateGet(this, _fontInspectorEnabled)) {
textDiv.dataset.fontName = style.fontSubstitutionLoadedName || geom.fontName;
}
if (angle !== 0) {
textDivProperties.angle = angle * (180 / Math.PI);
}
let shouldScaleText = false;
if (geom.str.length > 1) {
shouldScaleText = true;
} else if (geom.str !== " " && geom.transform[0] !== geom.transform[3]) {
const absScaleX = Math.abs(geom.transform[0]), absScaleY = Math.abs(geom.transform[3]);
if (absScaleX !== absScaleY && Math.max(absScaleX, absScaleY) / Math.min(absScaleX, absScaleY) > 1.5) {
shouldScaleText = true;
}
}
if (shouldScaleText) {
textDivProperties.canvasWidth = style.vertical ? geom.height : geom.width;
}
__privateGet(this, _textDivProperties).set(textDiv, textDivProperties);
__privateGet(this, _layoutTextParams).div = textDiv;
__privateGet(this, _layoutTextParams).properties = textDivProperties;
__privateMethod(this, _layout, layout_fn).call(this, __privateGet(this, _layoutTextParams));
if (textDivProperties.hasText) {
__privateGet(this, _container2).append(textDiv);
}
if (textDivProperties.hasEOL) {
const br = document.createElement("br");
br.setAttribute("role", "presentation");
__privateGet(this, _container2).append(br);
}
};
_layout = new WeakSet();
layout_fn = function(params) {
const {
div,
properties,
ctx,
prevFontSize,
prevFontFamily
} = params;
const {
style
} = div;
let transform = "";
if (__privateGet(_TextLayer, _minFontSize) > 1) {
transform = `scale(${1 / __privateGet(_TextLayer, _minFontSize)})`;
}
if (properties.canvasWidth !== 0 && properties.hasText) {
const {
fontFamily
} = style;
const {
canvasWidth,
fontSize
} = properties;
if (prevFontSize !== fontSize || prevFontFamily !== fontFamily) {
ctx.font = `${fontSize * __privateGet(this, _scale)}px ${fontFamily}`;
params.prevFontSize = fontSize;
params.prevFontFamily = fontFamily;
}
const {
width
} = ctx.measureText(div.textContent);
if (width > 0) {
transform = `scaleX(${canvasWidth * __privateGet(this, _scale) / width}) ${transform}`;
}
}
if (properties.angle !== 0) {
transform = `rotate(${properties.angle}deg) ${transform}`;
}
if (transform.length > 0) {
style.transform = transform;
}
};
_getCtx = new WeakSet();
getCtx_fn = function(lang = null) {
let canvasContext = __privateGet(this, _canvasContexts).get(lang || (lang = ""));
if (!canvasContext) {
const canvas = document.createElement("canvas");
canvas.className = "hiddenCanvasElement";
canvas.lang = lang;
document.body.append(canvas);
canvasContext = canvas.getContext("2d", {
alpha: false,
willReadFrequently: true
});
__privateGet(this, _canvasContexts).set(lang, canvasContext);
}
return canvasContext;
};
_ensureMinFontSizeComputed = new WeakSet();
ensureMinFontSizeComputed_fn = function() {
if (__privateGet(this, _minFontSize) !== null) {
return;
}
const div = document.createElement("div");
div.style.opacity = 0;
div.style.lineHeight = 1;
div.style.fontSize = "1px";
div.style.position = "absolute";
div.textContent = "X";
document.body.append(div);
__privateSet(this, _minFontSize, div.getBoundingClientRect().height);
div.remove();
};
_getAscent = new WeakSet();
getAscent_fn = function(fontFamily, lang) {
const cachedAscent = __privateGet(this, _ascentCache).get(fontFamily);
if (cachedAscent) {
return cachedAscent;
}
const ctx = __privateMethod(this, _getCtx, getCtx_fn).call(this, lang);
const savedFont = ctx.font;
ctx.canvas.width = ctx.canvas.height = DEFAULT_FONT_SIZE;
ctx.font = `${DEFAULT_FONT_SIZE}px ${fontFamily}`;
const metrics = ctx.measureText("");
let ascent = metrics.fontBoundingBoxAscent;
let descent = Math.abs(metrics.fontBoundingBoxDescent);
if (ascent) {
const ratio2 = ascent / (ascent + descent);
__privateGet(this, _ascentCache).set(fontFamily, ratio2);
ctx.canvas.width = ctx.canvas.height = 0;
ctx.font = savedFont;
return ratio2;
}
ctx.strokeStyle = "red";
ctx.clearRect(0, 0, DEFAULT_FONT_SIZE, DEFAULT_FONT_SIZE);
ctx.strokeText("g", 0, 0);
let pixels = ctx.getImageData(0, 0, DEFAULT_FONT_SIZE, DEFAULT_FONT_SIZE).data;
descent = 0;
for (let i = pixels.length - 1 - 3; i >= 0; i -= 4) {
if (pixels[i] > 0) {
descent = Math.ceil(i / 4 / DEFAULT_FONT_SIZE);
break;
}
}
ctx.clearRect(0, 0, DEFAULT_FONT_SIZE, DEFAULT_FONT_SIZE);
ctx.strokeText("A", 0, DEFAULT_FONT_SIZE);
pixels = ctx.getImageData(0, 0, DEFAULT_FONT_SIZE, DEFAULT_FONT_SIZE).data;
ascent = 0;
for (let i = 0, ii = pixels.length; i < ii; i += 4) {
if (pixels[i] > 0) {
ascent = DEFAULT_FONT_SIZE - Math.floor(i / 4 / DEFAULT_FONT_SIZE);
break;
}
}
ctx.canvas.width = ctx.canvas.height = 0;
ctx.font = savedFont;
const ratio = ascent ? ascent / (ascent + descent) : DEFAULT_FONT_ASCENT;
__privateGet(this, _ascentCache).set(fontFamily, ratio);
return ratio;
};
__privateAdd(TextLayer, _getCtx);
__privateAdd(TextLayer, _ensureMinFontSizeComputed);
__privateAdd(TextLayer, _getAscent);
__privateAdd(TextLayer, _ascentCache, /* @__PURE__ */ new Map());
__privateAdd(TextLayer, _canvasContexts, /* @__PURE__ */ new Map());
__privateAdd(TextLayer, _minFontSize, null);
__privateAdd(TextLayer, _pendingTextLayers, /* @__PURE__ */ new Set());
var XfaText = class {
static textContent(xfa) {
const items = [];
const output = {
items,
styles: /* @__PURE__ */ Object.create(null)
};
function walk(node) {
var _a2;
if (!node) {
return;
}
let str = null;
const name = node.name;
if (name === "#text") {
str = node.value;
} else if (!XfaText.shouldBuildText(name)) {
return;
} else if ((_a2 = node == null ? void 0 : node.attributes) == null ? void 0 : _a2.textContent) {
str = node.attributes.textContent;
} else if (node.value) {
str = node.value;
}
if (str !== null) {
items.push({
str
});
}
if (!node.children) {
return;
}
for (const child of node.children) {
walk(child);
}
}
walk(xfa);
return output;
}
static shouldBuildText(name) {
return !(name === "textarea" || name === "input" || name === "option" || name === "select");
}
};
var DEFAULT_RANGE_CHUNK_SIZE = 65536;
var RENDERING_CANCELLED_TIMEOUT = 100;
var DELAYED_CLEANUP_TIMEOUT = 5e3;
var DefaultCanvasFactory = isNodeJS ? NodeCanvasFactory : DOMCanvasFactory;
var DefaultCMapReaderFactory = isNodeJS ? NodeCMapReaderFactory : DOMCMapReaderFactory;
var DefaultFilterFactory = isNodeJS ? NodeFilterFactory : DOMFilterFactory;
var DefaultStandardFontDataFactory = isNodeJS ? NodeStandardFontDataFactory : DOMStandardFontDataFactory;
function getDocument(src = {}) {
var _a2, _b;
if (typeof src === "string" || src instanceof URL) {
src = {
url: src
};
} else if (src instanceof ArrayBuffer || ArrayBuffer.isView(src)) {
src = {
data: src
};
}
const task = new PDFDocumentLoadingTask();
const {
docId
} = task;
const url = src.url ? getUrlProp(src.url) : null;
const data = src.data ? getDataProp(src.data) : null;
const httpHeaders = src.httpHeaders || null;
const withCredentials = src.withCredentials === true;
const password = (_a2 = src.password) != null ? _a2 : null;
const rangeTransport = src.range instanceof PDFDataRangeTransport ? src.range : null;
const rangeChunkSize = Number.isInteger(src.rangeChunkSize) && src.rangeChunkSize > 0 ? src.rangeChunkSize : DEFAULT_RANGE_CHUNK_SIZE;
let worker = src.worker instanceof PDFWorker ? src.worker : null;
const verbosity2 = src.verbosity;
const docBaseUrl = typeof src.docBaseUrl === "string" && !isDataScheme(src.docBaseUrl) ? src.docBaseUrl : null;
const cMapUrl = typeof src.cMapUrl === "string" ? src.cMapUrl : null;
const cMapPacked = src.cMapPacked !== false;
const CMapReaderFactory = src.CMapReaderFactory || DefaultCMapReaderFactory;
const standardFontDataUrl = typeof src.standardFontDataUrl === "string" ? src.standardFontDataUrl : null;
const StandardFontDataFactory = src.StandardFontDataFactory || DefaultStandardFontDataFactory;
const ignoreErrors = src.stopAtErrors !== true;
const maxImageSize = Number.isInteger(src.maxImageSize) && src.maxImageSize > -1 ? src.maxImageSize : -1;
const isEvalSupported2 = src.isEvalSupported !== false;
const isOffscreenCanvasSupported = typeof src.isOffscreenCanvasSupported === "boolean" ? src.isOffscreenCanvasSupported : !isNodeJS;
const canvasMaxAreaInBytes = Number.isInteger(src.canvasMaxAreaInBytes) ? src.canvasMaxAreaInBytes : -1;
const disableFontFace = typeof src.disableFontFace === "boolean" ? src.disableFontFace : isNodeJS;
const fontExtraProperties = src.fontExtraProperties === true;
const enableXfa = src.enableXfa === true;
const ownerDocument = src.ownerDocument || globalThis.document;
const disableRange = src.disableRange === true;
const disableStream = src.disableStream === true;
const disableAutoFetch = src.disableAutoFetch === true;
const pdfBug = src.pdfBug === true;
const enableHWA = src.enableHWA === true;
const length = rangeTransport ? rangeTransport.length : (_b = src.length) != null ? _b : NaN;
const useSystemFonts = typeof src.useSystemFonts === "boolean" ? src.useSystemFonts : !isNodeJS && !disableFontFace;
const useWorkerFetch = typeof src.useWorkerFetch === "boolean" ? src.useWorkerFetch : CMapReaderFactory === DOMCMapReaderFactory && StandardFontDataFactory === DOMStandardFontDataFactory && cMapUrl && standardFontDataUrl && isValidFetchUrl(cMapUrl, document.baseURI) && isValidFetchUrl(standardFontDataUrl, document.baseURI);
const canvasFactory = src.canvasFactory || new DefaultCanvasFactory({
ownerDocument,
enableHWA
});
const filterFactory = src.filterFactory || new DefaultFilterFactory({
docId,
ownerDocument
});
const styleElement = null;
setVerbosityLevel(verbosity2);
const transportFactory = {
canvasFactory,
filterFactory
};
if (!useWorkerFetch) {
transportFactory.cMapReaderFactory = new CMapReaderFactory({
baseUrl: cMapUrl,
isCompressed: cMapPacked
});
transportFactory.standardFontDataFactory = new StandardFontDataFactory({
baseUrl: standardFontDataUrl
});
}
if (!worker) {
const workerParams = {
verbosity: verbosity2,
port: GlobalWorkerOptions.workerPort
};
worker = workerParams.port ? PDFWorker.fromPort(workerParams) : new PDFWorker(workerParams);
task._worker = worker;
}
const docParams = {
docId,
apiVersion: "4.6.82",
data,
password,
disableAutoFetch,
rangeChunkSize,
length,
docBaseUrl,
enableXfa,
evaluatorOptions: {
maxImageSize,
disableFontFace,
ignoreErrors,
isEvalSupported: isEvalSupported2,
isOffscreenCanvasSupported,
canvasMaxAreaInBytes,
fontExtraProperties,
useSystemFonts,
cMapUrl: useWorkerFetch ? cMapUrl : null,
standardFontDataUrl: useWorkerFetch ? standardFontDataUrl : null
}
};
const transportParams = {
disableFontFace,
fontExtraProperties,
ownerDocument,
pdfBug,
styleElement,
loadingParams: {
disableAutoFetch,
enableXfa
}
};
worker.promise.then(function() {
if (task.destroyed) {
throw new Error("Loading aborted");
}
if (worker.destroyed) {
throw new Error("Worker was destroyed");
}
const workerIdPromise = worker.messageHandler.sendWithPromise("GetDocRequest", docParams, data ? [data.buffer] : null);
let networkStream;
if (rangeTransport) {
networkStream = new PDFDataTransportStream(rangeTransport, {
disableRange,
disableStream
});
} else if (!data) {
if (!url) {
throw new Error("getDocument - no `url` parameter provided.");
}
const createPDFNetworkStream = (params) => {
if (isNodeJS) {
const isFetchSupported = function() {
return typeof fetch !== "undefined" && typeof Response !== "undefined" && "body" in Response.prototype;
};
return isFetchSupported() && isValidFetchUrl(params.url) ? new PDFFetchStream(params) : new PDFNodeStream(params);
}
return isValidFetchUrl(params.url) ? new PDFFetchStream(params) : new PDFNetworkStream(params);
};
networkStream = createPDFNetworkStream({
url,
length,
httpHeaders,
withCredentials,
rangeChunkSize,
disableRange,
disableStream
});
}
return workerIdPromise.then((workerId) => {
if (task.destroyed) {
throw new Error("Loading aborted");
}
if (worker.destroyed) {
throw new Error("Worker was destroyed");
}
const messageHandler = new MessageHandler(docId, workerId, worker.port);
const transport = new WorkerTransport(messageHandler, task, networkStream, transportParams, transportFactory);
task._transport = transport;
messageHandler.send("Ready", null);
});
}).catch(task._capability.reject);
return task;
}
function getUrlProp(val) {
if (val instanceof URL) {
return val.href;
}
try {
return new URL(val, window.location).href;
} catch (e) {
if (isNodeJS && typeof val === "string") {
return val;
}
}
throw new Error("Invalid PDF url data: either string or URL-object is expected in the url property.");
}
function getDataProp(val) {
if (isNodeJS && typeof Buffer !== "undefined" && val instanceof Buffer) {
throw new Error("Please provide binary data as `Uint8Array`, rather than `Buffer`.");
}
if (val instanceof Uint8Array && val.byteLength === val.buffer.byteLength) {
return val;
}
if (typeof val === "string") {
return stringToBytes(val);
}
if (val instanceof ArrayBuffer || ArrayBuffer.isView(val) || typeof val === "object" && !isNaN(val == null ? void 0 : val.length)) {
return new Uint8Array(val);
}
throw new Error("Invalid PDF binary data: either TypedArray, string, or array-like object is expected in the data property.");
}
function isRefProxy(ref) {
return typeof ref === "object" && Number.isInteger(ref == null ? void 0 : ref.num) && ref.num >= 0 && Number.isInteger(ref == null ? void 0 : ref.gen) && ref.gen >= 0;
}
var _docId2;
var _PDFDocumentLoadingTask = class {
constructor() {
this._capability = Promise.withResolvers();
this._transport = null;
this._worker = null;
this.docId = `d${__privateWrapper(_PDFDocumentLoadingTask, _docId2)._++}`;
this.destroyed = false;
this.onPassword = null;
this.onProgress = null;
}
get promise() {
return this._capability.promise;
}
async destroy() {
var _a2, _b, _c;
this.destroyed = true;
try {
if ((_a2 = this._worker) == null ? void 0 : _a2.port) {
this._worker._pendingDestroy = true;
}
await ((_b = this._transport) == null ? void 0 : _b.destroy());
} catch (ex) {
if ((_c = this._worker) == null ? void 0 : _c.port) {
delete this._worker._pendingDestroy;
}
throw ex;
}
this._transport = null;
if (this._worker) {
this._worker.destroy();
this._worker = null;
}
}
};
var PDFDocumentLoadingTask = _PDFDocumentLoadingTask;
_docId2 = new WeakMap();
__privateAdd(PDFDocumentLoadingTask, _docId2, 0);
var PDFDataRangeTransport = class {
constructor(length, initialData, progressiveDone = false, contentDispositionFilename = null) {
this.length = length;
this.initialData = initialData;
this.progressiveDone = progressiveDone;
this.contentDispositionFilename = contentDispositionFilename;
this._rangeListeners = [];
this._progressListeners = [];
this._progressiveReadListeners = [];
this._progressiveDoneListeners = [];
this._readyCapability = Promise.withResolvers();
}
addRangeListener(listener) {
this._rangeListeners.push(listener);
}
addProgressListener(listener) {
this._progressListeners.push(listener);
}
addProgressiveReadListener(listener) {
this._progressiveReadListeners.push(listener);
}
addProgressiveDoneListener(listener) {
this._progressiveDoneListeners.push(listener);
}
onDataRange(begin, chunk) {
for (const listener of this._rangeListeners) {
listener(begin, chunk);
}
}
onDataProgress(loaded, total) {
this._readyCapability.promise.then(() => {
for (const listener of this._progressListeners) {
listener(loaded, total);
}
});
}
onDataProgressiveRead(chunk) {
this._readyCapability.promise.then(() => {
for (const listener of this._progressiveReadListeners) {
listener(chunk);
}
});
}
onDataProgressiveDone() {
this._readyCapability.promise.then(() => {
for (const listener of this._progressiveDoneListeners) {
listener();
}
});
}
transportReady() {
this._readyCapability.resolve();
}
requestDataRange(begin, end) {
unreachable("Abstract method PDFDataRangeTransport.requestDataRange");
}
abort() {
}
};
var PDFDocumentProxy = class {
constructor(pdfInfo, transport) {
this._pdfInfo = pdfInfo;
this._transport = transport;
}
get annotationStorage() {
return this._transport.annotationStorage;
}
get filterFactory() {
return this._transport.filterFactory;
}
get numPages() {
return this._pdfInfo.numPages;
}
get fingerprints() {
return this._pdfInfo.fingerprints;
}
get isPureXfa() {
return shadow(this, "isPureXfa", !!this._transport._htmlForXfa);
}
get allXfaHtml() {
return this._transport._htmlForXfa;
}
getPage(pageNumber) {
return this._transport.getPage(pageNumber);
}
getPageIndex(ref) {
return this._transport.getPageIndex(ref);
}
getDestinations() {
return this._transport.getDestinations();
}
getDestination(id) {
return this._transport.getDestination(id);
}
getPageLabels() {
return this._transport.getPageLabels();
}
getPageLayout() {
return this._transport.getPageLayout();
}
getPageMode() {
return this._transport.getPageMode();
}
getViewerPreferences() {
return this._transport.getViewerPreferences();
}
getOpenAction() {
return this._transport.getOpenAction();
}
getAttachments() {
return this._transport.getAttachments();
}
getJSActions() {
return this._transport.getDocJSActions();
}
getOutline() {
return this._transport.getOutline();
}
getOptionalContentConfig({
intent = "display"
} = {}) {
const {
renderingIntent
} = this._transport.getRenderingIntent(intent);
return this._transport.getOptionalContentConfig(renderingIntent);
}
getPermissions() {
return this._transport.getPermissions();
}
getMetadata() {
return this._transport.getMetadata();
}
getMarkInfo() {
return this._transport.getMarkInfo();
}
getData() {
return this._transport.getData();
}
saveDocument() {
return this._transport.saveDocument();
}
getDownloadInfo() {
return this._transport.downloadInfoCapability.promise;
}
cleanup(keepLoadedFonts = false) {
return this._transport.startCleanup(keepLoadedFonts || this.isPureXfa);
}
destroy() {
return this.loadingTask.destroy();
}
cachedPageNumber(ref) {
return this._transport.cachedPageNumber(ref);
}
get loadingParams() {
return this._transport.loadingParams;
}
get loadingTask() {
return this._transport.loadingTask;
}
getFieldObjects() {
return this._transport.getFieldObjects();
}
hasJSActions() {
return this._transport.hasJSActions();
}
getCalculationOrderIds() {
return this._transport.getCalculationOrderIds();
}
};
var _delayedCleanupTimeout, _pendingCleanup, _tryCleanup, tryCleanup_fn, _abortDelayedCleanup, abortDelayedCleanup_fn;
var PDFPageProxy = class {
constructor(pageIndex, pageInfo, transport, pdfBug = false) {
__privateAdd(this, _tryCleanup);
__privateAdd(this, _abortDelayedCleanup);
__privateAdd(this, _delayedCleanupTimeout, null);
__privateAdd(this, _pendingCleanup, false);
this._pageIndex = pageIndex;
this._pageInfo = pageInfo;
this._transport = transport;
this._stats = pdfBug ? new StatTimer() : null;
this._pdfBug = pdfBug;
this.commonObjs = transport.commonObjs;
this.objs = new PDFObjects();
this._maybeCleanupAfterRender = false;
this._intentStates = /* @__PURE__ */ new Map();
this.destroyed = false;
}
get pageNumber() {
return this._pageIndex + 1;
}
get rotate() {
return this._pageInfo.rotate;
}
get ref() {
return this._pageInfo.ref;
}
get userUnit() {
return this._pageInfo.userUnit;
}
get view() {
return this._pageInfo.view;
}
getViewport({
scale,
rotation = this.rotate,
offsetX = 0,
offsetY = 0,
dontFlip = false
} = {}) {
return new PageViewport({
viewBox: this.view,
scale,
rotation,
offsetX,
offsetY,
dontFlip
});
}
getAnnotations({
intent = "display"
} = {}) {
const {
renderingIntent
} = this._transport.getRenderingIntent(intent);
return this._transport.getAnnotations(this._pageIndex, renderingIntent);
}
getJSActions() {
return this._transport.getPageJSActions(this._pageIndex);
}
get filterFactory() {
return this._transport.filterFactory;
}
get isPureXfa() {
return shadow(this, "isPureXfa", !!this._transport._htmlForXfa);
}
async getXfa() {
var _a2;
return ((_a2 = this._transport._htmlForXfa) == null ? void 0 : _a2.children[this._pageIndex]) || null;
}
render({
canvasContext,
viewport,
intent = "display",
annotationMode = AnnotationMode.ENABLE,
transform = null,
background = null,
optionalContentConfigPromise = null,
annotationCanvasMap = null,
pageColors = null,
printAnnotationStorage = null,
isEditing = false
}) {
var _a2, _b;
(_a2 = this._stats) == null ? void 0 : _a2.time("Overall");
const intentArgs = this._transport.getRenderingIntent(intent, annotationMode, printAnnotationStorage, isEditing);
const {
renderingIntent,
cacheKey
} = intentArgs;
__privateSet(this, _pendingCleanup, false);
__privateMethod(this, _abortDelayedCleanup, abortDelayedCleanup_fn).call(this);
optionalContentConfigPromise || (optionalContentConfigPromise = this._transport.getOptionalContentConfig(renderingIntent));
let intentState = this._intentStates.get(cacheKey);
if (!intentState) {
intentState = /* @__PURE__ */ Object.create(null);
this._intentStates.set(cacheKey, intentState);
}
if (intentState.streamReaderCancelTimeout) {
clearTimeout(intentState.streamReaderCancelTimeout);
intentState.streamReaderCancelTimeout = null;
}
const intentPrint = !!(renderingIntent & RenderingIntentFlag.PRINT);
if (!intentState.displayReadyCapability) {
intentState.displayReadyCapability = Promise.withResolvers();
intentState.operatorList = {
fnArray: [],
argsArray: [],
lastChunk: false,
separateAnnots: null
};
(_b = this._stats) == null ? void 0 : _b.time("Page Request");
this._pumpOperatorList(intentArgs);
}
const complete = (error) => {
var _a3;
intentState.renderTasks.delete(internalRenderTask);
if (this._maybeCleanupAfterRender || intentPrint) {
__privateSet(this, _pendingCleanup, true);
}
__privateMethod(this, _tryCleanup, tryCleanup_fn).call(this, !intentPrint);
if (error) {
internalRenderTask.capability.reject(error);
this._abortOperatorList({
intentState,
reason: error instanceof Error ? error : new Error(error)
});
} else {
internalRenderTask.capability.resolve();
}
if (this._stats) {
this._stats.timeEnd("Rendering");
this._stats.timeEnd("Overall");
if ((_a3 = globalThis.Stats) == null ? void 0 : _a3.enabled) {
globalThis.Stats.add(this.pageNumber, this._stats);
}
}
};
const internalRenderTask = new InternalRenderTask({
callback: complete,
params: {
canvasContext,
viewport,
transform,
background
},
objs: this.objs,
commonObjs: this.commonObjs,
annotationCanvasMap,
operatorList: intentState.operatorList,
pageIndex: this._pageIndex,
canvasFactory: this._transport.canvasFactory,
filterFactory: this._transport.filterFactory,
useRequestAnimationFrame: !intentPrint,
pdfBug: this._pdfBug,
pageColors
});
(intentState.renderTasks || (intentState.renderTasks = /* @__PURE__ */ new Set())).add(internalRenderTask);
const renderTask = internalRenderTask.task;
Promise.all([intentState.displayReadyCapability.promise, optionalContentConfigPromise]).then(([transparency, optionalContentConfig]) => {
var _a3;
if (this.destroyed) {
complete();
return;
}
(_a3 = this._stats) == null ? void 0 : _a3.time("Rendering");
if (!(optionalContentConfig.renderingIntent & renderingIntent)) {
throw new Error("Must use the same `intent`-argument when calling the `PDFPageProxy.render` and `PDFDocumentProxy.getOptionalContentConfig` methods.");
}
internalRenderTask.initializeGraphics({
transparency,
optionalContentConfig
});
internalRenderTask.operatorListChanged();
}).catch(complete);
return renderTask;
}
getOperatorList({
intent = "display",
annotationMode = AnnotationMode.ENABLE,
printAnnotationStorage = null,
isEditing = false
} = {}) {
var _a2;
function operatorListChanged() {
if (intentState.operatorList.lastChunk) {
intentState.opListReadCapability.resolve(intentState.operatorList);
intentState.renderTasks.delete(opListTask);
}
}
const intentArgs = this._transport.getRenderingIntent(intent, annotationMode, printAnnotationStorage, isEditing, true);
let intentState = this._intentStates.get(intentArgs.cacheKey);
if (!intentState) {
intentState = /* @__PURE__ */ Object.create(null);
this._intentStates.set(intentArgs.cacheKey, intentState);
}
let opListTask;
if (!intentState.opListReadCapability) {
opListTask = /* @__PURE__ */ Object.create(null);
opListTask.operatorListChanged = operatorListChanged;
intentState.opListReadCapability = Promise.withResolvers();
(intentState.renderTasks || (intentState.renderTasks = /* @__PURE__ */ new Set())).add(opListTask);
intentState.operatorList = {
fnArray: [],
argsArray: [],
lastChunk: false,
separateAnnots: null
};
(_a2 = this._stats) == null ? void 0 : _a2.time("Page Request");
this._pumpOperatorList(intentArgs);
}
return intentState.opListReadCapability.promise;
}
streamTextContent({
includeMarkedContent = false,
disableNormalization = false
} = {}) {
const TEXT_CONTENT_CHUNK_SIZE = 100;
return this._transport.messageHandler.sendWithStream("GetTextContent", {
pageIndex: this._pageIndex,
includeMarkedContent: includeMarkedContent === true,
disableNormalization: disableNormalization === true
}, {
highWaterMark: TEXT_CONTENT_CHUNK_SIZE,
size(textContent) {
return textContent.items.length;
}
});
}
getTextContent(params = {}) {
if (this._transport._htmlForXfa) {
return this.getXfa().then((xfa) => XfaText.textContent(xfa));
}
const readableStream = this.streamTextContent(params);
return new Promise(function(resolve, reject) {
function pump() {
reader.read().then(function({
value,
done
}) {
var _a2;
if (done) {
resolve(textContent);
return;
}
(_a2 = textContent.lang) != null ? _a2 : textContent.lang = value.lang;
Object.assign(textContent.styles, value.styles);
textContent.items.push(...value.items);
pump();
}, reject);
}
const reader = readableStream.getReader();
const textContent = {
items: [],
styles: /* @__PURE__ */ Object.create(null),
lang: null
};
pump();
});
}
getStructTree() {
return this._transport.getStructTree(this._pageIndex);
}
_destroy() {
this.destroyed = true;
const waitOn = [];
for (const intentState of this._intentStates.values()) {
this._abortOperatorList({
intentState,
reason: new Error("Page was destroyed."),
force: true
});
if (intentState.opListReadCapability) {
continue;
}
for (const internalRenderTask of intentState.renderTasks) {
waitOn.push(internalRenderTask.completed);
internalRenderTask.cancel();
}
}
this.objs.clear();
__privateSet(this, _pendingCleanup, false);
__privateMethod(this, _abortDelayedCleanup, abortDelayedCleanup_fn).call(this);
return Promise.all(waitOn);
}
cleanup(resetStats = false) {
__privateSet(this, _pendingCleanup, true);
const success = __privateMethod(this, _tryCleanup, tryCleanup_fn).call(this, false);
if (resetStats && success) {
this._stats && (this._stats = new StatTimer());
}
return success;
}
_startRenderPage(transparency, cacheKey) {
var _a2, _b;
const intentState = this._intentStates.get(cacheKey);
if (!intentState) {
return;
}
(_a2 = this._stats) == null ? void 0 : _a2.timeEnd("Page Request");
(_b = intentState.displayReadyCapability) == null ? void 0 : _b.resolve(transparency);
}
_renderPageChunk(operatorListChunk, intentState) {
for (let i = 0, ii = operatorListChunk.length; i < ii; i++) {
intentState.operatorList.fnArray.push(operatorListChunk.fnArray[i]);
intentState.operatorList.argsArray.push(operatorListChunk.argsArray[i]);
}
intentState.operatorList.lastChunk = operatorListChunk.lastChunk;
intentState.operatorList.separateAnnots = operatorListChunk.separateAnnots;
for (const internalRenderTask of intentState.renderTasks) {
internalRenderTask.operatorListChanged();
}
if (operatorListChunk.lastChunk) {
__privateMethod(this, _tryCleanup, tryCleanup_fn).call(this, true);
}
}
_pumpOperatorList({
renderingIntent,
cacheKey,
annotationStorageSerializable,
modifiedIds
}) {
const {
map,
transfer
} = annotationStorageSerializable;
const readableStream = this._transport.messageHandler.sendWithStream("GetOperatorList", {
pageIndex: this._pageIndex,
intent: renderingIntent,
cacheKey,
annotationStorage: map,
modifiedIds
}, transfer);
const reader = readableStream.getReader();
const intentState = this._intentStates.get(cacheKey);
intentState.streamReader = reader;
const pump = () => {
reader.read().then(({
value,
done
}) => {
if (done) {
intentState.streamReader = null;
return;
}
if (this._transport.destroyed) {
return;
}
this._renderPageChunk(value, intentState);
pump();
}, (reason) => {
intentState.streamReader = null;
if (this._transport.destroyed) {
return;
}
if (intentState.operatorList) {
intentState.operatorList.lastChunk = true;
for (const internalRenderTask of intentState.renderTasks) {
internalRenderTask.operatorListChanged();
}
__privateMethod(this, _tryCleanup, tryCleanup_fn).call(this, true);
}
if (intentState.displayReadyCapability) {
intentState.displayReadyCapability.reject(reason);
} else if (intentState.opListReadCapability) {
intentState.opListReadCapability.reject(reason);
} else {
throw reason;
}
});
};
pump();
}
_abortOperatorList({
intentState,
reason,
force = false
}) {
if (!intentState.streamReader) {
return;
}
if (intentState.streamReaderCancelTimeout) {
clearTimeout(intentState.streamReaderCancelTimeout);
intentState.streamReaderCancelTimeout = null;
}
if (!force) {
if (intentState.renderTasks.size > 0) {
return;
}
if (reason instanceof RenderingCancelledException) {
let delay = RENDERING_CANCELLED_TIMEOUT;
if (reason.extraDelay > 0 && reason.extraDelay < 1e3) {
delay += reason.extraDelay;
}
intentState.streamReaderCancelTimeout = setTimeout(() => {
intentState.streamReaderCancelTimeout = null;
this._abortOperatorList({
intentState,
reason,
force: true
});
}, delay);
return;
}
}
intentState.streamReader.cancel(new AbortException(reason.message)).catch(() => {
});
intentState.streamReader = null;
if (this._transport.destroyed) {
return;
}
for (const [curCacheKey, curIntentState] of this._intentStates) {
if (curIntentState === intentState) {
this._intentStates.delete(curCacheKey);
break;
}
}
this.cleanup();
}
get stats() {
return this._stats;
}
};
_delayedCleanupTimeout = new WeakMap();
_pendingCleanup = new WeakMap();
_tryCleanup = new WeakSet();
tryCleanup_fn = function(delayed = false) {
__privateMethod(this, _abortDelayedCleanup, abortDelayedCleanup_fn).call(this);
if (!__privateGet(this, _pendingCleanup) || this.destroyed) {
return false;
}
if (delayed) {
__privateSet(this, _delayedCleanupTimeout, setTimeout(() => {
__privateSet(this, _delayedCleanupTimeout, null);
__privateMethod(this, _tryCleanup, tryCleanup_fn).call(this, false);
}, DELAYED_CLEANUP_TIMEOUT));
return false;
}
for (const {
renderTasks,
operatorList
} of this._intentStates.values()) {
if (renderTasks.size > 0 || !operatorList.lastChunk) {
return false;
}
}
this._intentStates.clear();
this.objs.clear();
__privateSet(this, _pendingCleanup, false);
return true;
};
_abortDelayedCleanup = new WeakSet();
abortDelayedCleanup_fn = function() {
if (__privateGet(this, _delayedCleanupTimeout)) {
clearTimeout(__privateGet(this, _delayedCleanupTimeout));
__privateSet(this, _delayedCleanupTimeout, null);
}
};
var _listeners, _deferred;
var LoopbackPort = class {
constructor() {
__privateAdd(this, _listeners, /* @__PURE__ */ new Set());
__privateAdd(this, _deferred, Promise.resolve());
}
postMessage(obj, transfer) {
const event = {
data: structuredClone(obj, transfer ? {
transfer
} : null)
};
__privateGet(this, _deferred).then(() => {
for (const listener of __privateGet(this, _listeners)) {
listener.call(this, event);
}
});
}
addEventListener(name, listener) {
__privateGet(this, _listeners).add(listener);
}
removeEventListener(name, listener) {
__privateGet(this, _listeners).delete(listener);
}
terminate() {
__privateGet(this, _listeners).clear();
}
};
_listeners = new WeakMap();
_deferred = new WeakMap();
var _fakeWorkerId, _isWorkerDisabled, _workerPorts, _resolve, resolve_fn, _mainThreadWorkerMessageHandler, mainThreadWorkerMessageHandler_get;
var _PDFWorker = class {
constructor({
name = null,
port = null,
verbosity: verbosity2 = getVerbosityLevel()
} = {}) {
__privateAdd(this, _resolve);
var _a2;
this.name = name;
this.destroyed = false;
this.verbosity = verbosity2;
this._readyCapability = Promise.withResolvers();
this._port = null;
this._webWorker = null;
this._messageHandler = null;
if (port) {
if ((_a2 = __privateGet(_PDFWorker, _workerPorts)) == null ? void 0 : _a2.has(port)) {
throw new Error("Cannot use more than one PDFWorker per port.");
}
(__privateGet(_PDFWorker, _workerPorts) || __privateSet(_PDFWorker, _workerPorts, /* @__PURE__ */ new WeakMap())).set(port, this);
this._initializeFromPort(port);
return;
}
this._initialize();
}
get promise() {
if (isNodeJS) {
return Promise.all([NodePackages.promise, this._readyCapability.promise]);
}
return this._readyCapability.promise;
}
get port() {
return this._port;
}
get messageHandler() {
return this._messageHandler;
}
_initializeFromPort(port) {
this._port = port;
this._messageHandler = new MessageHandler("main", "worker", port);
this._messageHandler.on("ready", function() {
});
__privateMethod(this, _resolve, resolve_fn).call(this);
}
_initialize() {
if (__privateGet(_PDFWorker, _isWorkerDisabled) || __privateGet(_PDFWorker, _mainThreadWorkerMessageHandler, mainThreadWorkerMessageHandler_get)) {
this._setupFakeWorker();
return;
}
let {
workerSrc
} = _PDFWorker;
try {
if (!_PDFWorker._isSameOrigin(window.location.href, workerSrc)) {
workerSrc = _PDFWorker._createCDNWrapper(new URL(workerSrc, window.location).href);
}
const worker = new Worker(workerSrc, {
type: "module"
});
const messageHandler = new MessageHandler("main", "worker", worker);
const terminateEarly = () => {
ac.abort();
messageHandler.destroy();
worker.terminate();
if (this.destroyed) {
this._readyCapability.reject(new Error("Worker was destroyed"));
} else {
this._setupFakeWorker();
}
};
const ac = new AbortController();
worker.addEventListener("error", () => {
if (!this._webWorker) {
terminateEarly();
}
}, {
signal: ac.signal
});
messageHandler.on("test", (data) => {
ac.abort();
if (this.destroyed || !data) {
terminateEarly();
return;
}
this._messageHandler = messageHandler;
this._port = worker;
this._webWorker = worker;
__privateMethod(this, _resolve, resolve_fn).call(this);
});
messageHandler.on("ready", (data) => {
ac.abort();
if (this.destroyed) {
terminateEarly();
return;
}
try {
sendTest();
} catch (e) {
this._setupFakeWorker();
}
});
const sendTest = () => {
const testObj = new Uint8Array();
messageHandler.send("test", testObj, [testObj.buffer]);
};
sendTest();
return;
} catch (e) {
info("The worker has been disabled.");
}
this._setupFakeWorker();
}
_setupFakeWorker() {
if (!__privateGet(_PDFWorker, _isWorkerDisabled)) {
warn("Setting up fake worker.");
__privateSet(_PDFWorker, _isWorkerDisabled, true);
}
_PDFWorker._setupFakeWorkerGlobal.then((WorkerMessageHandler) => {
if (this.destroyed) {
this._readyCapability.reject(new Error("Worker was destroyed"));
return;
}
const port = new LoopbackPort();
this._port = port;
const id = `fake${__privateWrapper(_PDFWorker, _fakeWorkerId)._++}`;
const workerHandler = new MessageHandler(id + "_worker", id, port);
WorkerMessageHandler.setup(workerHandler, port);
this._messageHandler = new MessageHandler(id, id + "_worker", port);
__privateMethod(this, _resolve, resolve_fn).call(this);
}).catch((reason) => {
this._readyCapability.reject(new Error(`Setting up fake worker failed: "${reason.message}".`));
});
}
destroy() {
var _a2;
this.destroyed = true;
if (this._webWorker) {
this._webWorker.terminate();
this._webWorker = null;
}
(_a2 = __privateGet(_PDFWorker, _workerPorts)) == null ? void 0 : _a2.delete(this._port);
this._port = null;
if (this._messageHandler) {
this._messageHandler.destroy();
this._messageHandler = null;
}
}
static fromPort(params) {
var _a2;
if (!(params == null ? void 0 : params.port)) {
throw new Error("PDFWorker.fromPort - invalid method signature.");
}
const cachedPort = (_a2 = __privateGet(this, _workerPorts)) == null ? void 0 : _a2.get(params.port);
if (cachedPort) {
if (cachedPort._pendingDestroy) {
throw new Error("PDFWorker.fromPort - the worker is being destroyed.\nPlease remember to await `PDFDocumentLoadingTask.destroy()`-calls.");
}
return cachedPort;
}
return new _PDFWorker(params);
}
static get workerSrc() {
if (GlobalWorkerOptions.workerSrc) {
return GlobalWorkerOptions.workerSrc;
}
throw new Error('No "GlobalWorkerOptions.workerSrc" specified.');
}
static get _setupFakeWorkerGlobal() {
const loader = async () => {
if (__privateGet(this, _mainThreadWorkerMessageHandler, mainThreadWorkerMessageHandler_get)) {
return __privateGet(this, _mainThreadWorkerMessageHandler, mainThreadWorkerMessageHandler_get);
}
const worker = await import(
/*webpackIgnore: true*/
this.workerSrc
);
return worker.WorkerMessageHandler;
};
return shadow(this, "_setupFakeWorkerGlobal", loader());
}
};
var PDFWorker = _PDFWorker;
_fakeWorkerId = new WeakMap();
_isWorkerDisabled = new WeakMap();
_workerPorts = new WeakMap();
_resolve = new WeakSet();
resolve_fn = function() {
this._readyCapability.resolve();
this._messageHandler.send("configure", {
verbosity: this.verbosity
});
};
_mainThreadWorkerMessageHandler = new WeakSet();
mainThreadWorkerMessageHandler_get = function() {
var _a2;
try {
return ((_a2 = globalThis.pdfjsWorker) == null ? void 0 : _a2.WorkerMessageHandler) || null;
} catch (e) {
return null;
}
};
__privateAdd(PDFWorker, _mainThreadWorkerMessageHandler);
__privateAdd(PDFWorker, _fakeWorkerId, 0);
__privateAdd(PDFWorker, _isWorkerDisabled, false);
__privateAdd(PDFWorker, _workerPorts, void 0);
(() => {
if (isNodeJS) {
__privateSet(_PDFWorker, _isWorkerDisabled, true);
GlobalWorkerOptions.workerSrc || (GlobalWorkerOptions.workerSrc = "./pdf.worker.mjs");
}
_PDFWorker._isSameOrigin = (baseUrl, otherUrl) => {
let base;
try {
base = new URL(baseUrl);
if (!base.origin || base.origin === "null") {
return false;
}
} catch (e) {
return false;
}
const other = new URL(otherUrl, base);
return base.origin === other.origin;
};
_PDFWorker._createCDNWrapper = (url) => {
const wrapper = `await import("${url}");`;
return URL.createObjectURL(new Blob([wrapper], {
type: "text/javascript"
}));
};
})();
var _methodPromises, _pageCache, _pagePromises, _pageRefCache, _passwordCapability, _cacheSimpleMethod, cacheSimpleMethod_fn;
var WorkerTransport = class {
constructor(messageHandler, loadingTask, networkStream, params, factory) {
__privateAdd(this, _cacheSimpleMethod);
__privateAdd(this, _methodPromises, /* @__PURE__ */ new Map());
__privateAdd(this, _pageCache, /* @__PURE__ */ new Map());
__privateAdd(this, _pagePromises, /* @__PURE__ */ new Map());
__privateAdd(this, _pageRefCache, /* @__PURE__ */ new Map());
__privateAdd(this, _passwordCapability, null);
this.messageHandler = messageHandler;
this.loadingTask = loadingTask;
this.commonObjs = new PDFObjects();
this.fontLoader = new FontLoader({
ownerDocument: params.ownerDocument,
styleElement: params.styleElement
});
this.loadingParams = params.loadingParams;
this._params = params;
this.canvasFactory = factory.canvasFactory;
this.filterFactory = factory.filterFactory;
this.cMapReaderFactory = factory.cMapReaderFactory;
this.standardFontDataFactory = factory.standardFontDataFactory;
this.destroyed = false;
this.destroyCapability = null;
this._networkStream = networkStream;
this._fullReader = null;
this._lastProgress = null;
this.downloadInfoCapability = Promise.withResolvers();
this.setupMessageHandler();
}
get annotationStorage() {
return shadow(this, "annotationStorage", new AnnotationStorage());
}
getRenderingIntent(intent, annotationMode = AnnotationMode.ENABLE, printAnnotationStorage = null, isEditing = false, isOpList = false) {
let renderingIntent = RenderingIntentFlag.DISPLAY;
let annotationStorageSerializable = SerializableEmpty;
switch (intent) {
case "any":
renderingIntent = RenderingIntentFlag.ANY;
break;
case "display":
break;
case "print":
renderingIntent = RenderingIntentFlag.PRINT;
break;
default:
warn(`getRenderingIntent - invalid intent: ${intent}`);
}
const annotationStorage = renderingIntent & RenderingIntentFlag.PRINT && printAnnotationStorage instanceof PrintAnnotationStorage ? printAnnotationStorage : this.annotationStorage;
switch (annotationMode) {
case AnnotationMode.DISABLE:
renderingIntent += RenderingIntentFlag.ANNOTATIONS_DISABLE;
break;
case AnnotationMode.ENABLE:
break;
case AnnotationMode.ENABLE_FORMS:
renderingIntent += RenderingIntentFlag.ANNOTATIONS_FORMS;
break;
case AnnotationMode.ENABLE_STORAGE:
renderingIntent += RenderingIntentFlag.ANNOTATIONS_STORAGE;
annotationStorageSerializable = annotationStorage.serializable;
break;
default:
warn(`getRenderingIntent - invalid annotationMode: ${annotationMode}`);
}
if (isEditing) {
renderingIntent += RenderingIntentFlag.IS_EDITING;
}
if (isOpList) {
renderingIntent += RenderingIntentFlag.OPLIST;
}
const {
ids: modifiedIds,
hash: modifiedIdsHash
} = annotationStorage.modifiedIds;
const cacheKeyBuf = [renderingIntent, annotationStorageSerializable.hash, modifiedIdsHash];
return {
renderingIntent,
cacheKey: cacheKeyBuf.join("_"),
annotationStorageSerializable,
modifiedIds
};
}
destroy() {
var _a2;
if (this.destroyCapability) {
return this.destroyCapability.promise;
}
this.destroyed = true;
this.destroyCapability = Promise.withResolvers();
(_a2 = __privateGet(this, _passwordCapability)) == null ? void 0 : _a2.reject(new Error("Worker was destroyed during onPassword callback"));
const waitOn = [];
for (const page of __privateGet(this, _pageCache).values()) {
waitOn.push(page._destroy());
}
__privateGet(this, _pageCache).clear();
__privateGet(this, _pagePromises).clear();
__privateGet(this, _pageRefCache).clear();
if (this.hasOwnProperty("annotationStorage")) {
this.annotationStorage.resetModified();
}
const terminated = this.messageHandler.sendWithPromise("Terminate", null);
waitOn.push(terminated);
Promise.all(waitOn).then(() => {
var _a3;
this.commonObjs.clear();
this.fontLoader.clear();
__privateGet(this, _methodPromises).clear();
this.filterFactory.destroy();
TextLayer.cleanup();
(_a3 = this._networkStream) == null ? void 0 : _a3.cancelAllRequests(new AbortException("Worker was terminated."));
if (this.messageHandler) {
this.messageHandler.destroy();
this.messageHandler = null;
}
this.destroyCapability.resolve();
}, this.destroyCapability.reject);
return this.destroyCapability.promise;
}
setupMessageHandler() {
const {
messageHandler,
loadingTask
} = this;
messageHandler.on("GetReader", (data, sink) => {
assert(this._networkStream, "GetReader - no `IPDFStream` instance available.");
this._fullReader = this._networkStream.getFullReader();
this._fullReader.onProgress = (evt) => {
this._lastProgress = {
loaded: evt.loaded,
total: evt.total
};
};
sink.onPull = () => {
this._fullReader.read().then(function({
value,
done
}) {
if (done) {
sink.close();
return;
}
assert(value instanceof ArrayBuffer, "GetReader - expected an ArrayBuffer.");
sink.enqueue(new Uint8Array(value), 1, [value]);
}).catch((reason) => {
sink.error(reason);
});
};
sink.onCancel = (reason) => {
this._fullReader.cancel(reason);
sink.ready.catch((readyReason) => {
if (this.destroyed) {
return;
}
throw readyReason;
});
};
});
messageHandler.on("ReaderHeadersReady", (data) => {
const headersCapability = Promise.withResolvers();
const fullReader = this._fullReader;
fullReader.headersReady.then(() => {
var _a2;
if (!fullReader.isStreamingSupported || !fullReader.isRangeSupported) {
if (this._lastProgress) {
(_a2 = loadingTask.onProgress) == null ? void 0 : _a2.call(loadingTask, this._lastProgress);
}
fullReader.onProgress = (evt) => {
var _a3;
(_a3 = loadingTask.onProgress) == null ? void 0 : _a3.call(loadingTask, {
loaded: evt.loaded,
total: evt.total
});
};
}
headersCapability.resolve({
isStreamingSupported: fullReader.isStreamingSupported,
isRangeSupported: fullReader.isRangeSupported,
contentLength: fullReader.contentLength
});
}, headersCapability.reject);
return headersCapability.promise;
});
messageHandler.on("GetRangeReader", (data, sink) => {
assert(this._networkStream, "GetRangeReader - no `IPDFStream` instance available.");
const rangeReader = this._networkStream.getRangeReader(data.begin, data.end);
if (!rangeReader) {
sink.close();
return;
}
sink.onPull = () => {
rangeReader.read().then(function({
value,
done
}) {
if (done) {
sink.close();
return;
}
assert(value instanceof ArrayBuffer, "GetRangeReader - expected an ArrayBuffer.");
sink.enqueue(new Uint8Array(value), 1, [value]);
}).catch((reason) => {
sink.error(reason);
});
};
sink.onCancel = (reason) => {
rangeReader.cancel(reason);
sink.ready.catch((readyReason) => {
if (this.destroyed) {
return;
}
throw readyReason;
});
};
});
messageHandler.on("GetDoc", ({
pdfInfo
}) => {
this._numPages = pdfInfo.numPages;
this._htmlForXfa = pdfInfo.htmlForXfa;
delete pdfInfo.htmlForXfa;
loadingTask._capability.resolve(new PDFDocumentProxy(pdfInfo, this));
});
messageHandler.on("DocException", function(ex) {
let reason;
switch (ex.name) {
case "PasswordException":
reason = new PasswordException(ex.message, ex.code);
break;
case "InvalidPDFException":
reason = new InvalidPDFException(ex.message);
break;
case "MissingPDFException":
reason = new MissingPDFException(ex.message);
break;
case "UnexpectedResponseException":
reason = new UnexpectedResponseException(ex.message, ex.status);
break;
case "UnknownErrorException":
reason = new UnknownErrorException(ex.message, ex.details);
break;
default:
unreachable("DocException - expected a valid Error.");
}
loadingTask._capability.reject(reason);
});
messageHandler.on("PasswordRequest", (exception) => {
__privateSet(this, _passwordCapability, Promise.withResolvers());
if (loadingTask.onPassword) {
const updatePassword = (password) => {
if (password instanceof Error) {
__privateGet(this, _passwordCapability).reject(password);
} else {
__privateGet(this, _passwordCapability).resolve({
password
});
}
};
try {
loadingTask.onPassword(updatePassword, exception.code);
} catch (ex) {
__privateGet(this, _passwordCapability).reject(ex);
}
} else {
__privateGet(this, _passwordCapability).reject(new PasswordException(exception.message, exception.code));
}
return __privateGet(this, _passwordCapability).promise;
});
messageHandler.on("DataLoaded", (data) => {
var _a2;
(_a2 = loadingTask.onProgress) == null ? void 0 : _a2.call(loadingTask, {
loaded: data.length,
total: data.length
});
this.downloadInfoCapability.resolve(data);
});
messageHandler.on("StartRenderPage", (data) => {
if (this.destroyed) {
return;
}
const page = __privateGet(this, _pageCache).get(data.pageIndex);
page._startRenderPage(data.transparency, data.cacheKey);
});
messageHandler.on("commonobj", ([id, type, exportedData]) => {
var _a2;
if (this.destroyed) {
return null;
}
if (this.commonObjs.has(id)) {
return null;
}
switch (type) {
case "Font":
const {
disableFontFace,
fontExtraProperties,
pdfBug
} = this._params;
if ("error" in exportedData) {
const exportedError = exportedData.error;
warn(`Error during font loading: ${exportedError}`);
this.commonObjs.resolve(id, exportedError);
break;
}
const inspectFont = pdfBug && ((_a2 = globalThis.FontInspector) == null ? void 0 : _a2.enabled) ? (font2, url) => globalThis.FontInspector.fontAdded(font2, url) : null;
const font = new FontFaceObject(exportedData, {
disableFontFace,
inspectFont
});
this.fontLoader.bind(font).catch(() => messageHandler.sendWithPromise("FontFallback", {
id
})).finally(() => {
if (!fontExtraProperties && font.data) {
font.data = null;
}
this.commonObjs.resolve(id, font);
});
break;
case "CopyLocalImage":
const {
imageRef
} = exportedData;
assert(imageRef, "The imageRef must be defined.");
for (const pageProxy of __privateGet(this, _pageCache).values()) {
for (const [, data] of pageProxy.objs) {
if ((data == null ? void 0 : data.ref) !== imageRef) {
continue;
}
if (!data.dataLen) {
return null;
}
this.commonObjs.resolve(id, structuredClone(data));
return data.dataLen;
}
}
break;
case "FontPath":
case "Image":
case "Pattern":
this.commonObjs.resolve(id, exportedData);
break;
default:
throw new Error(`Got unknown common object type ${type}`);
}
return null;
});
messageHandler.on("obj", ([id, pageIndex, type, imageData]) => {
var _a2;
if (this.destroyed) {
return;
}
const pageProxy = __privateGet(this, _pageCache).get(pageIndex);
if (pageProxy.objs.has(id)) {
return;
}
if (pageProxy._intentStates.size === 0) {
(_a2 = imageData == null ? void 0 : imageData.bitmap) == null ? void 0 : _a2.close();
return;
}
switch (type) {
case "Image":
pageProxy.objs.resolve(id, imageData);
if ((imageData == null ? void 0 : imageData.dataLen) > MAX_IMAGE_SIZE_TO_CACHE) {
pageProxy._maybeCleanupAfterRender = true;
}
break;
case "Pattern":
pageProxy.objs.resolve(id, imageData);
break;
default:
throw new Error(`Got unknown object type ${type}`);
}
});
messageHandler.on("DocProgress", (data) => {
var _a2;
if (this.destroyed) {
return;
}
(_a2 = loadingTask.onProgress) == null ? void 0 : _a2.call(loadingTask, {
loaded: data.loaded,
total: data.total
});
});
messageHandler.on("FetchBuiltInCMap", (data) => {
if (this.destroyed) {
return Promise.reject(new Error("Worker was destroyed."));
}
if (!this.cMapReaderFactory) {
return Promise.reject(new Error("CMapReaderFactory not initialized, see the `useWorkerFetch` parameter."));
}
return this.cMapReaderFactory.fetch(data);
});
messageHandler.on("FetchStandardFontData", (data) => {
if (this.destroyed) {
return Promise.reject(new Error("Worker was destroyed."));
}
if (!this.standardFontDataFactory) {
return Promise.reject(new Error("StandardFontDataFactory not initialized, see the `useWorkerFetch` parameter."));
}
return this.standardFontDataFactory.fetch(data);
});
}
getData() {
return this.messageHandler.sendWithPromise("GetData", null);
}
saveDocument() {
var _a2, _b;
if (this.annotationStorage.size <= 0) {
warn("saveDocument called while `annotationStorage` is empty, please use the getData-method instead.");
}
const {
map,
transfer
} = this.annotationStorage.serializable;
return this.messageHandler.sendWithPromise("SaveDocument", {
isPureXfa: !!this._htmlForXfa,
numPages: this._numPages,
annotationStorage: map,
filename: (_b = (_a2 = this._fullReader) == null ? void 0 : _a2.filename) != null ? _b : null
}, transfer).finally(() => {
this.annotationStorage.resetModified();
});
}
getPage(pageNumber) {
if (!Number.isInteger(pageNumber) || pageNumber <= 0 || pageNumber > this._numPages) {
return Promise.reject(new Error("Invalid page request."));
}
const pageIndex = pageNumber - 1, cachedPromise = __privateGet(this, _pagePromises).get(pageIndex);
if (cachedPromise) {
return cachedPromise;
}
const promise = this.messageHandler.sendWithPromise("GetPage", {
pageIndex
}).then((pageInfo) => {
if (this.destroyed) {
throw new Error("Transport destroyed");
}
if (pageInfo.refStr) {
__privateGet(this, _pageRefCache).set(pageInfo.refStr, pageNumber);
}
const page = new PDFPageProxy(pageIndex, pageInfo, this, this._params.pdfBug);
__privateGet(this, _pageCache).set(pageIndex, page);
return page;
});
__privateGet(this, _pagePromises).set(pageIndex, promise);
return promise;
}
getPageIndex(ref) {
if (!isRefProxy(ref)) {
return Promise.reject(new Error("Invalid pageIndex request."));
}
return this.messageHandler.sendWithPromise("GetPageIndex", {
num: ref.num,
gen: ref.gen
});
}
getAnnotations(pageIndex, intent) {
return this.messageHandler.sendWithPromise("GetAnnotations", {
pageIndex,
intent
});
}
getFieldObjects() {
return __privateMethod(this, _cacheSimpleMethod, cacheSimpleMethod_fn).call(this, "GetFieldObjects");
}
hasJSActions() {
return __privateMethod(this, _cacheSimpleMethod, cacheSimpleMethod_fn).call(this, "HasJSActions");
}
getCalculationOrderIds() {
return this.messageHandler.sendWithPromise("GetCalculationOrderIds", null);
}
getDestinations() {
return this.messageHandler.sendWithPromise("GetDestinations", null);
}
getDestination(id) {
if (typeof id !== "string") {
return Promise.reject(new Error("Invalid destination request."));
}
return this.messageHandler.sendWithPromise("GetDestination", {
id
});
}
getPageLabels() {
return this.messageHandler.sendWithPromise("GetPageLabels", null);
}
getPageLayout() {
return this.messageHandler.sendWithPromise("GetPageLayout", null);
}
getPageMode() {
return this.messageHandler.sendWithPromise("GetPageMode", null);
}
getViewerPreferences() {
return this.messageHandler.sendWithPromise("GetViewerPreferences", null);
}
getOpenAction() {
return this.messageHandler.sendWithPromise("GetOpenAction", null);
}
getAttachments() {
return this.messageHandler.sendWithPromise("GetAttachments", null);
}
getDocJSActions() {
return __privateMethod(this, _cacheSimpleMethod, cacheSimpleMethod_fn).call(this, "GetDocJSActions");
}
getPageJSActions(pageIndex) {
return this.messageHandler.sendWithPromise("GetPageJSActions", {
pageIndex
});
}
getStructTree(pageIndex) {
return this.messageHandler.sendWithPromise("GetStructTree", {
pageIndex
});
}
getOutline() {
return this.messageHandler.sendWithPromise("GetOutline", null);
}
getOptionalContentConfig(renderingIntent) {
return __privateMethod(this, _cacheSimpleMethod, cacheSimpleMethod_fn).call(this, "GetOptionalContentConfig").then((data) => new OptionalContentConfig(data, renderingIntent));
}
getPermissions() {
return this.messageHandler.sendWithPromise("GetPermissions", null);
}
getMetadata() {
const name = "GetMetadata", cachedPromise = __privateGet(this, _methodPromises).get(name);
if (cachedPromise) {
return cachedPromise;
}
const promise = this.messageHandler.sendWithPromise(name, null).then((results) => {
var _a2, _b, _c, _d;
return {
info: results[0],
metadata: results[1] ? new Metadata(results[1]) : null,
contentDispositionFilename: (_b = (_a2 = this._fullReader) == null ? void 0 : _a2.filename) != null ? _b : null,
contentLength: (_d = (_c = this._fullReader) == null ? void 0 : _c.contentLength) != null ? _d : null
};
});
__privateGet(this, _methodPromises).set(name, promise);
return promise;
}
getMarkInfo() {
return this.messageHandler.sendWithPromise("GetMarkInfo", null);
}
async startCleanup(keepLoadedFonts = false) {
if (this.destroyed) {
return;
}
await this.messageHandler.sendWithPromise("Cleanup", null);
for (const page of __privateGet(this, _pageCache).values()) {
const cleanupSuccessful = page.cleanup();
if (!cleanupSuccessful) {
throw new Error(`startCleanup: Page ${page.pageNumber} is currently rendering.`);
}
}
this.commonObjs.clear();
if (!keepLoadedFonts) {
this.fontLoader.clear();
}
__privateGet(this, _methodPromises).clear();
this.filterFactory.destroy(true);
TextLayer.cleanup();
}
cachedPageNumber(ref) {
var _a2;
if (!isRefProxy(ref)) {
return null;
}
const refStr = ref.gen === 0 ? `${ref.num}R` : `${ref.num}R${ref.gen}`;
return (_a2 = __privateGet(this, _pageRefCache).get(refStr)) != null ? _a2 : null;
}
};
_methodPromises = new WeakMap();
_pageCache = new WeakMap();
_pagePromises = new WeakMap();
_pageRefCache = new WeakMap();
_passwordCapability = new WeakMap();
_cacheSimpleMethod = new WeakSet();
cacheSimpleMethod_fn = function(name, data = null) {
const cachedPromise = __privateGet(this, _methodPromises).get(name);
if (cachedPromise) {
return cachedPromise;
}
const promise = this.messageHandler.sendWithPromise(name, data);
__privateGet(this, _methodPromises).set(name, promise);
return promise;
};
var INITIAL_DATA = Symbol("INITIAL_DATA");
var _objs, _ensureObj, ensureObj_fn;
var PDFObjects = class {
constructor() {
__privateAdd(this, _ensureObj);
__privateAdd(this, _objs, /* @__PURE__ */ Object.create(null));
}
get(objId, callback = null) {
if (callback) {
const obj2 = __privateMethod(this, _ensureObj, ensureObj_fn).call(this, objId);
obj2.promise.then(() => callback(obj2.data));
return null;
}
const obj = __privateGet(this, _objs)[objId];
if (!obj || obj.data === INITIAL_DATA) {
throw new Error(`Requesting object that isn't resolved yet ${objId}.`);
}
return obj.data;
}
has(objId) {
const obj = __privateGet(this, _objs)[objId];
return !!obj && obj.data !== INITIAL_DATA;
}
resolve(objId, data = null) {
const obj = __privateMethod(this, _ensureObj, ensureObj_fn).call(this, objId);
obj.data = data;
obj.resolve();
}
clear() {
var _a2;
for (const objId in __privateGet(this, _objs)) {
const {
data
} = __privateGet(this, _objs)[objId];
(_a2 = data == null ? void 0 : data.bitmap) == null ? void 0 : _a2.close();
}
__privateSet(this, _objs, /* @__PURE__ */ Object.create(null));
}
*[Symbol.iterator]() {
for (const objId in __privateGet(this, _objs)) {
const {
data
} = __privateGet(this, _objs)[objId];
if (data === INITIAL_DATA) {
continue;
}
yield [objId, data];
}
}
};
_objs = new WeakMap();
_ensureObj = new WeakSet();
ensureObj_fn = function(objId) {
var _a2;
return (_a2 = __privateGet(this, _objs))[objId] || (_a2[objId] = {
...Promise.withResolvers(),
data: INITIAL_DATA
});
};
var _internalRenderTask;
var RenderTask = class {
constructor(internalRenderTask) {
__privateAdd(this, _internalRenderTask, null);
__privateSet(this, _internalRenderTask, internalRenderTask);
this.onContinue = null;
}
get promise() {
return __privateGet(this, _internalRenderTask).capability.promise;
}
cancel(extraDelay = 0) {
__privateGet(this, _internalRenderTask).cancel(null, extraDelay);
}
get separateAnnots() {
const {
separateAnnots
} = __privateGet(this, _internalRenderTask).operatorList;
if (!separateAnnots) {
return false;
}
const {
annotationCanvasMap
} = __privateGet(this, _internalRenderTask);
return separateAnnots.form || separateAnnots.canvas && (annotationCanvasMap == null ? void 0 : annotationCanvasMap.size) > 0;
}
};
_internalRenderTask = new WeakMap();
var _rAF, _canvasInUse;
var _InternalRenderTask = class {
constructor({
callback,
params,
objs,
commonObjs,
annotationCanvasMap,
operatorList,
pageIndex,
canvasFactory,
filterFactory,
useRequestAnimationFrame = false,
pdfBug = false,
pageColors = null
}) {
__privateAdd(this, _rAF, null);
this.callback = callback;
this.params = params;
this.objs = objs;
this.commonObjs = commonObjs;
this.annotationCanvasMap = annotationCanvasMap;
this.operatorListIdx = null;
this.operatorList = operatorList;
this._pageIndex = pageIndex;
this.canvasFactory = canvasFactory;
this.filterFactory = filterFactory;
this._pdfBug = pdfBug;
this.pageColors = pageColors;
this.running = false;
this.graphicsReadyCallback = null;
this.graphicsReady = false;
this._useRequestAnimationFrame = useRequestAnimationFrame === true && typeof window !== "undefined";
this.cancelled = false;
this.capability = Promise.withResolvers();
this.task = new RenderTask(this);
this._cancelBound = this.cancel.bind(this);
this._continueBound = this._continue.bind(this);
this._scheduleNextBound = this._scheduleNext.bind(this);
this._nextBound = this._next.bind(this);
this._canvas = params.canvasContext.canvas;
}
get completed() {
return this.capability.promise.catch(function() {
});
}
initializeGraphics({
transparency = false,
optionalContentConfig
}) {
var _a2, _b;
if (this.cancelled) {
return;
}
if (this._canvas) {
if (__privateGet(_InternalRenderTask, _canvasInUse).has(this._canvas)) {
throw new Error("Cannot use the same canvas during multiple render() operations. Use different canvas or ensure previous operations were cancelled or completed.");
}
__privateGet(_InternalRenderTask, _canvasInUse).add(this._canvas);
}
if (this._pdfBug && ((_a2 = globalThis.StepperManager) == null ? void 0 : _a2.enabled)) {
this.stepper = globalThis.StepperManager.create(this._pageIndex);
this.stepper.init(this.operatorList);
this.stepper.nextBreakPoint = this.stepper.getNextBreakPoint();
}
const {
canvasContext,
viewport,
transform,
background
} = this.params;
this.gfx = new CanvasGraphics(canvasContext, this.commonObjs, this.objs, this.canvasFactory, this.filterFactory, {
optionalContentConfig
}, this.annotationCanvasMap, this.pageColors);
this.gfx.beginDrawing({
transform,
viewport,
transparency,
background
});
this.operatorListIdx = 0;
this.graphicsReady = true;
(_b = this.graphicsReadyCallback) == null ? void 0 : _b.call(this);
}
cancel(error = null, extraDelay = 0) {
var _a2;
this.running = false;
this.cancelled = true;
(_a2 = this.gfx) == null ? void 0 : _a2.endDrawing();
if (__privateGet(this, _rAF)) {
window.cancelAnimationFrame(__privateGet(this, _rAF));
__privateSet(this, _rAF, null);
}
__privateGet(_InternalRenderTask, _canvasInUse).delete(this._canvas);
this.callback(error || new RenderingCancelledException(`Rendering cancelled, page ${this._pageIndex + 1}`, extraDelay));
}
operatorListChanged() {
var _a2;
if (!this.graphicsReady) {
this.graphicsReadyCallback || (this.graphicsReadyCallback = this._continueBound);
return;
}
(_a2 = this.stepper) == null ? void 0 : _a2.updateOperatorList(this.operatorList);
if (this.running) {
return;
}
this._continue();
}
_continue() {
this.running = true;
if (this.cancelled) {
return;
}
if (this.task.onContinue) {
this.task.onContinue(this._scheduleNextBound);
} else {
this._scheduleNext();
}
}
_scheduleNext() {
if (this._useRequestAnimationFrame) {
__privateSet(this, _rAF, window.requestAnimationFrame(() => {
__privateSet(this, _rAF, null);
this._nextBound().catch(this._cancelBound);
}));
} else {
Promise.resolve().then(this._nextBound).catch(this._cancelBound);
}
}
async _next() {
if (this.cancelled) {
return;
}
this.operatorListIdx = this.gfx.executeOperatorList(this.operatorList, this.operatorListIdx, this._continueBound, this.stepper);
if (this.operatorListIdx === this.operatorList.argsArray.length) {
this.running = false;
if (this.operatorList.lastChunk) {
this.gfx.endDrawing();
__privateGet(_InternalRenderTask, _canvasInUse).delete(this._canvas);
this.callback();
}
}
}
};
var InternalRenderTask = _InternalRenderTask;
_rAF = new WeakMap();
_canvasInUse = new WeakMap();
__privateAdd(InternalRenderTask, _canvasInUse, /* @__PURE__ */ new WeakSet());
var version = "4.6.82";
var build = "9b541910f";
function makeColorComp(n) {
return Math.floor(Math.max(0, Math.min(1, n)) * 255).toString(16).padStart(2, "0");
}
function scaleAndClamp(x) {
return Math.max(0, Math.min(255, 255 * x));
}
var ColorConverters = class {
static CMYK_G([c, y, m, k]) {
return ["G", 1 - Math.min(1, 0.3 * c + 0.59 * m + 0.11 * y + k)];
}
static G_CMYK([g]) {
return ["CMYK", 0, 0, 0, 1 - g];
}
static G_RGB([g]) {
return ["RGB", g, g, g];
}
static G_rgb([g]) {
g = scaleAndClamp(g);
return [g, g, g];
}
static G_HTML([g]) {
const G = makeColorComp(g);
return `#${G}${G}${G}`;
}
static RGB_G([r, g, b]) {
return ["G", 0.3 * r + 0.59 * g + 0.11 * b];
}
static RGB_rgb(color2) {
return color2.map(scaleAndClamp);
}
static RGB_HTML(color2) {
return `#${color2.map(makeColorComp).join("")}`;
}
static T_HTML() {
return "#00000000";
}
static T_rgb() {
return [null];
}
static CMYK_RGB([c, y, m, k]) {
return ["RGB", 1 - Math.min(1, c + k), 1 - Math.min(1, m + k), 1 - Math.min(1, y + k)];
}
static CMYK_rgb([c, y, m, k]) {
return [scaleAndClamp(1 - Math.min(1, c + k)), scaleAndClamp(1 - Math.min(1, m + k)), scaleAndClamp(1 - Math.min(1, y + k))];
}
static CMYK_HTML(components) {
const rgb = this.CMYK_RGB(components).slice(1);
return this.RGB_HTML(rgb);
}
static RGB_CMYK([r, g, b]) {
const c = 1 - r;
const m = 1 - g;
const y = 1 - b;
const k = Math.min(c, m, y);
return ["CMYK", c, m, y, k];
}
};
var XfaLayer = class {
static setupStorage(html, id, element, storage, intent) {
const storedData = storage.getValue(id, {
value: null
});
switch (element.name) {
case "textarea":
if (storedData.value !== null) {
html.textContent = storedData.value;
}
if (intent === "print") {
break;
}
html.addEventListener("input", (event) => {
storage.setValue(id, {
value: event.target.value
});
});
break;
case "input":
if (element.attributes.type === "radio" || element.attributes.type === "checkbox") {
if (storedData.value === element.attributes.xfaOn) {
html.setAttribute("checked", true);
} else if (storedData.value === element.attributes.xfaOff) {
html.removeAttribute("checked");
}
if (intent === "print") {
break;
}
html.addEventListener("change", (event) => {
storage.setValue(id, {
value: event.target.checked ? event.target.getAttribute("xfaOn") : event.target.getAttribute("xfaOff")
});
});
} else {
if (storedData.value !== null) {
html.setAttribute("value", storedData.value);
}
if (intent === "print") {
break;
}
html.addEventListener("input", (event) => {
storage.setValue(id, {
value: event.target.value
});
});
}
break;
case "select":
if (storedData.value !== null) {
html.setAttribute("value", storedData.value);
for (const option of element.children) {
if (option.attributes.value === storedData.value) {
option.attributes.selected = true;
} else if (option.attributes.hasOwnProperty("selected")) {
delete option.attributes.selected;
}
}
}
html.addEventListener("input", (event) => {
const options = event.target.options;
const value = options.selectedIndex === -1 ? "" : options[options.selectedIndex].value;
storage.setValue(id, {
value
});
});
break;
}
}
static setAttributes({
html,
element,
storage = null,
intent,
linkService
}) {
const {
attributes
} = element;
const isHTMLAnchorElement = html instanceof HTMLAnchorElement;
if (attributes.type === "radio") {
attributes.name = `${attributes.name}-${intent}`;
}
for (const [key, value] of Object.entries(attributes)) {
if (value === null || value === void 0) {
continue;
}
switch (key) {
case "class":
if (value.length) {
html.setAttribute(key, value.join(" "));
}
break;
case "dataId":
break;
case "id":
html.setAttribute("data-element-id", value);
break;
case "style":
Object.assign(html.style, value);
break;
case "textContent":
html.textContent = value;
break;
default:
if (!isHTMLAnchorElement || key !== "href" && key !== "newWindow") {
html.setAttribute(key, value);
}
}
}
if (isHTMLAnchorElement) {
linkService.addLinkAttributes(html, attributes.href, attributes.newWindow);
}
if (storage && attributes.dataId) {
this.setupStorage(html, attributes.dataId, element, storage);
}
}
static render(parameters) {
var _a2, _b;
const storage = parameters.annotationStorage;
const linkService = parameters.linkService;
const root = parameters.xfaHtml;
const intent = parameters.intent || "display";
const rootHtml = document.createElement(root.name);
if (root.attributes) {
this.setAttributes({
html: rootHtml,
element: root,
intent,
linkService
});
}
const isNotForRichText = intent !== "richText";
const rootDiv = parameters.div;
rootDiv.append(rootHtml);
if (parameters.viewport) {
const transform = `matrix(${parameters.viewport.transform.join(",")})`;
rootDiv.style.transform = transform;
}
if (isNotForRichText) {
rootDiv.setAttribute("class", "xfaLayer xfaFont");
}
const textDivs = [];
if (root.children.length === 0) {
if (root.value) {
const node = document.createTextNode(root.value);
rootHtml.append(node);
if (isNotForRichText && XfaText.shouldBuildText(root.name)) {
textDivs.push(node);
}
}
return {
textDivs
};
}
const stack = [[root, -1, rootHtml]];
while (stack.length > 0) {
const [parent, i, html] = stack.at(-1);
if (i + 1 === parent.children.length) {
stack.pop();
continue;
}
const child = parent.children[++stack.at(-1)[1]];
if (child === null) {
continue;
}
const {
name
} = child;
if (name === "#text") {
const node = document.createTextNode(child.value);
textDivs.push(node);
html.append(node);
continue;
}
const childHtml = ((_a2 = child == null ? void 0 : child.attributes) == null ? void 0 : _a2.xmlns) ? document.createElementNS(child.attributes.xmlns, name) : document.createElement(name);
html.append(childHtml);
if (child.attributes) {
this.setAttributes({
html: childHtml,
element: child,
storage,
intent,
linkService
});
}
if (((_b = child.children) == null ? void 0 : _b.length) > 0) {
stack.push([child, -1, childHtml]);
} else if (child.value) {
const node = document.createTextNode(child.value);
if (isNotForRichText && XfaText.shouldBuildText(name)) {
textDivs.push(node);
}
childHtml.append(node);
}
}
for (const el of rootDiv.querySelectorAll(".xfaNonInteractive input, .xfaNonInteractive textarea")) {
el.setAttribute("readOnly", true);
}
return {
textDivs
};
}
static update(parameters) {
const transform = `matrix(${parameters.viewport.transform.join(",")})`;
parameters.div.style.transform = transform;
parameters.div.hidden = false;
}
};
var DEFAULT_TAB_INDEX = 1e3;
var annotation_layer_DEFAULT_FONT_SIZE = 9;
var GetElementsByNameSet = /* @__PURE__ */ new WeakSet();
function getRectDims(rect) {
return {
width: rect[2] - rect[0],
height: rect[3] - rect[1]
};
}
var AnnotationElementFactory = class {
static create(parameters) {
const subtype = parameters.data.annotationType;
switch (subtype) {
case AnnotationType.LINK:
return new LinkAnnotationElement(parameters);
case AnnotationType.TEXT:
return new TextAnnotationElement(parameters);
case AnnotationType.WIDGET:
const fieldType = parameters.data.fieldType;
switch (fieldType) {
case "Tx":
return new TextWidgetAnnotationElement(parameters);
case "Btn":
if (parameters.data.radioButton) {
return new RadioButtonWidgetAnnotationElement(parameters);
} else if (parameters.data.checkBox) {
return new CheckboxWidgetAnnotationElement(parameters);
}
return new PushButtonWidgetAnnotationElement(parameters);
case "Ch":
return new ChoiceWidgetAnnotationElement(parameters);
case "Sig":
return new SignatureWidgetAnnotationElement(parameters);
}
return new WidgetAnnotationElement(parameters);
case AnnotationType.POPUP:
return new PopupAnnotationElement(parameters);
case AnnotationType.FREETEXT:
return new FreeTextAnnotationElement(parameters);
case AnnotationType.LINE:
return new LineAnnotationElement(parameters);
case AnnotationType.SQUARE:
return new SquareAnnotationElement(parameters);
case AnnotationType.CIRCLE:
return new CircleAnnotationElement(parameters);
case AnnotationType.POLYLINE:
return new PolylineAnnotationElement(parameters);
case AnnotationType.CARET:
return new CaretAnnotationElement(parameters);
case AnnotationType.INK:
return new InkAnnotationElement(parameters);
case AnnotationType.POLYGON:
return new PolygonAnnotationElement(parameters);
case AnnotationType.HIGHLIGHT:
return new HighlightAnnotationElement(parameters);
case AnnotationType.UNDERLINE:
return new UnderlineAnnotationElement(parameters);
case AnnotationType.SQUIGGLY:
return new SquigglyAnnotationElement(parameters);
case AnnotationType.STRIKEOUT:
return new StrikeOutAnnotationElement(parameters);
case AnnotationType.STAMP:
return new StampAnnotationElement(parameters);
case AnnotationType.FILEATTACHMENT:
return new FileAttachmentAnnotationElement(parameters);
default:
return new AnnotationElement(parameters);
}
}
};
var _updates, _hasBorder, _popupElement, _setRectEdited, setRectEdited_fn;
var _AnnotationElement = class {
constructor(parameters, {
isRenderable = false,
ignoreBorder = false,
createQuadrilaterals = false
} = {}) {
__privateAdd(this, _setRectEdited);
__privateAdd(this, _updates, null);
__privateAdd(this, _hasBorder, false);
__privateAdd(this, _popupElement, null);
this.isRenderable = isRenderable;
this.data = parameters.data;
this.layer = parameters.layer;
this.linkService = parameters.linkService;
this.downloadManager = parameters.downloadManager;
this.imageResourcesPath = parameters.imageResourcesPath;
this.renderForms = parameters.renderForms;
this.svgFactory = parameters.svgFactory;
this.annotationStorage = parameters.annotationStorage;
this.enableScripting = parameters.enableScripting;
this.hasJSActions = parameters.hasJSActions;
this._fieldObjects = parameters.fieldObjects;
this.parent = parameters.parent;
if (isRenderable) {
this.container = this._createContainer(ignoreBorder);
}
if (createQuadrilaterals) {
this._createQuadrilaterals();
}
}
static _hasPopupData({
titleObj,
contentsObj,
richText
}) {
return !!((titleObj == null ? void 0 : titleObj.str) || (contentsObj == null ? void 0 : contentsObj.str) || (richText == null ? void 0 : richText.str));
}
get _isEditable() {
return this.data.isEditable;
}
get hasPopupData() {
return _AnnotationElement._hasPopupData(this.data);
}
updateEdited(params) {
var _a2;
if (!this.container) {
return;
}
__privateGet(this, _updates) || __privateSet(this, _updates, {
rect: this.data.rect.slice(0)
});
const {
rect
} = params;
if (rect) {
__privateMethod(this, _setRectEdited, setRectEdited_fn).call(this, rect);
}
(_a2 = __privateGet(this, _popupElement)) == null ? void 0 : _a2.popup.updateEdited(params);
}
resetEdited() {
var _a2;
if (!__privateGet(this, _updates)) {
return;
}
__privateMethod(this, _setRectEdited, setRectEdited_fn).call(this, __privateGet(this, _updates).rect);
(_a2 = __privateGet(this, _popupElement)) == null ? void 0 : _a2.popup.resetEdited();
__privateSet(this, _updates, null);
}
_createContainer(ignoreBorder) {
const {
data,
parent: {
page,
viewport
}
} = this;
const container = document.createElement("section");
container.setAttribute("data-annotation-id", data.id);
if (!(this instanceof WidgetAnnotationElement)) {
container.tabIndex = DEFAULT_TAB_INDEX;
}
const {
style
} = container;
style.zIndex = this.parent.zIndex++;
if (data.popupRef) {
container.setAttribute("aria-haspopup", "dialog");
}
if (data.alternativeText) {
container.title = data.alternativeText;
}
if (data.noRotate) {
container.classList.add("norotate");
}
if (!data.rect || this instanceof PopupAnnotationElement) {
const {
rotation: rotation2
} = data;
if (!data.hasOwnCanvas && rotation2 !== 0) {
this.setRotation(rotation2, container);
}
return container;
}
const {
width,
height
} = getRectDims(data.rect);
if (!ignoreBorder && data.borderStyle.width > 0) {
style.borderWidth = `${data.borderStyle.width}px`;
const horizontalRadius = data.borderStyle.horizontalCornerRadius;
const verticalRadius = data.borderStyle.verticalCornerRadius;
if (horizontalRadius > 0 || verticalRadius > 0) {
const radius = `calc(${horizontalRadius}px * var(--scale-factor)) / calc(${verticalRadius}px * var(--scale-factor))`;
style.borderRadius = radius;
} else if (this instanceof RadioButtonWidgetAnnotationElement) {
const radius = `calc(${width}px * var(--scale-factor)) / calc(${height}px * var(--scale-factor))`;
style.borderRadius = radius;
}
switch (data.borderStyle.style) {
case AnnotationBorderStyleType.SOLID:
style.borderStyle = "solid";
break;
case AnnotationBorderStyleType.DASHED:
style.borderStyle = "dashed";
break;
case AnnotationBorderStyleType.BEVELED:
warn("Unimplemented border style: beveled");
break;
case AnnotationBorderStyleType.INSET:
warn("Unimplemented border style: inset");
break;
case AnnotationBorderStyleType.UNDERLINE:
style.borderBottomStyle = "solid";
break;
default:
break;
}
const borderColor = data.borderColor || null;
if (borderColor) {
__privateSet(this, _hasBorder, true);
style.borderColor = Util.makeHexColor(borderColor[0] | 0, borderColor[1] | 0, borderColor[2] | 0);
} else {
style.borderWidth = 0;
}
}
const rect = Util.normalizeRect([data.rect[0], page.view[3] - data.rect[1] + page.view[1], data.rect[2], page.view[3] - data.rect[3] + page.view[1]]);
const {
pageWidth,
pageHeight,
pageX,
pageY
} = viewport.rawDims;
style.left = `${100 * (rect[0] - pageX) / pageWidth}%`;
style.top = `${100 * (rect[1] - pageY) / pageHeight}%`;
const {
rotation
} = data;
if (data.hasOwnCanvas || rotation === 0) {
style.width = `${100 * width / pageWidth}%`;
style.height = `${100 * height / pageHeight}%`;
} else {
this.setRotation(rotation, container);
}
return container;
}
setRotation(angle, container = this.container) {
if (!this.data.rect) {
return;
}
const {
pageWidth,
pageHeight
} = this.parent.viewport.rawDims;
const {
width,
height
} = getRectDims(this.data.rect);
let elementWidth, elementHeight;
if (angle % 180 === 0) {
elementWidth = 100 * width / pageWidth;
elementHeight = 100 * height / pageHeight;
} else {
elementWidth = 100 * height / pageWidth;
elementHeight = 100 * width / pageHeight;
}
container.style.width = `${elementWidth}%`;
container.style.height = `${elementHeight}%`;
container.setAttribute("data-main-rotation", (360 - angle) % 360);
}
get _commonActions() {
const setColor = (jsName, styleName, event) => {
const color2 = event.detail[jsName];
const colorType = color2[0];
const colorArray = color2.slice(1);
event.target.style[styleName] = ColorConverters[`${colorType}_HTML`](colorArray);
this.annotationStorage.setValue(this.data.id, {
[styleName]: ColorConverters[`${colorType}_rgb`](colorArray)
});
};
return shadow(this, "_commonActions", {
display: (event) => {
const {
display
} = event.detail;
const hidden = display % 2 === 1;
this.container.style.visibility = hidden ? "hidden" : "visible";
this.annotationStorage.setValue(this.data.id, {
noView: hidden,
noPrint: display === 1 || display === 2
});
},
print: (event) => {
this.annotationStorage.setValue(this.data.id, {
noPrint: !event.detail.print
});
},
hidden: (event) => {
const {
hidden
} = event.detail;
this.container.style.visibility = hidden ? "hidden" : "visible";
this.annotationStorage.setValue(this.data.id, {
noPrint: hidden,
noView: hidden
});
},
focus: (event) => {
setTimeout(() => event.target.focus({
preventScroll: false
}), 0);
},
userName: (event) => {
event.target.title = event.detail.userName;
},
readonly: (event) => {
event.target.disabled = event.detail.readonly;
},
required: (event) => {
this._setRequired(event.target, event.detail.required);
},
bgColor: (event) => {
setColor("bgColor", "backgroundColor", event);
},
fillColor: (event) => {
setColor("fillColor", "backgroundColor", event);
},
fgColor: (event) => {
setColor("fgColor", "color", event);
},
textColor: (event) => {
setColor("textColor", "color", event);
},
borderColor: (event) => {
setColor("borderColor", "borderColor", event);
},
strokeColor: (event) => {
setColor("strokeColor", "borderColor", event);
},
rotation: (event) => {
const angle = event.detail.rotation;
this.setRotation(angle);
this.annotationStorage.setValue(this.data.id, {
rotation: angle
});
}
});
}
_dispatchEventFromSandbox(actions, jsEvent) {
const commonActions = this._commonActions;
for (const name of Object.keys(jsEvent.detail)) {
const action = actions[name] || commonActions[name];
action == null ? void 0 : action(jsEvent);
}
}
_setDefaultPropertiesFromJS(element) {
if (!this.enableScripting) {
return;
}
const storedData = this.annotationStorage.getRawValue(this.data.id);
if (!storedData) {
return;
}
const commonActions = this._commonActions;
for (const [actionName, detail] of Object.entries(storedData)) {
const action = commonActions[actionName];
if (action) {
const eventProxy = {
detail: {
[actionName]: detail
},
target: element
};
action(eventProxy);
delete storedData[actionName];
}
}
}
_createQuadrilaterals() {
if (!this.container) {
return;
}
const {
quadPoints
} = this.data;
if (!quadPoints) {
return;
}
const [rectBlX, rectBlY, rectTrX, rectTrY] = this.data.rect.map((x) => Math.fround(x));
if (quadPoints.length === 8) {
const [trX, trY, blX, blY] = quadPoints.subarray(2, 6);
if (rectTrX === trX && rectTrY === trY && rectBlX === blX && rectBlY === blY) {
return;
}
}
const {
style
} = this.container;
let svgBuffer;
if (__privateGet(this, _hasBorder)) {
const {
borderColor,
borderWidth
} = style;
style.borderWidth = 0;
svgBuffer = ["url('data:image/svg+xml;utf8,", `<svg xmlns="http://www.w3.org/2000/svg"`, ` preserveAspectRatio="none" viewBox="0 0 1 1">`, `<g fill="transparent" stroke="${borderColor}" stroke-width="${borderWidth}">`];
this.container.classList.add("hasBorder");
}
const width = rectTrX - rectBlX;
const height = rectTrY - rectBlY;
const {
svgFactory
} = this;
const svg = svgFactory.createElement("svg");
svg.classList.add("quadrilateralsContainer");
svg.setAttribute("width", 0);
svg.setAttribute("height", 0);
const defs = svgFactory.createElement("defs");
svg.append(defs);
const clipPath = svgFactory.createElement("clipPath");
const id = `clippath_${this.data.id}`;
clipPath.setAttribute("id", id);
clipPath.setAttribute("clipPathUnits", "objectBoundingBox");
defs.append(clipPath);
for (let i = 2, ii = quadPoints.length; i < ii; i += 8) {
const trX = quadPoints[i];
const trY = quadPoints[i + 1];
const blX = quadPoints[i + 2];
const blY = quadPoints[i + 3];
const rect = svgFactory.createElement("rect");
const x = (blX - rectBlX) / width;
const y = (rectTrY - trY) / height;
const rectWidth = (trX - blX) / width;
const rectHeight = (trY - blY) / height;
rect.setAttribute("x", x);
rect.setAttribute("y", y);
rect.setAttribute("width", rectWidth);
rect.setAttribute("height", rectHeight);
clipPath.append(rect);
svgBuffer == null ? void 0 : svgBuffer.push(`<rect vector-effect="non-scaling-stroke" x="${x}" y="${y}" width="${rectWidth}" height="${rectHeight}"/>`);
}
if (__privateGet(this, _hasBorder)) {
svgBuffer.push(`</g></svg>')`);
style.backgroundImage = svgBuffer.join("");
}
this.container.append(svg);
this.container.style.clipPath = `url(#${id})`;
}
_createPopup() {
const {
container,
data
} = this;
container.setAttribute("aria-haspopup", "dialog");
const popup = __privateSet(this, _popupElement, new PopupAnnotationElement({
data: {
color: data.color,
titleObj: data.titleObj,
modificationDate: data.modificationDate,
contentsObj: data.contentsObj,
richText: data.richText,
parentRect: data.rect,
borderStyle: 0,
id: `popup_${data.id}`,
rotation: data.rotation
},
parent: this.parent,
elements: [this]
}));
this.parent.div.append(popup.render());
}
render() {
unreachable("Abstract method `AnnotationElement.render` called");
}
_getElementsByName(name, skipId = null) {
const fields = [];
if (this._fieldObjects) {
const fieldObj = this._fieldObjects[name];
if (fieldObj) {
for (const {
page,
id,
exportValues
} of fieldObj) {
if (page === -1) {
continue;
}
if (id === skipId) {
continue;
}
const exportValue = typeof exportValues === "string" ? exportValues : null;
const domElement = document.querySelector(`[data-element-id="${id}"]`);
if (domElement && !GetElementsByNameSet.has(domElement)) {
warn(`_getElementsByName - element not allowed: ${id}`);
continue;
}
fields.push({
id,
exportValue,
domElement
});
}
}
return fields;
}
for (const domElement of document.getElementsByName(name)) {
const {
exportValue
} = domElement;
const id = domElement.getAttribute("data-element-id");
if (id === skipId) {
continue;
}
if (!GetElementsByNameSet.has(domElement)) {
continue;
}
fields.push({
id,
exportValue,
domElement
});
}
return fields;
}
show() {
var _a2;
if (this.container) {
this.container.hidden = false;
}
(_a2 = this.popup) == null ? void 0 : _a2.maybeShow();
}
hide() {
var _a2;
if (this.container) {
this.container.hidden = true;
}
(_a2 = this.popup) == null ? void 0 : _a2.forceHide();
}
getElementsToTriggerPopup() {
return this.container;
}
addHighlightArea() {
const triggers = this.getElementsToTriggerPopup();
if (Array.isArray(triggers)) {
for (const element of triggers) {
element.classList.add("highlightArea");
}
} else {
triggers.classList.add("highlightArea");
}
}
_editOnDoubleClick() {
if (!this._isEditable) {
return;
}
const {
annotationEditorType: mode,
data: {
id: editId
}
} = this;
this.container.addEventListener("dblclick", () => {
var _a2;
(_a2 = this.linkService.eventBus) == null ? void 0 : _a2.dispatch("switchannotationeditormode", {
source: this,
mode,
editId
});
});
}
};
var AnnotationElement = _AnnotationElement;
_updates = new WeakMap();
_hasBorder = new WeakMap();
_popupElement = new WeakMap();
_setRectEdited = new WeakSet();
setRectEdited_fn = function(rect) {
const {
container: {
style
},
data: {
rect: currentRect,
rotation
},
parent: {
viewport: {
rawDims: {
pageWidth,
pageHeight,
pageX,
pageY
}
}
}
} = this;
currentRect == null ? void 0 : currentRect.splice(0, 4, ...rect);
const {
width,
height
} = getRectDims(rect);
style.left = `${100 * (rect[0] - pageX) / pageWidth}%`;
style.top = `${100 * (pageHeight - rect[3] + pageY) / pageHeight}%`;
if (rotation === 0) {
style.width = `${100 * width / pageWidth}%`;
style.height = `${100 * height / pageHeight}%`;
} else {
this.setRotation(rotation);
}
};
var _setInternalLink, setInternalLink_fn, _bindAttachment, bindAttachment_fn, _bindSetOCGState, bindSetOCGState_fn;
var LinkAnnotationElement = class extends AnnotationElement {
constructor(parameters, options = null) {
super(parameters, {
isRenderable: true,
ignoreBorder: !!(options == null ? void 0 : options.ignoreBorder),
createQuadrilaterals: true
});
__privateAdd(this, _setInternalLink);
__privateAdd(this, _bindAttachment);
__privateAdd(this, _bindSetOCGState);
this.isTooltipOnly = parameters.data.isTooltipOnly;
}
render() {
const {
data,
linkService
} = this;
const link = document.createElement("a");
link.setAttribute("data-element-id", data.id);
let isBound = false;
if (data.url) {
linkService.addLinkAttributes(link, data.url, data.newWindow);
isBound = true;
} else if (data.action) {
this._bindNamedAction(link, data.action);
isBound = true;
} else if (data.attachment) {
__privateMethod(this, _bindAttachment, bindAttachment_fn).call(this, link, data.attachment, data.attachmentDest);
isBound = true;
} else if (data.setOCGState) {
__privateMethod(this, _bindSetOCGState, bindSetOCGState_fn).call(this, link, data.setOCGState);
isBound = true;
} else if (data.dest) {
this._bindLink(link, data.dest);
isBound = true;
} else {
if (data.actions && (data.actions.Action || data.actions["Mouse Up"] || data.actions["Mouse Down"]) && this.enableScripting && this.hasJSActions) {
this._bindJSAction(link, data);
isBound = true;
}
if (data.resetForm) {
this._bindResetFormAction(link, data.resetForm);
isBound = true;
} else if (this.isTooltipOnly && !isBound) {
this._bindLink(link, "");
isBound = true;
}
}
this.container.classList.add("linkAnnotation");
if (isBound) {
this.container.append(link);
}
return this.container;
}
_bindLink(link, destination) {
link.href = this.linkService.getDestinationHash(destination);
link.onclick = () => {
if (destination) {
this.linkService.goToDestination(destination);
}
return false;
};
if (destination || destination === "") {
__privateMethod(this, _setInternalLink, setInternalLink_fn).call(this);
}
}
_bindNamedAction(link, action) {
link.href = this.linkService.getAnchorUrl("");
link.onclick = () => {
this.linkService.executeNamedAction(action);
return false;
};
__privateMethod(this, _setInternalLink, setInternalLink_fn).call(this);
}
_bindJSAction(link, data) {
link.href = this.linkService.getAnchorUrl("");
const map = /* @__PURE__ */ new Map([["Action", "onclick"], ["Mouse Up", "onmouseup"], ["Mouse Down", "onmousedown"]]);
for (const name of Object.keys(data.actions)) {
const jsName = map.get(name);
if (!jsName) {
continue;
}
link[jsName] = () => {
var _a2;
(_a2 = this.linkService.eventBus) == null ? void 0 : _a2.dispatch("dispatcheventinsandbox", {
source: this,
detail: {
id: data.id,
name
}
});
return false;
};
}
if (!link.onclick) {
link.onclick = () => false;
}
__privateMethod(this, _setInternalLink, setInternalLink_fn).call(this);
}
_bindResetFormAction(link, resetForm) {
const otherClickAction = link.onclick;
if (!otherClickAction) {
link.href = this.linkService.getAnchorUrl("");
}
__privateMethod(this, _setInternalLink, setInternalLink_fn).call(this);
if (!this._fieldObjects) {
warn(`_bindResetFormAction - "resetForm" action not supported, ensure that the \`fieldObjects\` parameter is provided.`);
if (!otherClickAction) {
link.onclick = () => false;
}
return;
}
link.onclick = () => {
var _a2;
otherClickAction == null ? void 0 : otherClickAction();
const {
fields: resetFormFields,
refs: resetFormRefs,
include
} = resetForm;
const allFields = [];
if (resetFormFields.length !== 0 || resetFormRefs.length !== 0) {
const fieldIds = new Set(resetFormRefs);
for (const fieldName of resetFormFields) {
const fields = this._fieldObjects[fieldName] || [];
for (const {
id
} of fields) {
fieldIds.add(id);
}
}
for (const fields of Object.values(this._fieldObjects)) {
for (const field of fields) {
if (fieldIds.has(field.id) === include) {
allFields.push(field);
}
}
}
} else {
for (const fields of Object.values(this._fieldObjects)) {
allFields.push(...fields);
}
}
const storage = this.annotationStorage;
const allIds = [];
for (const field of allFields) {
const {
id
} = field;
allIds.push(id);
switch (field.type) {
case "text": {
const value = field.defaultValue || "";
storage.setValue(id, {
value
});
break;
}
case "checkbox":
case "radiobutton": {
const value = field.defaultValue === field.exportValues;
storage.setValue(id, {
value
});
break;
}
case "combobox":
case "listbox": {
const value = field.defaultValue || "";
storage.setValue(id, {
value
});
break;
}
default:
continue;
}
const domElement = document.querySelector(`[data-element-id="${id}"]`);
if (!domElement) {
continue;
} else if (!GetElementsByNameSet.has(domElement)) {
warn(`_bindResetFormAction - element not allowed: ${id}`);
continue;
}
domElement.dispatchEvent(new Event("resetform"));
}
if (this.enableScripting) {
(_a2 = this.linkService.eventBus) == null ? void 0 : _a2.dispatch("dispatcheventinsandbox", {
source: this,
detail: {
id: "app",
ids: allIds,
name: "ResetForm"
}
});
}
return false;
};
}
};
_setInternalLink = new WeakSet();
setInternalLink_fn = function() {
this.container.setAttribute("data-internal-link", "");
};
_bindAttachment = new WeakSet();
bindAttachment_fn = function(link, attachment, dest = null) {
link.href = this.linkService.getAnchorUrl("");
if (attachment.description) {
link.title = attachment.description;
}
link.onclick = () => {
var _a2;
(_a2 = this.downloadManager) == null ? void 0 : _a2.openOrDownloadData(attachment.content, attachment.filename, dest);
return false;
};
__privateMethod(this, _setInternalLink, setInternalLink_fn).call(this);
};
_bindSetOCGState = new WeakSet();
bindSetOCGState_fn = function(link, action) {
link.href = this.linkService.getAnchorUrl("");
link.onclick = () => {
this.linkService.executeSetOCGState(action);
return false;
};
__privateMethod(this, _setInternalLink, setInternalLink_fn).call(this);
};
var TextAnnotationElement = class extends AnnotationElement {
constructor(parameters) {
super(parameters, {
isRenderable: true
});
}
render() {
this.container.classList.add("textAnnotation");
const image = document.createElement("img");
image.src = this.imageResourcesPath + "annotation-" + this.data.name.toLowerCase() + ".svg";
image.setAttribute("data-l10n-id", "pdfjs-text-annotation-type");
image.setAttribute("data-l10n-args", JSON.stringify({
type: this.data.name
}));
if (!this.data.popupRef && this.hasPopupData) {
this._createPopup();
}
this.container.append(image);
return this.container;
}
};
var WidgetAnnotationElement = class extends AnnotationElement {
render() {
return this.container;
}
showElementAndHideCanvas(element) {
var _a2;
if (this.data.hasOwnCanvas) {
if (((_a2 = element.previousSibling) == null ? void 0 : _a2.nodeName) === "CANVAS") {
element.previousSibling.hidden = true;
}
element.hidden = false;
}
}
_getKeyModifier(event) {
return util_FeatureTest.platform.isMac ? event.metaKey : event.ctrlKey;
}
_setEventListener(element, elementData, baseName, eventName, valueGetter) {
if (baseName.includes("mouse")) {
element.addEventListener(baseName, (event) => {
var _a2;
(_a2 = this.linkService.eventBus) == null ? void 0 : _a2.dispatch("dispatcheventinsandbox", {
source: this,
detail: {
id: this.data.id,
name: eventName,
value: valueGetter(event),
shift: event.shiftKey,
modifier: this._getKeyModifier(event)
}
});
});
} else {
element.addEventListener(baseName, (event) => {
var _a2;
if (baseName === "blur") {
if (!elementData.focused || !event.relatedTarget) {
return;
}
elementData.focused = false;
} else if (baseName === "focus") {
if (elementData.focused) {
return;
}
elementData.focused = true;
}
if (!valueGetter) {
return;
}
(_a2 = this.linkService.eventBus) == null ? void 0 : _a2.dispatch("dispatcheventinsandbox", {
source: this,
detail: {
id: this.data.id,
name: eventName,
value: valueGetter(event)
}
});
});
}
}
_setEventListeners(element, elementData, names, getter) {
var _a2, _b, _c;
for (const [baseName, eventName] of names) {
if (eventName === "Action" || ((_a2 = this.data.actions) == null ? void 0 : _a2[eventName])) {
if (eventName === "Focus" || eventName === "Blur") {
elementData || (elementData = {
focused: false
});
}
this._setEventListener(element, elementData, baseName, eventName, getter);
if (eventName === "Focus" && !((_b = this.data.actions) == null ? void 0 : _b.Blur)) {
this._setEventListener(element, elementData, "blur", "Blur", null);
} else if (eventName === "Blur" && !((_c = this.data.actions) == null ? void 0 : _c.Focus)) {
this._setEventListener(element, elementData, "focus", "Focus", null);
}
}
}
}
_setBackgroundColor(element) {
const color2 = this.data.backgroundColor || null;
element.style.backgroundColor = color2 === null ? "transparent" : Util.makeHexColor(color2[0], color2[1], color2[2]);
}
_setTextStyle(element) {
const TEXT_ALIGNMENT = ["left", "center", "right"];
const {
fontColor
} = this.data.defaultAppearanceData;
const fontSize = this.data.defaultAppearanceData.fontSize || annotation_layer_DEFAULT_FONT_SIZE;
const style = element.style;
let computedFontSize;
const BORDER_SIZE = 2;
const roundToOneDecimal = (x) => Math.round(10 * x) / 10;
if (this.data.multiLine) {
const height = Math.abs(this.data.rect[3] - this.data.rect[1] - BORDER_SIZE);
const numberOfLines = Math.round(height / (LINE_FACTOR * fontSize)) || 1;
const lineHeight = height / numberOfLines;
computedFontSize = Math.min(fontSize, roundToOneDecimal(lineHeight / LINE_FACTOR));
} else {
const height = Math.abs(this.data.rect[3] - this.data.rect[1] - BORDER_SIZE);
computedFontSize = Math.min(fontSize, roundToOneDecimal(height / LINE_FACTOR));
}
style.fontSize = `calc(${computedFontSize}px * var(--scale-factor))`;
style.color = Util.makeHexColor(fontColor[0], fontColor[1], fontColor[2]);
if (this.data.textAlignment !== null) {
style.textAlign = TEXT_ALIGNMENT[this.data.textAlignment];
}
}
_setRequired(element, isRequired) {
if (isRequired) {
element.setAttribute("required", true);
} else {
element.removeAttribute("required");
}
element.setAttribute("aria-required", isRequired);
}
};
var TextWidgetAnnotationElement = class extends WidgetAnnotationElement {
constructor(parameters) {
const isRenderable = parameters.renderForms || parameters.data.hasOwnCanvas || !parameters.data.hasAppearance && !!parameters.data.fieldValue;
super(parameters, {
isRenderable
});
}
setPropertyOnSiblings(base, key, value, keyInStorage) {
const storage = this.annotationStorage;
for (const element of this._getElementsByName(base.name, base.id)) {
if (element.domElement) {
element.domElement[key] = value;
}
storage.setValue(element.id, {
[keyInStorage]: value
});
}
}
render() {
var _a2, _b;
const storage = this.annotationStorage;
const id = this.data.id;
this.container.classList.add("textWidgetAnnotation");
let element = null;
if (this.renderForms) {
const storedData = storage.getValue(id, {
value: this.data.fieldValue
});
let textContent = storedData.value || "";
const maxLen = storage.getValue(id, {
charLimit: this.data.maxLen
}).charLimit;
if (maxLen && textContent.length > maxLen) {
textContent = textContent.slice(0, maxLen);
}
let fieldFormattedValues = storedData.formattedValue || ((_a2 = this.data.textContent) == null ? void 0 : _a2.join("\n")) || null;
if (fieldFormattedValues && this.data.comb) {
fieldFormattedValues = fieldFormattedValues.replaceAll(/\s+/g, "");
}
const elementData = {
userValue: textContent,
formattedValue: fieldFormattedValues,
lastCommittedValue: null,
commitKey: 1,
focused: false
};
if (this.data.multiLine) {
element = document.createElement("textarea");
element.textContent = fieldFormattedValues != null ? fieldFormattedValues : textContent;
if (this.data.doNotScroll) {
element.style.overflowY = "hidden";
}
} else {
element = document.createElement("input");
element.type = "text";
element.setAttribute("value", fieldFormattedValues != null ? fieldFormattedValues : textContent);
if (this.data.doNotScroll) {
element.style.overflowX = "hidden";
}
}
if (this.data.hasOwnCanvas) {
element.hidden = true;
}
GetElementsByNameSet.add(element);
element.setAttribute("data-element-id", id);
element.disabled = this.data.readOnly;
element.name = this.data.fieldName;
element.tabIndex = DEFAULT_TAB_INDEX;
this._setRequired(element, this.data.required);
if (maxLen) {
element.maxLength = maxLen;
}
element.addEventListener("input", (event) => {
storage.setValue(id, {
value: event.target.value
});
this.setPropertyOnSiblings(element, "value", event.target.value, "value");
elementData.formattedValue = null;
});
element.addEventListener("resetform", (event) => {
var _a3;
const defaultValue = (_a3 = this.data.defaultFieldValue) != null ? _a3 : "";
element.value = elementData.userValue = defaultValue;
elementData.formattedValue = null;
});
let blurListener = (event) => {
const {
formattedValue
} = elementData;
if (formattedValue !== null && formattedValue !== void 0) {
event.target.value = formattedValue;
}
event.target.scrollLeft = 0;
};
if (this.enableScripting && this.hasJSActions) {
element.addEventListener("focus", (event) => {
var _a3;
if (elementData.focused) {
return;
}
const {
target
} = event;
if (elementData.userValue) {
target.value = elementData.userValue;
}
elementData.lastCommittedValue = target.value;
elementData.commitKey = 1;
if (!((_a3 = this.data.actions) == null ? void 0 : _a3.Focus)) {
elementData.focused = true;
}
});
element.addEventListener("updatefromsandbox", (jsEvent) => {
this.showElementAndHideCanvas(jsEvent.target);
const actions = {
value(event) {
var _a3;
elementData.userValue = (_a3 = event.detail.value) != null ? _a3 : "";
storage.setValue(id, {
value: elementData.userValue.toString()
});
event.target.value = elementData.userValue;
},
formattedValue(event) {
const {
formattedValue
} = event.detail;
elementData.formattedValue = formattedValue;
if (formattedValue !== null && formattedValue !== void 0 && event.target !== document.activeElement) {
event.target.value = formattedValue;
}
storage.setValue(id, {
formattedValue
});
},
selRange(event) {
event.target.setSelectionRange(...event.detail.selRange);
},
charLimit: (event) => {
var _a3;
const {
charLimit
} = event.detail;
const {
target
} = event;
if (charLimit === 0) {
target.removeAttribute("maxLength");
return;
}
target.setAttribute("maxLength", charLimit);
let value = elementData.userValue;
if (!value || value.length <= charLimit) {
return;
}
value = value.slice(0, charLimit);
target.value = elementData.userValue = value;
storage.setValue(id, {
value
});
(_a3 = this.linkService.eventBus) == null ? void 0 : _a3.dispatch("dispatcheventinsandbox", {
source: this,
detail: {
id,
name: "Keystroke",
value,
willCommit: true,
commitKey: 1,
selStart: target.selectionStart,
selEnd: target.selectionEnd
}
});
}
};
this._dispatchEventFromSandbox(actions, jsEvent);
});
element.addEventListener("keydown", (event) => {
var _a3;
elementData.commitKey = 1;
let commitKey = -1;
if (event.key === "Escape") {
commitKey = 0;
} else if (event.key === "Enter" && !this.data.multiLine) {
commitKey = 2;
} else if (event.key === "Tab") {
elementData.commitKey = 3;
}
if (commitKey === -1) {
return;
}
const {
value
} = event.target;
if (elementData.lastCommittedValue === value) {
return;
}
elementData.lastCommittedValue = value;
elementData.userValue = value;
(_a3 = this.linkService.eventBus) == null ? void 0 : _a3.dispatch("dispatcheventinsandbox", {
source: this,
detail: {
id,
name: "Keystroke",
value,
willCommit: true,
commitKey,
selStart: event.target.selectionStart,
selEnd: event.target.selectionEnd
}
});
});
const _blurListener = blurListener;
blurListener = null;
element.addEventListener("blur", (event) => {
var _a3, _b2;
if (!elementData.focused || !event.relatedTarget) {
return;
}
if (!((_a3 = this.data.actions) == null ? void 0 : _a3.Blur)) {
elementData.focused = false;
}
const {
value
} = event.target;
elementData.userValue = value;
if (elementData.lastCommittedValue !== value) {
(_b2 = this.linkService.eventBus) == null ? void 0 : _b2.dispatch("dispatcheventinsandbox", {
source: this,
detail: {
id,
name: "Keystroke",
value,
willCommit: true,
commitKey: elementData.commitKey,
selStart: event.target.selectionStart,
selEnd: event.target.selectionEnd
}
});
}
_blurListener(event);
});
if ((_b = this.data.actions) == null ? void 0 : _b.Keystroke) {
element.addEventListener("beforeinput", (event) => {
var _a3;
elementData.lastCommittedValue = null;
const {
data,
target
} = event;
const {
value,
selectionStart,
selectionEnd
} = target;
let selStart = selectionStart, selEnd = selectionEnd;
switch (event.inputType) {
case "deleteWordBackward": {
const match = value.substring(0, selectionStart).match(/\w*[^\w]*$/);
if (match) {
selStart -= match[0].length;
}
break;
}
case "deleteWordForward": {
const match = value.substring(selectionStart).match(/^[^\w]*\w*/);
if (match) {
selEnd += match[0].length;
}
break;
}
case "deleteContentBackward":
if (selectionStart === selectionEnd) {
selStart -= 1;
}
break;
case "deleteContentForward":
if (selectionStart === selectionEnd) {
selEnd += 1;
}
break;
}
event.preventDefault();
(_a3 = this.linkService.eventBus) == null ? void 0 : _a3.dispatch("dispatcheventinsandbox", {
source: this,
detail: {
id,
name: "Keystroke",
value,
change: data || "",
willCommit: false,
selStart,
selEnd
}
});
});
}
this._setEventListeners(element, elementData, [["focus", "Focus"], ["blur", "Blur"], ["mousedown", "Mouse Down"], ["mouseenter", "Mouse Enter"], ["mouseleave", "Mouse Exit"], ["mouseup", "Mouse Up"]], (event) => event.target.value);
}
if (blurListener) {
element.addEventListener("blur", blurListener);
}
if (this.data.comb) {
const fieldWidth = this.data.rect[2] - this.data.rect[0];
const combWidth = fieldWidth / maxLen;
element.classList.add("comb");
element.style.letterSpacing = `calc(${combWidth}px * var(--scale-factor) - 1ch)`;
}
} else {
element = document.createElement("div");
element.textContent = this.data.fieldValue;
element.style.verticalAlign = "middle";
element.style.display = "table-cell";
if (this.data.hasOwnCanvas) {
element.hidden = true;
}
}
this._setTextStyle(element);
this._setBackgroundColor(element);
this._setDefaultPropertiesFromJS(element);
this.container.append(element);
return this.container;
}
};
var SignatureWidgetAnnotationElement = class extends WidgetAnnotationElement {
constructor(parameters) {
super(parameters, {
isRenderable: !!parameters.data.hasOwnCanvas
});
}
};
var CheckboxWidgetAnnotationElement = class extends WidgetAnnotationElement {
constructor(parameters) {
super(parameters, {
isRenderable: parameters.renderForms
});
}
render() {
const storage = this.annotationStorage;
const data = this.data;
const id = data.id;
let value = storage.getValue(id, {
value: data.exportValue === data.fieldValue
}).value;
if (typeof value === "string") {
value = value !== "Off";
storage.setValue(id, {
value
});
}
this.container.classList.add("buttonWidgetAnnotation", "checkBox");
const element = document.createElement("input");
GetElementsByNameSet.add(element);
element.setAttribute("data-element-id", id);
element.disabled = data.readOnly;
this._setRequired(element, this.data.required);
element.type = "checkbox";
element.name = data.fieldName;
if (value) {
element.setAttribute("checked", true);
}
element.setAttribute("exportValue", data.exportValue);
element.tabIndex = DEFAULT_TAB_INDEX;
element.addEventListener("change", (event) => {
const {
name,
checked
} = event.target;
for (const checkbox of this._getElementsByName(name, id)) {
const curChecked = checked && checkbox.exportValue === data.exportValue;
if (checkbox.domElement) {
checkbox.domElement.checked = curChecked;
}
storage.setValue(checkbox.id, {
value: curChecked
});
}
storage.setValue(id, {
value: checked
});
});
element.addEventListener("resetform", (event) => {
const defaultValue = data.defaultFieldValue || "Off";
event.target.checked = defaultValue === data.exportValue;
});
if (this.enableScripting && this.hasJSActions) {
element.addEventListener("updatefromsandbox", (jsEvent) => {
const actions = {
value(event) {
event.target.checked = event.detail.value !== "Off";
storage.setValue(id, {
value: event.target.checked
});
}
};
this._dispatchEventFromSandbox(actions, jsEvent);
});
this._setEventListeners(element, null, [["change", "Validate"], ["change", "Action"], ["focus", "Focus"], ["blur", "Blur"], ["mousedown", "Mouse Down"], ["mouseenter", "Mouse Enter"], ["mouseleave", "Mouse Exit"], ["mouseup", "Mouse Up"]], (event) => event.target.checked);
}
this._setBackgroundColor(element);
this._setDefaultPropertiesFromJS(element);
this.container.append(element);
return this.container;
}
};
var RadioButtonWidgetAnnotationElement = class extends WidgetAnnotationElement {
constructor(parameters) {
super(parameters, {
isRenderable: parameters.renderForms
});
}
render() {
this.container.classList.add("buttonWidgetAnnotation", "radioButton");
const storage = this.annotationStorage;
const data = this.data;
const id = data.id;
let value = storage.getValue(id, {
value: data.fieldValue === data.buttonValue
}).value;
if (typeof value === "string") {
value = value !== data.buttonValue;
storage.setValue(id, {
value
});
}
if (value) {
for (const radio of this._getElementsByName(data.fieldName, id)) {
storage.setValue(radio.id, {
value: false
});
}
}
const element = document.createElement("input");
GetElementsByNameSet.add(element);
element.setAttribute("data-element-id", id);
element.disabled = data.readOnly;
this._setRequired(element, this.data.required);
element.type = "radio";
element.name = data.fieldName;
if (value) {
element.setAttribute("checked", true);
}
element.tabIndex = DEFAULT_TAB_INDEX;
element.addEventListener("change", (event) => {
const {
name,
checked
} = event.target;
for (const radio of this._getElementsByName(name, id)) {
storage.setValue(radio.id, {
value: false
});
}
storage.setValue(id, {
value: checked
});
});
element.addEventListener("resetform", (event) => {
const defaultValue = data.defaultFieldValue;
event.target.checked = defaultValue !== null && defaultValue !== void 0 && defaultValue === data.buttonValue;
});
if (this.enableScripting && this.hasJSActions) {
const pdfButtonValue = data.buttonValue;
element.addEventListener("updatefromsandbox", (jsEvent) => {
const actions = {
value: (event) => {
const checked = pdfButtonValue === event.detail.value;
for (const radio of this._getElementsByName(event.target.name)) {
const curChecked = checked && radio.id === id;
if (radio.domElement) {
radio.domElement.checked = curChecked;
}
storage.setValue(radio.id, {
value: curChecked
});
}
}
};
this._dispatchEventFromSandbox(actions, jsEvent);
});
this._setEventListeners(element, null, [["change", "Validate"], ["change", "Action"], ["focus", "Focus"], ["blur", "Blur"], ["mousedown", "Mouse Down"], ["mouseenter", "Mouse Enter"], ["mouseleave", "Mouse Exit"], ["mouseup", "Mouse Up"]], (event) => event.target.checked);
}
this._setBackgroundColor(element);
this._setDefaultPropertiesFromJS(element);
this.container.append(element);
return this.container;
}
};
var PushButtonWidgetAnnotationElement = class extends LinkAnnotationElement {
constructor(parameters) {
super(parameters, {
ignoreBorder: parameters.data.hasAppearance
});
}
render() {
const container = super.render();
container.classList.add("buttonWidgetAnnotation", "pushButton");
const linkElement = container.lastChild;
if (this.enableScripting && this.hasJSActions && linkElement) {
this._setDefaultPropertiesFromJS(linkElement);
linkElement.addEventListener("updatefromsandbox", (jsEvent) => {
this._dispatchEventFromSandbox({}, jsEvent);
});
}
return container;
}
};
var ChoiceWidgetAnnotationElement = class extends WidgetAnnotationElement {
constructor(parameters) {
super(parameters, {
isRenderable: parameters.renderForms
});
}
render() {
this.container.classList.add("choiceWidgetAnnotation");
const storage = this.annotationStorage;
const id = this.data.id;
const storedData = storage.getValue(id, {
value: this.data.fieldValue
});
const selectElement = document.createElement("select");
GetElementsByNameSet.add(selectElement);
selectElement.setAttribute("data-element-id", id);
selectElement.disabled = this.data.readOnly;
this._setRequired(selectElement, this.data.required);
selectElement.name = this.data.fieldName;
selectElement.tabIndex = DEFAULT_TAB_INDEX;
let addAnEmptyEntry = this.data.combo && this.data.options.length > 0;
if (!this.data.combo) {
selectElement.size = this.data.options.length;
if (this.data.multiSelect) {
selectElement.multiple = true;
}
}
selectElement.addEventListener("resetform", (event) => {
const defaultValue = this.data.defaultFieldValue;
for (const option of selectElement.options) {
option.selected = option.value === defaultValue;
}
});
for (const option of this.data.options) {
const optionElement = document.createElement("option");
optionElement.textContent = option.displayValue;
optionElement.value = option.exportValue;
if (storedData.value.includes(option.exportValue)) {
optionElement.setAttribute("selected", true);
addAnEmptyEntry = false;
}
selectElement.append(optionElement);
}
let removeEmptyEntry = null;
if (addAnEmptyEntry) {
const noneOptionElement = document.createElement("option");
noneOptionElement.value = " ";
noneOptionElement.setAttribute("hidden", true);
noneOptionElement.setAttribute("selected", true);
selectElement.prepend(noneOptionElement);
removeEmptyEntry = () => {
noneOptionElement.remove();
selectElement.removeEventListener("input", removeEmptyEntry);
removeEmptyEntry = null;
};
selectElement.addEventListener("input", removeEmptyEntry);
}
const getValue = (isExport) => {
const name = isExport ? "value" : "textContent";
const {
options,
multiple
} = selectElement;
if (!multiple) {
return options.selectedIndex === -1 ? null : options[options.selectedIndex][name];
}
return Array.prototype.filter.call(options, (option) => option.selected).map((option) => option[name]);
};
let selectedValues = getValue(false);
const getItems = (event) => {
const options = event.target.options;
return Array.prototype.map.call(options, (option) => ({
displayValue: option.textContent,
exportValue: option.value
}));
};
if (this.enableScripting && this.hasJSActions) {
selectElement.addEventListener("updatefromsandbox", (jsEvent) => {
const actions = {
value(event) {
removeEmptyEntry == null ? void 0 : removeEmptyEntry();
const value = event.detail.value;
const values = new Set(Array.isArray(value) ? value : [value]);
for (const option of selectElement.options) {
option.selected = values.has(option.value);
}
storage.setValue(id, {
value: getValue(true)
});
selectedValues = getValue(false);
},
multipleSelection(event) {
selectElement.multiple = true;
},
remove(event) {
const options = selectElement.options;
const index = event.detail.remove;
options[index].selected = false;
selectElement.remove(index);
if (options.length > 0) {
const i = Array.prototype.findIndex.call(options, (option) => option.selected);
if (i === -1) {
options[0].selected = true;
}
}
storage.setValue(id, {
value: getValue(true),
items: getItems(event)
});
selectedValues = getValue(false);
},
clear(event) {
while (selectElement.length !== 0) {
selectElement.remove(0);
}
storage.setValue(id, {
value: null,
items: []
});
selectedValues = getValue(false);
},
insert(event) {
const {
index,
displayValue,
exportValue
} = event.detail.insert;
const selectChild = selectElement.children[index];
const optionElement = document.createElement("option");
optionElement.textContent = displayValue;
optionElement.value = exportValue;
if (selectChild) {
selectChild.before(optionElement);
} else {
selectElement.append(optionElement);
}
storage.setValue(id, {
value: getValue(true),
items: getItems(event)
});
selectedValues = getValue(false);
},
items(event) {
const {
items
} = event.detail;
while (selectElement.length !== 0) {
selectElement.remove(0);
}
for (const item of items) {
const {
displayValue,
exportValue
} = item;
const optionElement = document.createElement("option");
optionElement.textContent = displayValue;
optionElement.value = exportValue;
selectElement.append(optionElement);
}
if (selectElement.options.length > 0) {
selectElement.options[0].selected = true;
}
storage.setValue(id, {
value: getValue(true),
items: getItems(event)
});
selectedValues = getValue(false);
},
indices(event) {
const indices = new Set(event.detail.indices);
for (const option of event.target.options) {
option.selected = indices.has(option.index);
}
storage.setValue(id, {
value: getValue(true)
});
selectedValues = getValue(false);
},
editable(event) {
event.target.disabled = !event.detail.editable;
}
};
this._dispatchEventFromSandbox(actions, jsEvent);
});
selectElement.addEventListener("input", (event) => {
var _a2;
const exportValue = getValue(true);
const change = getValue(false);
storage.setValue(id, {
value: exportValue
});
event.preventDefault();
(_a2 = this.linkService.eventBus) == null ? void 0 : _a2.dispatch("dispatcheventinsandbox", {
source: this,
detail: {
id,
name: "Keystroke",
value: selectedValues,
change,
changeEx: exportValue,
willCommit: false,
commitKey: 1,
keyDown: false
}
});
});
this._setEventListeners(selectElement, null, [["focus", "Focus"], ["blur", "Blur"], ["mousedown", "Mouse Down"], ["mouseenter", "Mouse Enter"], ["mouseleave", "Mouse Exit"], ["mouseup", "Mouse Up"], ["input", "Action"], ["input", "Validate"]], (event) => event.target.value);
} else {
selectElement.addEventListener("input", function(event) {
storage.setValue(id, {
value: getValue(true)
});
});
}
if (this.data.combo) {
this._setTextStyle(selectElement);
} else {
}
this._setBackgroundColor(selectElement);
this._setDefaultPropertiesFromJS(selectElement);
this.container.append(selectElement);
return this.container;
}
};
var PopupAnnotationElement = class extends AnnotationElement {
constructor(parameters) {
const {
data,
elements
} = parameters;
super(parameters, {
isRenderable: AnnotationElement._hasPopupData(data)
});
this.elements = elements;
this.popup = null;
}
render() {
this.container.classList.add("popupAnnotation");
const popup = this.popup = new PopupElement({
container: this.container,
color: this.data.color,
titleObj: this.data.titleObj,
modificationDate: this.data.modificationDate,
contentsObj: this.data.contentsObj,
richText: this.data.richText,
rect: this.data.rect,
parentRect: this.data.parentRect || null,
parent: this.parent,
elements: this.elements,
open: this.data.open
});
const elementIds = [];
for (const element of this.elements) {
element.popup = popup;
elementIds.push(element.data.id);
element.addHighlightArea();
}
this.container.setAttribute("aria-controls", elementIds.map((id) => `${AnnotationPrefix}${id}`).join(","));
return this.container;
}
};
var _boundKeyDown, _boundHide, _boundShow, _boundToggle, _color, _container3, _contentsObj, _dateObj, _elements, _parent, _parentRect, _pinned, _popup, _position2, _rect, _richText, _titleObj, _updates2, _wasVisible, _html, html_get, _fontSize, fontSize_get, _fontColor, fontColor_get, _makePopupContent, makePopupContent_fn, _keyDown, keyDown_fn, _setPosition, setPosition_fn, _toggle, toggle_fn, _show, show_fn, _hide, hide_fn;
var PopupElement = class {
constructor({
container,
color: color2,
elements,
titleObj,
modificationDate,
contentsObj,
richText,
parent,
rect,
parentRect,
open
}) {
__privateAdd(this, _html);
__privateAdd(this, _fontSize);
__privateAdd(this, _fontColor);
__privateAdd(this, _makePopupContent);
__privateAdd(this, _keyDown);
__privateAdd(this, _setPosition);
__privateAdd(this, _toggle);
__privateAdd(this, _show);
__privateAdd(this, _hide);
__privateAdd(this, _boundKeyDown, __privateMethod(this, _keyDown, keyDown_fn).bind(this));
__privateAdd(this, _boundHide, __privateMethod(this, _hide, hide_fn).bind(this));
__privateAdd(this, _boundShow, __privateMethod(this, _show, show_fn).bind(this));
__privateAdd(this, _boundToggle, __privateMethod(this, _toggle, toggle_fn).bind(this));
__privateAdd(this, _color, null);
__privateAdd(this, _container3, null);
__privateAdd(this, _contentsObj, null);
__privateAdd(this, _dateObj, null);
__privateAdd(this, _elements, null);
__privateAdd(this, _parent, null);
__privateAdd(this, _parentRect, null);
__privateAdd(this, _pinned, false);
__privateAdd(this, _popup, null);
__privateAdd(this, _position2, null);
__privateAdd(this, _rect, null);
__privateAdd(this, _richText, null);
__privateAdd(this, _titleObj, null);
__privateAdd(this, _updates2, null);
__privateAdd(this, _wasVisible, false);
var _a2;
__privateSet(this, _container3, container);
__privateSet(this, _titleObj, titleObj);
__privateSet(this, _contentsObj, contentsObj);
__privateSet(this, _richText, richText);
__privateSet(this, _parent, parent);
__privateSet(this, _color, color2);
__privateSet(this, _rect, rect);
__privateSet(this, _parentRect, parentRect);
__privateSet(this, _elements, elements);
__privateSet(this, _dateObj, PDFDateString.toDateObject(modificationDate));
this.trigger = elements.flatMap((e) => e.getElementsToTriggerPopup());
for (const element of this.trigger) {
element.addEventListener("click", __privateGet(this, _boundToggle));
element.addEventListener("mouseenter", __privateGet(this, _boundShow));
element.addEventListener("mouseleave", __privateGet(this, _boundHide));
element.classList.add("popupTriggerArea");
}
for (const element of elements) {
(_a2 = element.container) == null ? void 0 : _a2.addEventListener("keydown", __privateGet(this, _boundKeyDown));
}
__privateGet(this, _container3).hidden = true;
if (open) {
__privateMethod(this, _toggle, toggle_fn).call(this);
}
}
render() {
if (__privateGet(this, _popup)) {
return;
}
const popup = __privateSet(this, _popup, document.createElement("div"));
popup.className = "popup";
if (__privateGet(this, _color)) {
const baseColor = popup.style.outlineColor = Util.makeHexColor(...__privateGet(this, _color));
if (CSS.supports("background-color", "color-mix(in srgb, red 30%, white)")) {
popup.style.backgroundColor = `color-mix(in srgb, ${baseColor} 30%, white)`;
} else {
const BACKGROUND_ENLIGHT = 0.7;
popup.style.backgroundColor = Util.makeHexColor(...__privateGet(this, _color).map((c) => Math.floor(BACKGROUND_ENLIGHT * (255 - c) + c)));
}
}
const header = document.createElement("span");
header.className = "header";
const title = document.createElement("h1");
header.append(title);
({
dir: title.dir,
str: title.textContent
} = __privateGet(this, _titleObj));
popup.append(header);
if (__privateGet(this, _dateObj)) {
const modificationDate = document.createElement("span");
modificationDate.classList.add("popupDate");
modificationDate.setAttribute("data-l10n-id", "pdfjs-annotation-date-time-string");
modificationDate.setAttribute("data-l10n-args", JSON.stringify({
dateObj: __privateGet(this, _dateObj).valueOf()
}));
header.append(modificationDate);
}
const html = __privateGet(this, _html, html_get);
if (html) {
XfaLayer.render({
xfaHtml: html,
intent: "richText",
div: popup
});
popup.lastChild.classList.add("richText", "popupContent");
} else {
const contents = this._formatContents(__privateGet(this, _contentsObj));
popup.append(contents);
}
__privateGet(this, _container3).append(popup);
}
_formatContents({
str,
dir
}) {
const p = document.createElement("p");
p.classList.add("popupContent");
p.dir = dir;
const lines = str.split(/(?:\r\n?|\n)/);
for (let i = 0, ii = lines.length; i < ii; ++i) {
const line = lines[i];
p.append(document.createTextNode(line));
if (i < ii - 1) {
p.append(document.createElement("br"));
}
}
return p;
}
updateEdited({
rect,
popupContent
}) {
var _a2;
__privateGet(this, _updates2) || __privateSet(this, _updates2, {
contentsObj: __privateGet(this, _contentsObj),
richText: __privateGet(this, _richText)
});
if (rect) {
__privateSet(this, _position2, null);
}
if (popupContent) {
__privateSet(this, _richText, __privateMethod(this, _makePopupContent, makePopupContent_fn).call(this, popupContent));
__privateSet(this, _contentsObj, null);
}
(_a2 = __privateGet(this, _popup)) == null ? void 0 : _a2.remove();
__privateSet(this, _popup, null);
}
resetEdited() {
var _a2;
if (!__privateGet(this, _updates2)) {
return;
}
({
contentsObj: __privateWrapper(this, _contentsObj)._,
richText: __privateWrapper(this, _richText)._
} = __privateGet(this, _updates2));
__privateSet(this, _updates2, null);
(_a2 = __privateGet(this, _popup)) == null ? void 0 : _a2.remove();
__privateSet(this, _popup, null);
__privateSet(this, _position2, null);
}
forceHide() {
__privateSet(this, _wasVisible, this.isVisible);
if (!__privateGet(this, _wasVisible)) {
return;
}
__privateGet(this, _container3).hidden = true;
}
maybeShow() {
if (!__privateGet(this, _wasVisible)) {
return;
}
if (!__privateGet(this, _popup)) {
__privateMethod(this, _show, show_fn).call(this);
}
__privateSet(this, _wasVisible, false);
__privateGet(this, _container3).hidden = false;
}
get isVisible() {
return __privateGet(this, _container3).hidden === false;
}
};
_boundKeyDown = new WeakMap();
_boundHide = new WeakMap();
_boundShow = new WeakMap();
_boundToggle = new WeakMap();
_color = new WeakMap();
_container3 = new WeakMap();
_contentsObj = new WeakMap();
_dateObj = new WeakMap();
_elements = new WeakMap();
_parent = new WeakMap();
_parentRect = new WeakMap();
_pinned = new WeakMap();
_popup = new WeakMap();
_position2 = new WeakMap();
_rect = new WeakMap();
_richText = new WeakMap();
_titleObj = new WeakMap();
_updates2 = new WeakMap();
_wasVisible = new WeakMap();
_html = new WeakSet();
html_get = function() {
const richText = __privateGet(this, _richText);
const contentsObj = __privateGet(this, _contentsObj);
if ((richText == null ? void 0 : richText.str) && (!(contentsObj == null ? void 0 : contentsObj.str) || contentsObj.str === richText.str)) {
return __privateGet(this, _richText).html || null;
}
return null;
};
_fontSize = new WeakSet();
fontSize_get = function() {
var _a2, _b, _c;
return ((_c = (_b = (_a2 = __privateGet(this, _html, html_get)) == null ? void 0 : _a2.attributes) == null ? void 0 : _b.style) == null ? void 0 : _c.fontSize) || 0;
};
_fontColor = new WeakSet();
fontColor_get = function() {
var _a2, _b, _c;
return ((_c = (_b = (_a2 = __privateGet(this, _html, html_get)) == null ? void 0 : _a2.attributes) == null ? void 0 : _b.style) == null ? void 0 : _c.color) || null;
};
_makePopupContent = new WeakSet();
makePopupContent_fn = function(text) {
const popupLines = [];
const popupContent = {
str: text,
html: {
name: "div",
attributes: {
dir: "auto"
},
children: [{
name: "p",
children: popupLines
}]
}
};
const lineAttributes = {
style: {
color: __privateGet(this, _fontColor, fontColor_get),
fontSize: __privateGet(this, _fontSize, fontSize_get) ? `calc(${__privateGet(this, _fontSize, fontSize_get)}px * var(--scale-factor))` : ""
}
};
for (const line of text.split("\n")) {
popupLines.push({
name: "span",
value: line,
attributes: lineAttributes
});
}
return popupContent;
};
_keyDown = new WeakSet();
keyDown_fn = function(event) {
if (event.altKey || event.shiftKey || event.ctrlKey || event.metaKey) {
return;
}
if (event.key === "Enter" || event.key === "Escape" && __privateGet(this, _pinned)) {
__privateMethod(this, _toggle, toggle_fn).call(this);
}
};
_setPosition = new WeakSet();
setPosition_fn = function() {
if (__privateGet(this, _position2) !== null) {
return;
}
const {
page: {
view
},
viewport: {
rawDims: {
pageWidth,
pageHeight,
pageX,
pageY
}
}
} = __privateGet(this, _parent);
let useParentRect = !!__privateGet(this, _parentRect);
let rect = useParentRect ? __privateGet(this, _parentRect) : __privateGet(this, _rect);
for (const element of __privateGet(this, _elements)) {
if (!rect || Util.intersect(element.data.rect, rect) !== null) {
rect = element.data.rect;
useParentRect = true;
break;
}
}
const normalizedRect = Util.normalizeRect([rect[0], view[3] - rect[1] + view[1], rect[2], view[3] - rect[3] + view[1]]);
const HORIZONTAL_SPACE_AFTER_ANNOTATION = 5;
const parentWidth = useParentRect ? rect[2] - rect[0] + HORIZONTAL_SPACE_AFTER_ANNOTATION : 0;
const popupLeft = normalizedRect[0] + parentWidth;
const popupTop = normalizedRect[1];
__privateSet(this, _position2, [100 * (popupLeft - pageX) / pageWidth, 100 * (popupTop - pageY) / pageHeight]);
const {
style
} = __privateGet(this, _container3);
style.left = `${__privateGet(this, _position2)[0]}%`;
style.top = `${__privateGet(this, _position2)[1]}%`;
};
_toggle = new WeakSet();
toggle_fn = function() {
__privateSet(this, _pinned, !__privateGet(this, _pinned));
if (__privateGet(this, _pinned)) {
__privateMethod(this, _show, show_fn).call(this);
__privateGet(this, _container3).addEventListener("click", __privateGet(this, _boundToggle));
__privateGet(this, _container3).addEventListener("keydown", __privateGet(this, _boundKeyDown));
} else {
__privateMethod(this, _hide, hide_fn).call(this);
__privateGet(this, _container3).removeEventListener("click", __privateGet(this, _boundToggle));
__privateGet(this, _container3).removeEventListener("keydown", __privateGet(this, _boundKeyDown));
}
};
_show = new WeakSet();
show_fn = function() {
if (!__privateGet(this, _popup)) {
this.render();
}
if (!this.isVisible) {
__privateMethod(this, _setPosition, setPosition_fn).call(this);
__privateGet(this, _container3).hidden = false;
__privateGet(this, _container3).style.zIndex = parseInt(__privateGet(this, _container3).style.zIndex) + 1e3;
} else if (__privateGet(this, _pinned)) {
__privateGet(this, _container3).classList.add("focused");
}
};
_hide = new WeakSet();
hide_fn = function() {
__privateGet(this, _container3).classList.remove("focused");
if (__privateGet(this, _pinned) || !this.isVisible) {
return;
}
__privateGet(this, _container3).hidden = true;
__privateGet(this, _container3).style.zIndex = parseInt(__privateGet(this, _container3).style.zIndex) - 1e3;
};
var FreeTextAnnotationElement = class extends AnnotationElement {
constructor(parameters) {
super(parameters, {
isRenderable: true,
ignoreBorder: true
});
this.textContent = parameters.data.textContent;
this.textPosition = parameters.data.textPosition;
this.annotationEditorType = AnnotationEditorType.FREETEXT;
}
render() {
this.container.classList.add("freeTextAnnotation");
if (this.textContent) {
const content = document.createElement("div");
content.classList.add("annotationTextContent");
content.setAttribute("role", "comment");
for (const line of this.textContent) {
const lineSpan = document.createElement("span");
lineSpan.textContent = line;
content.append(lineSpan);
}
this.container.append(content);
}
if (!this.data.popupRef && this.hasPopupData) {
this._createPopup();
}
this._editOnDoubleClick();
return this.container;
}
};
var _line;
var LineAnnotationElement = class extends AnnotationElement {
constructor(parameters) {
super(parameters, {
isRenderable: true,
ignoreBorder: true
});
__privateAdd(this, _line, null);
}
render() {
this.container.classList.add("lineAnnotation");
const data = this.data;
const {
width,
height
} = getRectDims(data.rect);
const svg = this.svgFactory.create(width, height, true);
const line = __privateSet(this, _line, this.svgFactory.createElement("svg:line"));
line.setAttribute("x1", data.rect[2] - data.lineCoordinates[0]);
line.setAttribute("y1", data.rect[3] - data.lineCoordinates[1]);
line.setAttribute("x2", data.rect[2] - data.lineCoordinates[2]);
line.setAttribute("y2", data.rect[3] - data.lineCoordinates[3]);
line.setAttribute("stroke-width", data.borderStyle.width || 1);
line.setAttribute("stroke", "transparent");
line.setAttribute("fill", "transparent");
svg.append(line);
this.container.append(svg);
if (!data.popupRef && this.hasPopupData) {
this._createPopup();
}
return this.container;
}
getElementsToTriggerPopup() {
return __privateGet(this, _line);
}
addHighlightArea() {
this.container.classList.add("highlightArea");
}
};
_line = new WeakMap();
var _square;
var SquareAnnotationElement = class extends AnnotationElement {
constructor(parameters) {
super(parameters, {
isRenderable: true,
ignoreBorder: true
});
__privateAdd(this, _square, null);
}
render() {
this.container.classList.add("squareAnnotation");
const data = this.data;
const {
width,
height
} = getRectDims(data.rect);
const svg = this.svgFactory.create(width, height, true);
const borderWidth = data.borderStyle.width;
const square = __privateSet(this, _square, this.svgFactory.createElement("svg:rect"));
square.setAttribute("x", borderWidth / 2);
square.setAttribute("y", borderWidth / 2);
square.setAttribute("width", width - borderWidth);
square.setAttribute("height", height - borderWidth);
square.setAttribute("stroke-width", borderWidth || 1);
square.setAttribute("stroke", "transparent");
square.setAttribute("fill", "transparent");
svg.append(square);
this.container.append(svg);
if (!data.popupRef && this.hasPopupData) {
this._createPopup();
}
return this.container;
}
getElementsToTriggerPopup() {
return __privateGet(this, _square);
}
addHighlightArea() {
this.container.classList.add("highlightArea");
}
};
_square = new WeakMap();
var _circle;
var CircleAnnotationElement = class extends AnnotationElement {
constructor(parameters) {
super(parameters, {
isRenderable: true,
ignoreBorder: true
});
__privateAdd(this, _circle, null);
}
render() {
this.container.classList.add("circleAnnotation");
const data = this.data;
const {
width,
height
} = getRectDims(data.rect);
const svg = this.svgFactory.create(width, height, true);
const borderWidth = data.borderStyle.width;
const circle = __privateSet(this, _circle, this.svgFactory.createElement("svg:ellipse"));
circle.setAttribute("cx", width / 2);
circle.setAttribute("cy", height / 2);
circle.setAttribute("rx", width / 2 - borderWidth / 2);
circle.setAttribute("ry", height / 2 - borderWidth / 2);
circle.setAttribute("stroke-width", borderWidth || 1);
circle.setAttribute("stroke", "transparent");
circle.setAttribute("fill", "transparent");
svg.append(circle);
this.container.append(svg);
if (!data.popupRef && this.hasPopupData) {
this._createPopup();
}
return this.container;
}
getElementsToTriggerPopup() {
return __privateGet(this, _circle);
}
addHighlightArea() {
this.container.classList.add("highlightArea");
}
};
_circle = new WeakMap();
var _polyline;
var PolylineAnnotationElement = class extends AnnotationElement {
constructor(parameters) {
super(parameters, {
isRenderable: true,
ignoreBorder: true
});
__privateAdd(this, _polyline, null);
this.containerClassName = "polylineAnnotation";
this.svgElementName = "svg:polyline";
}
render() {
this.container.classList.add(this.containerClassName);
const {
data: {
rect,
vertices,
borderStyle,
popupRef
}
} = this;
if (!vertices) {
return this.container;
}
const {
width,
height
} = getRectDims(rect);
const svg = this.svgFactory.create(width, height, true);
let points = [];
for (let i = 0, ii = vertices.length; i < ii; i += 2) {
const x = vertices[i] - rect[0];
const y = rect[3] - vertices[i + 1];
points.push(`${x},${y}`);
}
points = points.join(" ");
const polyline = __privateSet(this, _polyline, this.svgFactory.createElement(this.svgElementName));
polyline.setAttribute("points", points);
polyline.setAttribute("stroke-width", borderStyle.width || 1);
polyline.setAttribute("stroke", "transparent");
polyline.setAttribute("fill", "transparent");
svg.append(polyline);
this.container.append(svg);
if (!popupRef && this.hasPopupData) {
this._createPopup();
}
return this.container;
}
getElementsToTriggerPopup() {
return __privateGet(this, _polyline);
}
addHighlightArea() {
this.container.classList.add("highlightArea");
}
};
_polyline = new WeakMap();
var PolygonAnnotationElement = class extends PolylineAnnotationElement {
constructor(parameters) {
super(parameters);
this.containerClassName = "polygonAnnotation";
this.svgElementName = "svg:polygon";
}
};
var CaretAnnotationElement = class extends AnnotationElement {
constructor(parameters) {
super(parameters, {
isRenderable: true,
ignoreBorder: true
});
}
render() {
this.container.classList.add("caretAnnotation");
if (!this.data.popupRef && this.hasPopupData) {
this._createPopup();
}
return this.container;
}
};
var _polylines;
var InkAnnotationElement = class extends AnnotationElement {
constructor(parameters) {
super(parameters, {
isRenderable: true,
ignoreBorder: true
});
__privateAdd(this, _polylines, []);
this.containerClassName = "inkAnnotation";
this.svgElementName = "svg:polyline";
this.annotationEditorType = AnnotationEditorType.INK;
}
render() {
this.container.classList.add(this.containerClassName);
const {
data: {
rect,
inkLists,
borderStyle,
popupRef
}
} = this;
const {
width,
height
} = getRectDims(rect);
const svg = this.svgFactory.create(width, height, true);
for (const inkList of inkLists) {
let points = [];
for (let i = 0, ii = inkList.length; i < ii; i += 2) {
const x = inkList[i] - rect[0];
const y = rect[3] - inkList[i + 1];
points.push(`${x},${y}`);
}
points = points.join(" ");
const polyline = this.svgFactory.createElement(this.svgElementName);
__privateGet(this, _polylines).push(polyline);
polyline.setAttribute("points", points);
polyline.setAttribute("stroke-width", borderStyle.width || 1);
polyline.setAttribute("stroke", "transparent");
polyline.setAttribute("fill", "transparent");
if (!popupRef && this.hasPopupData) {
this._createPopup();
}
svg.append(polyline);
}
this.container.append(svg);
return this.container;
}
getElementsToTriggerPopup() {
return __privateGet(this, _polylines);
}
addHighlightArea() {
this.container.classList.add("highlightArea");
}
};
_polylines = new WeakMap();
var HighlightAnnotationElement = class extends AnnotationElement {
constructor(parameters) {
super(parameters, {
isRenderable: true,
ignoreBorder: true,
createQuadrilaterals: true
});
}
render() {
if (!this.data.popupRef && this.hasPopupData) {
this._createPopup();
}
this.container.classList.add("highlightAnnotation");
return this.container;
}
};
var UnderlineAnnotationElement = class extends AnnotationElement {
constructor(parameters) {
super(parameters, {
isRenderable: true,
ignoreBorder: true,
createQuadrilaterals: true
});
}
render() {
if (!this.data.popupRef && this.hasPopupData) {
this._createPopup();
}
this.container.classList.add("underlineAnnotation");
return this.container;
}
};
var SquigglyAnnotationElement = class extends AnnotationElement {
constructor(parameters) {
super(parameters, {
isRenderable: true,
ignoreBorder: true,
createQuadrilaterals: true
});
}
render() {
if (!this.data.popupRef && this.hasPopupData) {
this._createPopup();
}
this.container.classList.add("squigglyAnnotation");
return this.container;
}
};
var StrikeOutAnnotationElement = class extends AnnotationElement {
constructor(parameters) {
super(parameters, {
isRenderable: true,
ignoreBorder: true,
createQuadrilaterals: true
});
}
render() {
if (!this.data.popupRef && this.hasPopupData) {
this._createPopup();
}
this.container.classList.add("strikeoutAnnotation");
return this.container;
}
};
var StampAnnotationElement = class extends AnnotationElement {
constructor(parameters) {
super(parameters, {
isRenderable: true,
ignoreBorder: true
});
}
render() {
this.container.classList.add("stampAnnotation");
if (!this.data.popupRef && this.hasPopupData) {
this._createPopup();
}
return this.container;
}
};
var _trigger, _download, download_fn;
var FileAttachmentAnnotationElement = class extends AnnotationElement {
constructor(parameters) {
var _a2;
super(parameters, {
isRenderable: true
});
__privateAdd(this, _download);
__privateAdd(this, _trigger, null);
const {
file
} = this.data;
this.filename = file.filename;
this.content = file.content;
(_a2 = this.linkService.eventBus) == null ? void 0 : _a2.dispatch("fileattachmentannotation", {
source: this,
...file
});
}
render() {
this.container.classList.add("fileAttachmentAnnotation");
const {
container,
data
} = this;
let trigger;
if (data.hasAppearance || data.fillAlpha === 0) {
trigger = document.createElement("div");
} else {
trigger = document.createElement("img");
trigger.src = `${this.imageResourcesPath}annotation-${/paperclip/i.test(data.name) ? "paperclip" : "pushpin"}.svg`;
if (data.fillAlpha && data.fillAlpha < 1) {
trigger.style = `filter: opacity(${Math.round(data.fillAlpha * 100)}%);`;
}
}
trigger.addEventListener("dblclick", __privateMethod(this, _download, download_fn).bind(this));
__privateSet(this, _trigger, trigger);
const {
isMac
} = util_FeatureTest.platform;
container.addEventListener("keydown", (evt) => {
if (evt.key === "Enter" && (isMac ? evt.metaKey : evt.ctrlKey)) {
__privateMethod(this, _download, download_fn).call(this);
}
});
if (!data.popupRef && this.hasPopupData) {
this._createPopup();
} else {
trigger.classList.add("popupTriggerArea");
}
container.append(trigger);
return container;
}
getElementsToTriggerPopup() {
return __privateGet(this, _trigger);
}
addHighlightArea() {
this.container.classList.add("highlightArea");
}
};
_trigger = new WeakMap();
_download = new WeakSet();
download_fn = function() {
var _a2;
(_a2 = this.downloadManager) == null ? void 0 : _a2.openOrDownloadData(this.content, this.filename);
};
var _accessibilityManager, _annotationCanvasMap, _editableAnnotations, _appendElement, appendElement_fn, _setAnnotationCanvasMap, setAnnotationCanvasMap_fn;
var AnnotationLayer = class {
constructor({
div,
accessibilityManager,
annotationCanvasMap,
annotationEditorUIManager,
page,
viewport
}) {
__privateAdd(this, _appendElement);
__privateAdd(this, _setAnnotationCanvasMap);
__privateAdd(this, _accessibilityManager, null);
__privateAdd(this, _annotationCanvasMap, null);
__privateAdd(this, _editableAnnotations, /* @__PURE__ */ new Map());
this.div = div;
__privateSet(this, _accessibilityManager, accessibilityManager);
__privateSet(this, _annotationCanvasMap, annotationCanvasMap);
this.page = page;
this.viewport = viewport;
this.zIndex = 0;
this._annotationEditorUIManager = annotationEditorUIManager;
}
hasEditableAnnotations() {
return __privateGet(this, _editableAnnotations).size > 0;
}
async render(params) {
var _a2;
const {
annotations
} = params;
const layer = this.div;
setLayerDimensions(layer, this.viewport);
const popupToElements = /* @__PURE__ */ new Map();
const elementParams = {
data: null,
layer,
linkService: params.linkService,
downloadManager: params.downloadManager,
imageResourcesPath: params.imageResourcesPath || "",
renderForms: params.renderForms !== false,
svgFactory: new DOMSVGFactory(),
annotationStorage: params.annotationStorage || new AnnotationStorage(),
enableScripting: params.enableScripting === true,
hasJSActions: params.hasJSActions,
fieldObjects: params.fieldObjects,
parent: this,
elements: null
};
for (const data of annotations) {
if (data.noHTML) {
continue;
}
const isPopupAnnotation = data.annotationType === AnnotationType.POPUP;
if (!isPopupAnnotation) {
const {
width,
height
} = getRectDims(data.rect);
if (width <= 0 || height <= 0) {
continue;
}
} else {
const elements = popupToElements.get(data.id);
if (!elements) {
continue;
}
elementParams.elements = elements;
}
elementParams.data = data;
const element = AnnotationElementFactory.create(elementParams);
if (!element.isRenderable) {
continue;
}
if (!isPopupAnnotation && data.popupRef) {
const elements = popupToElements.get(data.popupRef);
if (!elements) {
popupToElements.set(data.popupRef, [element]);
} else {
elements.push(element);
}
}
const rendered = element.render();
if (data.hidden) {
rendered.style.visibility = "hidden";
}
__privateMethod(this, _appendElement, appendElement_fn).call(this, rendered, data.id);
if (element._isEditable) {
__privateGet(this, _editableAnnotations).set(element.data.id, element);
(_a2 = this._annotationEditorUIManager) == null ? void 0 : _a2.renderAnnotationElement(element);
}
}
__privateMethod(this, _setAnnotationCanvasMap, setAnnotationCanvasMap_fn).call(this);
}
update({
viewport
}) {
const layer = this.div;
this.viewport = viewport;
setLayerDimensions(layer, {
rotation: viewport.rotation
});
__privateMethod(this, _setAnnotationCanvasMap, setAnnotationCanvasMap_fn).call(this);
layer.hidden = false;
}
getEditableAnnotations() {
return Array.from(__privateGet(this, _editableAnnotations).values());
}
getEditableAnnotation(id) {
return __privateGet(this, _editableAnnotations).get(id);
}
};
_accessibilityManager = new WeakMap();
_annotationCanvasMap = new WeakMap();
_editableAnnotations = new WeakMap();
_appendElement = new WeakSet();
appendElement_fn = function(element, id) {
var _a2;
const contentElement = element.firstChild || element;
contentElement.id = `${AnnotationPrefix}${id}`;
this.div.append(element);
(_a2 = __privateGet(this, _accessibilityManager)) == null ? void 0 : _a2.moveElementInDOM(this.div, element, contentElement, false);
};
_setAnnotationCanvasMap = new WeakSet();
setAnnotationCanvasMap_fn = function() {
if (!__privateGet(this, _annotationCanvasMap)) {
return;
}
const layer = this.div;
for (const [id, canvas] of __privateGet(this, _annotationCanvasMap)) {
const element = layer.querySelector(`[data-annotation-id="${id}"]`);
if (!element) {
continue;
}
canvas.className = "annotationContent";
const {
firstChild
} = element;
if (!firstChild) {
element.append(canvas);
} else if (firstChild.nodeName === "CANVAS") {
firstChild.replaceWith(canvas);
} else if (!firstChild.classList.contains("annotationContent")) {
firstChild.before(canvas);
} else {
firstChild.after(canvas);
}
}
__privateGet(this, _annotationCanvasMap).clear();
};
var EOL_PATTERN = /\r\n?|\n/g;
var _color2, _content, _editorDivId, _editModeAC, _fontSize2, _initialData, _updateFontSize, updateFontSize_fn, _updateColor, updateColor_fn, _extractText, extractText_fn, _setEditorDimensions, setEditorDimensions_fn, _getNodeContent, getNodeContent_fn, _setContent, setContent_fn, _serializeContent, serializeContent_fn, _deserializeContent, deserializeContent_fn, _hasElementChanged, hasElementChanged_fn;
var _FreeTextEditor = class extends AnnotationEditor {
constructor(params) {
super({
...params,
name: "freeTextEditor"
});
__privateAdd(this, _updateFontSize);
__privateAdd(this, _updateColor);
__privateAdd(this, _extractText);
__privateAdd(this, _setEditorDimensions);
__privateAdd(this, _setContent);
__privateAdd(this, _serializeContent);
__privateAdd(this, _hasElementChanged);
__privateAdd(this, _color2, void 0);
__privateAdd(this, _content, "");
__privateAdd(this, _editorDivId, `${this.id}-editor`);
__privateAdd(this, _editModeAC, null);
__privateAdd(this, _fontSize2, void 0);
__privateAdd(this, _initialData, null);
__privateSet(this, _color2, params.color || _FreeTextEditor._defaultColor || AnnotationEditor._defaultLineColor);
__privateSet(this, _fontSize2, params.fontSize || _FreeTextEditor._defaultFontSize);
}
static get _keyboardManager() {
const proto = _FreeTextEditor.prototype;
const arrowChecker = (self) => self.isEmpty();
const small = AnnotationEditorUIManager.TRANSLATE_SMALL;
const big = AnnotationEditorUIManager.TRANSLATE_BIG;
return shadow(this, "_keyboardManager", new KeyboardManager([[["ctrl+s", "mac+meta+s", "ctrl+p", "mac+meta+p"], proto.commitOrRemove, {
bubbles: true
}], [["ctrl+Enter", "mac+meta+Enter", "Escape", "mac+Escape"], proto.commitOrRemove], [["ArrowLeft", "mac+ArrowLeft"], proto._translateEmpty, {
args: [-small, 0],
checker: arrowChecker
}], [["ctrl+ArrowLeft", "mac+shift+ArrowLeft"], proto._translateEmpty, {
args: [-big, 0],
checker: arrowChecker
}], [["ArrowRight", "mac+ArrowRight"], proto._translateEmpty, {
args: [small, 0],
checker: arrowChecker
}], [["ctrl+ArrowRight", "mac+shift+ArrowRight"], proto._translateEmpty, {
args: [big, 0],
checker: arrowChecker
}], [["ArrowUp", "mac+ArrowUp"], proto._translateEmpty, {
args: [0, -small],
checker: arrowChecker
}], [["ctrl+ArrowUp", "mac+shift+ArrowUp"], proto._translateEmpty, {
args: [0, -big],
checker: arrowChecker
}], [["ArrowDown", "mac+ArrowDown"], proto._translateEmpty, {
args: [0, small],
checker: arrowChecker
}], [["ctrl+ArrowDown", "mac+shift+ArrowDown"], proto._translateEmpty, {
args: [0, big],
checker: arrowChecker
}]]));
}
static initialize(l10n, uiManager) {
AnnotationEditor.initialize(l10n, uiManager, {
strings: ["pdfjs-free-text-default-content"]
});
const style = getComputedStyle(document.documentElement);
this._internalPadding = parseFloat(style.getPropertyValue("--freetext-padding"));
}
static updateDefaultParams(type, value) {
switch (type) {
case AnnotationEditorParamsType.FREETEXT_SIZE:
_FreeTextEditor._defaultFontSize = value;
break;
case AnnotationEditorParamsType.FREETEXT_COLOR:
_FreeTextEditor._defaultColor = value;
break;
}
}
updateParams(type, value) {
switch (type) {
case AnnotationEditorParamsType.FREETEXT_SIZE:
__privateMethod(this, _updateFontSize, updateFontSize_fn).call(this, value);
break;
case AnnotationEditorParamsType.FREETEXT_COLOR:
__privateMethod(this, _updateColor, updateColor_fn).call(this, value);
break;
}
}
static get defaultPropertiesToUpdate() {
return [[AnnotationEditorParamsType.FREETEXT_SIZE, _FreeTextEditor._defaultFontSize], [AnnotationEditorParamsType.FREETEXT_COLOR, _FreeTextEditor._defaultColor || AnnotationEditor._defaultLineColor]];
}
get propertiesToUpdate() {
return [[AnnotationEditorParamsType.FREETEXT_SIZE, __privateGet(this, _fontSize2)], [AnnotationEditorParamsType.FREETEXT_COLOR, __privateGet(this, _color2)]];
}
_translateEmpty(x, y) {
this._uiManager.translateSelectedEditors(x, y, true);
}
getInitialTranslation() {
const scale = this.parentScale;
return [-_FreeTextEditor._internalPadding * scale, -(_FreeTextEditor._internalPadding + __privateGet(this, _fontSize2)) * scale];
}
rebuild() {
if (!this.parent) {
return;
}
super.rebuild();
if (this.div === null) {
return;
}
if (!this.isAttachedToDOM) {
this.parent.add(this);
}
}
enableEditMode() {
if (this.isInEditMode()) {
return;
}
this.parent.setEditingState(false);
this.parent.updateToolbar(AnnotationEditorType.FREETEXT);
super.enableEditMode();
this.overlayDiv.classList.remove("enabled");
this.editorDiv.contentEditable = true;
this._isDraggable = false;
this.div.removeAttribute("aria-activedescendant");
__privateSet(this, _editModeAC, new AbortController());
const signal = this._uiManager.combinedSignal(__privateGet(this, _editModeAC));
this.editorDiv.addEventListener("keydown", this.editorDivKeydown.bind(this), {
signal
});
this.editorDiv.addEventListener("focus", this.editorDivFocus.bind(this), {
signal
});
this.editorDiv.addEventListener("blur", this.editorDivBlur.bind(this), {
signal
});
this.editorDiv.addEventListener("input", this.editorDivInput.bind(this), {
signal
});
this.editorDiv.addEventListener("paste", this.editorDivPaste.bind(this), {
signal
});
}
disableEditMode() {
var _a2;
if (!this.isInEditMode()) {
return;
}
this.parent.setEditingState(true);
super.disableEditMode();
this.overlayDiv.classList.add("enabled");
this.editorDiv.contentEditable = false;
this.div.setAttribute("aria-activedescendant", __privateGet(this, _editorDivId));
this._isDraggable = true;
(_a2 = __privateGet(this, _editModeAC)) == null ? void 0 : _a2.abort();
__privateSet(this, _editModeAC, null);
this.div.focus({
preventScroll: true
});
this.isEditing = false;
this.parent.div.classList.add("freetextEditing");
}
focusin(event) {
if (!this._focusEventsAllowed) {
return;
}
super.focusin(event);
if (event.target !== this.editorDiv) {
this.editorDiv.focus();
}
}
onceAdded() {
var _a2;
if (this.width) {
return;
}
this.enableEditMode();
this.editorDiv.focus();
if ((_a2 = this._initialOptions) == null ? void 0 : _a2.isCentered) {
this.center();
}
this._initialOptions = null;
}
isEmpty() {
return !this.editorDiv || this.editorDiv.innerText.trim() === "";
}
remove() {
this.isEditing = false;
if (this.parent) {
this.parent.setEditingState(true);
this.parent.div.classList.add("freetextEditing");
}
super.remove();
}
commit() {
if (!this.isInEditMode()) {
return;
}
super.commit();
this.disableEditMode();
const savedText = __privateGet(this, _content);
const newText = __privateSet(this, _content, __privateMethod(this, _extractText, extractText_fn).call(this).trimEnd());
if (savedText === newText) {
return;
}
const setText = (text) => {
__privateSet(this, _content, text);
if (!text) {
this.remove();
return;
}
__privateMethod(this, _setContent, setContent_fn).call(this);
this._uiManager.rebuild(this);
__privateMethod(this, _setEditorDimensions, setEditorDimensions_fn).call(this);
};
this.addCommands({
cmd: () => {
setText(newText);
},
undo: () => {
setText(savedText);
},
mustExec: false
});
__privateMethod(this, _setEditorDimensions, setEditorDimensions_fn).call(this);
}
shouldGetKeyboardEvents() {
return this.isInEditMode();
}
enterInEditMode() {
this.enableEditMode();
this.editorDiv.focus();
}
dblclick(event) {
this.enterInEditMode();
}
keydown(event) {
if (event.target === this.div && event.key === "Enter") {
this.enterInEditMode();
event.preventDefault();
}
}
editorDivKeydown(event) {
_FreeTextEditor._keyboardManager.exec(this, event);
}
editorDivFocus(event) {
this.isEditing = true;
}
editorDivBlur(event) {
this.isEditing = false;
}
editorDivInput(event) {
this.parent.div.classList.toggle("freetextEditing", this.isEmpty());
}
disableEditing() {
this.editorDiv.setAttribute("role", "comment");
this.editorDiv.removeAttribute("aria-multiline");
}
enableEditing() {
this.editorDiv.setAttribute("role", "textbox");
this.editorDiv.setAttribute("aria-multiline", true);
}
render() {
if (this.div) {
return this.div;
}
let baseX, baseY;
if (this.width) {
baseX = this.x;
baseY = this.y;
}
super.render();
this.editorDiv = document.createElement("div");
this.editorDiv.className = "internal";
this.editorDiv.setAttribute("id", __privateGet(this, _editorDivId));
this.editorDiv.setAttribute("data-l10n-id", "pdfjs-free-text");
this.enableEditing();
AnnotationEditor._l10nPromise.get("pdfjs-free-text-default-content").then((msg) => {
var _a2;
return (_a2 = this.editorDiv) == null ? void 0 : _a2.setAttribute("default-content", msg);
});
this.editorDiv.contentEditable = true;
const {
style
} = this.editorDiv;
style.fontSize = `calc(${__privateGet(this, _fontSize2)}px * var(--scale-factor))`;
style.color = __privateGet(this, _color2);
this.div.append(this.editorDiv);
this.overlayDiv = document.createElement("div");
this.overlayDiv.classList.add("overlay", "enabled");
this.div.append(this.overlayDiv);
bindEvents(this, this.div, ["dblclick", "keydown"]);
if (this.width) {
const [parentWidth, parentHeight] = this.parentDimensions;
if (this.annotationElementId) {
const {
position
} = __privateGet(this, _initialData);
let [tx, ty] = this.getInitialTranslation();
[tx, ty] = this.pageTranslationToScreen(tx, ty);
const [pageWidth, pageHeight] = this.pageDimensions;
const [pageX, pageY] = this.pageTranslation;
let posX, posY;
switch (this.rotation) {
case 0:
posX = baseX + (position[0] - pageX) / pageWidth;
posY = baseY + this.height - (position[1] - pageY) / pageHeight;
break;
case 90:
posX = baseX + (position[0] - pageX) / pageWidth;
posY = baseY - (position[1] - pageY) / pageHeight;
[tx, ty] = [ty, -tx];
break;
case 180:
posX = baseX - this.width + (position[0] - pageX) / pageWidth;
posY = baseY - (position[1] - pageY) / pageHeight;
[tx, ty] = [-tx, -ty];
break;
case 270:
posX = baseX + (position[0] - pageX - this.height * pageHeight) / pageWidth;
posY = baseY + (position[1] - pageY - this.width * pageWidth) / pageHeight;
[tx, ty] = [-ty, tx];
break;
}
this.setAt(posX * parentWidth, posY * parentHeight, tx, ty);
} else {
this.setAt(baseX * parentWidth, baseY * parentHeight, this.width * parentWidth, this.height * parentHeight);
}
__privateMethod(this, _setContent, setContent_fn).call(this);
this._isDraggable = true;
this.editorDiv.contentEditable = false;
} else {
this._isDraggable = false;
this.editorDiv.contentEditable = true;
}
return this.div;
}
editorDivPaste(event) {
var _a2, _b, _c;
const clipboardData = event.clipboardData || window.clipboardData;
const {
types
} = clipboardData;
if (types.length === 1 && types[0] === "text/plain") {
return;
}
event.preventDefault();
const paste = __privateMethod(_a2 = _FreeTextEditor, _deserializeContent, deserializeContent_fn).call(_a2, clipboardData.getData("text") || "").replaceAll(EOL_PATTERN, "\n");
if (!paste) {
return;
}
const selection = window.getSelection();
if (!selection.rangeCount) {
return;
}
this.editorDiv.normalize();
selection.deleteFromDocument();
const range = selection.getRangeAt(0);
if (!paste.includes("\n")) {
range.insertNode(document.createTextNode(paste));
this.editorDiv.normalize();
selection.collapseToStart();
return;
}
const {
startContainer,
startOffset
} = range;
const bufferBefore = [];
const bufferAfter = [];
if (startContainer.nodeType === Node.TEXT_NODE) {
const parent = startContainer.parentElement;
bufferAfter.push(startContainer.nodeValue.slice(startOffset).replaceAll(EOL_PATTERN, ""));
if (parent !== this.editorDiv) {
let buffer = bufferBefore;
for (const child of this.editorDiv.childNodes) {
if (child === parent) {
buffer = bufferAfter;
continue;
}
buffer.push(__privateMethod(_b = _FreeTextEditor, _getNodeContent, getNodeContent_fn).call(_b, child));
}
}
bufferBefore.push(startContainer.nodeValue.slice(0, startOffset).replaceAll(EOL_PATTERN, ""));
} else if (startContainer === this.editorDiv) {
let buffer = bufferBefore;
let i = 0;
for (const child of this.editorDiv.childNodes) {
if (i++ === startOffset) {
buffer = bufferAfter;
}
buffer.push(__privateMethod(_c = _FreeTextEditor, _getNodeContent, getNodeContent_fn).call(_c, child));
}
}
__privateSet(this, _content, `${bufferBefore.join("\n")}${paste}${bufferAfter.join("\n")}`);
__privateMethod(this, _setContent, setContent_fn).call(this);
const newRange = new Range();
let beforeLength = bufferBefore.reduce((acc, line) => acc + line.length, 0);
for (const {
firstChild
} of this.editorDiv.childNodes) {
if (firstChild.nodeType === Node.TEXT_NODE) {
const length = firstChild.nodeValue.length;
if (beforeLength <= length) {
newRange.setStart(firstChild, beforeLength);
newRange.setEnd(firstChild, beforeLength);
break;
}
beforeLength -= length;
}
}
selection.removeAllRanges();
selection.addRange(newRange);
}
get contentDiv() {
return this.editorDiv;
}
static deserialize(data, parent, uiManager) {
var _a2;
let initialData = null;
if (data instanceof FreeTextAnnotationElement) {
const {
data: {
defaultAppearanceData: {
fontSize,
fontColor
},
rect,
rotation,
id
},
textContent,
textPosition,
parent: {
page: {
pageNumber
}
}
} = data;
if (!textContent || textContent.length === 0) {
return null;
}
initialData = data = {
annotationType: AnnotationEditorType.FREETEXT,
color: Array.from(fontColor),
fontSize,
value: textContent.join("\n"),
position: textPosition,
pageIndex: pageNumber - 1,
rect: rect.slice(0),
rotation,
id,
deleted: false
};
}
const editor = super.deserialize(data, parent, uiManager);
__privateSet(editor, _fontSize2, data.fontSize);
__privateSet(editor, _color2, Util.makeHexColor(...data.color));
__privateSet(editor, _content, __privateMethod(_a2 = _FreeTextEditor, _deserializeContent, deserializeContent_fn).call(_a2, data.value));
editor.annotationElementId = data.id || null;
__privateSet(editor, _initialData, initialData);
return editor;
}
serialize(isForCopying = false) {
if (this.isEmpty()) {
return null;
}
if (this.deleted) {
return {
pageIndex: this.pageIndex,
id: this.annotationElementId,
deleted: true
};
}
const padding = _FreeTextEditor._internalPadding * this.parentScale;
const rect = this.getRect(padding, padding);
const color2 = AnnotationEditor._colorManager.convert(this.isAttachedToDOM ? getComputedStyle(this.editorDiv).color : __privateGet(this, _color2));
const serialized = {
annotationType: AnnotationEditorType.FREETEXT,
color: color2,
fontSize: __privateGet(this, _fontSize2),
value: __privateMethod(this, _serializeContent, serializeContent_fn).call(this),
pageIndex: this.pageIndex,
rect,
rotation: this.rotation,
structTreeParentId: this._structTreeParentId
};
if (isForCopying) {
return serialized;
}
if (this.annotationElementId && !__privateMethod(this, _hasElementChanged, hasElementChanged_fn).call(this, serialized)) {
return null;
}
serialized.id = this.annotationElementId;
return serialized;
}
renderAnnotationElement(annotation) {
const content = super.renderAnnotationElement(annotation);
if (this.deleted) {
return content;
}
const {
style
} = content;
style.fontSize = `calc(${__privateGet(this, _fontSize2)}px * var(--scale-factor))`;
style.color = __privateGet(this, _color2);
content.replaceChildren();
for (const line of __privateGet(this, _content).split("\n")) {
const div = document.createElement("div");
div.append(line ? document.createTextNode(line) : document.createElement("br"));
content.append(div);
}
const padding = _FreeTextEditor._internalPadding * this.parentScale;
annotation.updateEdited({
rect: this.getRect(padding, padding),
popupContent: __privateGet(this, _content)
});
return content;
}
resetAnnotationElement(annotation) {
super.resetAnnotationElement(annotation);
annotation.resetEdited();
}
};
var FreeTextEditor = _FreeTextEditor;
_color2 = new WeakMap();
_content = new WeakMap();
_editorDivId = new WeakMap();
_editModeAC = new WeakMap();
_fontSize2 = new WeakMap();
_initialData = new WeakMap();
_updateFontSize = new WeakSet();
updateFontSize_fn = function(fontSize) {
const setFontsize = (size) => {
this.editorDiv.style.fontSize = `calc(${size}px * var(--scale-factor))`;
this.translate(0, -(size - __privateGet(this, _fontSize2)) * this.parentScale);
__privateSet(this, _fontSize2, size);
__privateMethod(this, _setEditorDimensions, setEditorDimensions_fn).call(this);
};
const savedFontsize = __privateGet(this, _fontSize2);
this.addCommands({
cmd: setFontsize.bind(this, fontSize),
undo: setFontsize.bind(this, savedFontsize),
post: this._uiManager.updateUI.bind(this._uiManager, this),
mustExec: true,
type: AnnotationEditorParamsType.FREETEXT_SIZE,
overwriteIfSameType: true,
keepUndo: true
});
};
_updateColor = new WeakSet();
updateColor_fn = function(color2) {
const setColor = (col) => {
__privateSet(this, _color2, this.editorDiv.style.color = col);
};
const savedColor = __privateGet(this, _color2);
this.addCommands({
cmd: setColor.bind(this, color2),
undo: setColor.bind(this, savedColor),
post: this._uiManager.updateUI.bind(this._uiManager, this),
mustExec: true,
type: AnnotationEditorParamsType.FREETEXT_COLOR,
overwriteIfSameType: true,
keepUndo: true
});
};
_extractText = new WeakSet();
extractText_fn = function() {
var _a2;
const buffer = [];
this.editorDiv.normalize();
for (const child of this.editorDiv.childNodes) {
buffer.push(__privateMethod(_a2 = _FreeTextEditor, _getNodeContent, getNodeContent_fn).call(_a2, child));
}
return buffer.join("\n");
};
_setEditorDimensions = new WeakSet();
setEditorDimensions_fn = function() {
const [parentWidth, parentHeight] = this.parentDimensions;
let rect;
if (this.isAttachedToDOM) {
rect = this.div.getBoundingClientRect();
} else {
const {
currentLayer,
div
} = this;
const savedDisplay = div.style.display;
const savedVisibility = div.classList.contains("hidden");
div.classList.remove("hidden");
div.style.display = "hidden";
currentLayer.div.append(this.div);
rect = div.getBoundingClientRect();
div.remove();
div.style.display = savedDisplay;
div.classList.toggle("hidden", savedVisibility);
}
if (this.rotation % 180 === this.parentRotation % 180) {
this.width = rect.width / parentWidth;
this.height = rect.height / parentHeight;
} else {
this.width = rect.height / parentWidth;
this.height = rect.width / parentHeight;
}
this.fixAndSetPosition();
};
_getNodeContent = new WeakSet();
getNodeContent_fn = function(node) {
return (node.nodeType === Node.TEXT_NODE ? node.nodeValue : node.innerText).replaceAll(EOL_PATTERN, "");
};
_setContent = new WeakSet();
setContent_fn = function() {
this.editorDiv.replaceChildren();
if (!__privateGet(this, _content)) {
return;
}
for (const line of __privateGet(this, _content).split("\n")) {
const div = document.createElement("div");
div.append(line ? document.createTextNode(line) : document.createElement("br"));
this.editorDiv.append(div);
}
};
_serializeContent = new WeakSet();
serializeContent_fn = function() {
return __privateGet(this, _content).replaceAll("\xA0", " ");
};
_deserializeContent = new WeakSet();
deserializeContent_fn = function(content) {
return content.replaceAll(" ", "\xA0");
};
_hasElementChanged = new WeakSet();
hasElementChanged_fn = function(serialized) {
const {
value,
fontSize,
color: color2,
pageIndex
} = __privateGet(this, _initialData);
return this._hasBeenMoved || serialized.value !== value || serialized.fontSize !== fontSize || serialized.color.some((c, i) => c !== color2[i]) || serialized.pageIndex !== pageIndex;
};
__privateAdd(FreeTextEditor, _getNodeContent);
__privateAdd(FreeTextEditor, _deserializeContent);
__publicField(FreeTextEditor, "_freeTextDefaultContent", "");
__publicField(FreeTextEditor, "_internalPadding", 0);
__publicField(FreeTextEditor, "_defaultColor", null);
__publicField(FreeTextEditor, "_defaultFontSize", 10);
__publicField(FreeTextEditor, "_type", "freetext");
__publicField(FreeTextEditor, "_editorType", AnnotationEditorType.FREETEXT);
var _box, _verticalEdges, _intervals, _getOutlines, getOutlines_fn, _binarySearch, binarySearch_fn, _insert, insert_fn, _remove, remove_fn, _breakEdge, breakEdge_fn;
var Outliner = class {
constructor(boxes, borderWidth = 0, innerMargin = 0, isLTR = true) {
__privateAdd(this, _getOutlines);
__privateAdd(this, _binarySearch);
__privateAdd(this, _insert);
__privateAdd(this, _remove);
__privateAdd(this, _breakEdge);
__privateAdd(this, _box, void 0);
__privateAdd(this, _verticalEdges, []);
__privateAdd(this, _intervals, []);
let minX = Infinity;
let maxX = -Infinity;
let minY = Infinity;
let maxY = -Infinity;
const NUMBER_OF_DIGITS = 4;
const EPSILON = 10 ** -NUMBER_OF_DIGITS;
for (const {
x,
y,
width,
height
} of boxes) {
const x1 = Math.floor((x - borderWidth) / EPSILON) * EPSILON;
const x2 = Math.ceil((x + width + borderWidth) / EPSILON) * EPSILON;
const y1 = Math.floor((y - borderWidth) / EPSILON) * EPSILON;
const y2 = Math.ceil((y + height + borderWidth) / EPSILON) * EPSILON;
const left = [x1, y1, y2, true];
const right = [x2, y1, y2, false];
__privateGet(this, _verticalEdges).push(left, right);
minX = Math.min(minX, x1);
maxX = Math.max(maxX, x2);
minY = Math.min(minY, y1);
maxY = Math.max(maxY, y2);
}
const bboxWidth = maxX - minX + 2 * innerMargin;
const bboxHeight = maxY - minY + 2 * innerMargin;
const shiftedMinX = minX - innerMargin;
const shiftedMinY = minY - innerMargin;
const lastEdge = __privateGet(this, _verticalEdges).at(isLTR ? -1 : -2);
const lastPoint = [lastEdge[0], lastEdge[2]];
for (const edge of __privateGet(this, _verticalEdges)) {
const [x, y1, y2] = edge;
edge[0] = (x - shiftedMinX) / bboxWidth;
edge[1] = (y1 - shiftedMinY) / bboxHeight;
edge[2] = (y2 - shiftedMinY) / bboxHeight;
}
__privateSet(this, _box, {
x: shiftedMinX,
y: shiftedMinY,
width: bboxWidth,
height: bboxHeight,
lastPoint
});
}
getOutlines() {
__privateGet(this, _verticalEdges).sort((a, b) => a[0] - b[0] || a[1] - b[1] || a[2] - b[2]);
const outlineVerticalEdges = [];
for (const edge of __privateGet(this, _verticalEdges)) {
if (edge[3]) {
outlineVerticalEdges.push(...__privateMethod(this, _breakEdge, breakEdge_fn).call(this, edge));
__privateMethod(this, _insert, insert_fn).call(this, edge);
} else {
__privateMethod(this, _remove, remove_fn).call(this, edge);
outlineVerticalEdges.push(...__privateMethod(this, _breakEdge, breakEdge_fn).call(this, edge));
}
}
return __privateMethod(this, _getOutlines, getOutlines_fn).call(this, outlineVerticalEdges);
}
};
_box = new WeakMap();
_verticalEdges = new WeakMap();
_intervals = new WeakMap();
_getOutlines = new WeakSet();
getOutlines_fn = function(outlineVerticalEdges) {
const edges = [];
const allEdges = /* @__PURE__ */ new Set();
for (const edge of outlineVerticalEdges) {
const [x, y1, y2] = edge;
edges.push([x, y1, edge], [x, y2, edge]);
}
edges.sort((a, b) => a[1] - b[1] || a[0] - b[0]);
for (let i = 0, ii = edges.length; i < ii; i += 2) {
const edge1 = edges[i][2];
const edge2 = edges[i + 1][2];
edge1.push(edge2);
edge2.push(edge1);
allEdges.add(edge1);
allEdges.add(edge2);
}
const outlines = [];
let outline;
while (allEdges.size > 0) {
const edge = allEdges.values().next().value;
let [x, y1, y2, edge1, edge2] = edge;
allEdges.delete(edge);
let lastPointX = x;
let lastPointY = y1;
outline = [x, y2];
outlines.push(outline);
while (true) {
let e;
if (allEdges.has(edge1)) {
e = edge1;
} else if (allEdges.has(edge2)) {
e = edge2;
} else {
break;
}
allEdges.delete(e);
[x, y1, y2, edge1, edge2] = e;
if (lastPointX !== x) {
outline.push(lastPointX, lastPointY, x, lastPointY === y1 ? y1 : y2);
lastPointX = x;
}
lastPointY = lastPointY === y1 ? y2 : y1;
}
outline.push(lastPointX, lastPointY);
}
return new HighlightOutline(outlines, __privateGet(this, _box));
};
_binarySearch = new WeakSet();
binarySearch_fn = function(y) {
const array = __privateGet(this, _intervals);
let start = 0;
let end = array.length - 1;
while (start <= end) {
const middle = start + end >> 1;
const y1 = array[middle][0];
if (y1 === y) {
return middle;
}
if (y1 < y) {
start = middle + 1;
} else {
end = middle - 1;
}
}
return end + 1;
};
_insert = new WeakSet();
insert_fn = function([, y1, y2]) {
const index = __privateMethod(this, _binarySearch, binarySearch_fn).call(this, y1);
__privateGet(this, _intervals).splice(index, 0, [y1, y2]);
};
_remove = new WeakSet();
remove_fn = function([, y1, y2]) {
const index = __privateMethod(this, _binarySearch, binarySearch_fn).call(this, y1);
for (let i = index; i < __privateGet(this, _intervals).length; i++) {
const [start, end] = __privateGet(this, _intervals)[i];
if (start !== y1) {
break;
}
if (start === y1 && end === y2) {
__privateGet(this, _intervals).splice(i, 1);
return;
}
}
for (let i = index - 1; i >= 0; i--) {
const [start, end] = __privateGet(this, _intervals)[i];
if (start !== y1) {
break;
}
if (start === y1 && end === y2) {
__privateGet(this, _intervals).splice(i, 1);
return;
}
}
};
_breakEdge = new WeakSet();
breakEdge_fn = function(edge) {
const [x, y1, y2] = edge;
const results = [[x, y1, y2]];
const index = __privateMethod(this, _binarySearch, binarySearch_fn).call(this, y2);
for (let i = 0; i < index; i++) {
const [start, end] = __privateGet(this, _intervals)[i];
for (let j = 0, jj = results.length; j < jj; j++) {
const [, y3, y4] = results[j];
if (end <= y3 || y4 <= start) {
continue;
}
if (y3 >= start) {
if (y4 > end) {
results[j][1] = end;
} else {
if (jj === 1) {
return [];
}
results.splice(j, 1);
j--;
jj--;
}
continue;
}
results[j][2] = start;
if (y4 > end) {
results.push([x, end, y4]);
}
}
}
return results;
};
var Outline = class {
toSVGPath() {
throw new Error("Abstract method `toSVGPath` must be implemented.");
}
get box() {
throw new Error("Abstract getter `box` must be implemented.");
}
serialize(_bbox2, _rotation2) {
throw new Error("Abstract method `serialize` must be implemented.");
}
get free() {
return this instanceof FreeHighlightOutline;
}
};
var _box2, _outlines;
var HighlightOutline = class extends Outline {
constructor(outlines, box) {
super();
__privateAdd(this, _box2, void 0);
__privateAdd(this, _outlines, void 0);
__privateSet(this, _outlines, outlines);
__privateSet(this, _box2, box);
}
toSVGPath() {
const buffer = [];
for (const polygon of __privateGet(this, _outlines)) {
let [prevX, prevY] = polygon;
buffer.push(`M${prevX} ${prevY}`);
for (let i = 2; i < polygon.length; i += 2) {
const x = polygon[i];
const y = polygon[i + 1];
if (x === prevX) {
buffer.push(`V${y}`);
prevY = y;
} else if (y === prevY) {
buffer.push(`H${x}`);
prevX = x;
}
}
buffer.push("Z");
}
return buffer.join(" ");
}
serialize([blX, blY, trX, trY], _rotation2) {
const outlines = [];
const width = trX - blX;
const height = trY - blY;
for (const outline of __privateGet(this, _outlines)) {
const points = new Array(outline.length);
for (let i = 0; i < outline.length; i += 2) {
points[i] = blX + outline[i] * width;
points[i + 1] = trY - outline[i + 1] * height;
}
outlines.push(points);
}
return outlines;
}
get box() {
return __privateGet(this, _box2);
}
};
_box2 = new WeakMap();
_outlines = new WeakMap();
var _box3, _bottom, _innerMargin, _isLTR, _top, _last, _lastX, _lastY, _min, _min_dist, _scaleFactor, _thickness, _points, _MIN_DIST, _MIN_DIFF, _MIN, _getLastCoords, getLastCoords_fn;
var _FreeOutliner = class {
constructor({
x,
y
}, box, scaleFactor, thickness, isLTR, innerMargin = 0) {
__privateAdd(this, _getLastCoords);
__privateAdd(this, _box3, void 0);
__privateAdd(this, _bottom, []);
__privateAdd(this, _innerMargin, void 0);
__privateAdd(this, _isLTR, void 0);
__privateAdd(this, _top, []);
__privateAdd(this, _last, new Float64Array(18));
__privateAdd(this, _lastX, void 0);
__privateAdd(this, _lastY, void 0);
__privateAdd(this, _min, void 0);
__privateAdd(this, _min_dist, void 0);
__privateAdd(this, _scaleFactor, void 0);
__privateAdd(this, _thickness, void 0);
__privateAdd(this, _points, []);
__privateSet(this, _box3, box);
__privateSet(this, _thickness, thickness * scaleFactor);
__privateSet(this, _isLTR, isLTR);
__privateGet(this, _last).set([NaN, NaN, NaN, NaN, x, y], 6);
__privateSet(this, _innerMargin, innerMargin);
__privateSet(this, _min_dist, __privateGet(_FreeOutliner, _MIN_DIST) * scaleFactor);
__privateSet(this, _min, __privateGet(_FreeOutliner, _MIN) * scaleFactor);
__privateSet(this, _scaleFactor, scaleFactor);
__privateGet(this, _points).push(x, y);
}
get free() {
return true;
}
isEmpty() {
return isNaN(__privateGet(this, _last)[8]);
}
add({
x,
y
}) {
var _a2;
__privateSet(this, _lastX, x);
__privateSet(this, _lastY, y);
const [layerX, layerY, layerWidth, layerHeight] = __privateGet(this, _box3);
let [x1, y1, x2, y2] = __privateGet(this, _last).subarray(8, 12);
const diffX = x - x2;
const diffY = y - y2;
const d = Math.hypot(diffX, diffY);
if (d < __privateGet(this, _min)) {
return false;
}
const diffD = d - __privateGet(this, _min_dist);
const K = diffD / d;
const shiftX = K * diffX;
const shiftY = K * diffY;
let x0 = x1;
let y0 = y1;
x1 = x2;
y1 = y2;
x2 += shiftX;
y2 += shiftY;
(_a2 = __privateGet(this, _points)) == null ? void 0 : _a2.push(x, y);
const nX = -shiftY / diffD;
const nY = shiftX / diffD;
const thX = nX * __privateGet(this, _thickness);
const thY = nY * __privateGet(this, _thickness);
__privateGet(this, _last).set(__privateGet(this, _last).subarray(2, 8), 0);
__privateGet(this, _last).set([x2 + thX, y2 + thY], 4);
__privateGet(this, _last).set(__privateGet(this, _last).subarray(14, 18), 12);
__privateGet(this, _last).set([x2 - thX, y2 - thY], 16);
if (isNaN(__privateGet(this, _last)[6])) {
if (__privateGet(this, _top).length === 0) {
__privateGet(this, _last).set([x1 + thX, y1 + thY], 2);
__privateGet(this, _top).push(NaN, NaN, NaN, NaN, (x1 + thX - layerX) / layerWidth, (y1 + thY - layerY) / layerHeight);
__privateGet(this, _last).set([x1 - thX, y1 - thY], 14);
__privateGet(this, _bottom).push(NaN, NaN, NaN, NaN, (x1 - thX - layerX) / layerWidth, (y1 - thY - layerY) / layerHeight);
}
__privateGet(this, _last).set([x0, y0, x1, y1, x2, y2], 6);
return !this.isEmpty();
}
__privateGet(this, _last).set([x0, y0, x1, y1, x2, y2], 6);
const angle = Math.abs(Math.atan2(y0 - y1, x0 - x1) - Math.atan2(shiftY, shiftX));
if (angle < Math.PI / 2) {
[x1, y1, x2, y2] = __privateGet(this, _last).subarray(2, 6);
__privateGet(this, _top).push(NaN, NaN, NaN, NaN, ((x1 + x2) / 2 - layerX) / layerWidth, ((y1 + y2) / 2 - layerY) / layerHeight);
[x1, y1, x0, y0] = __privateGet(this, _last).subarray(14, 18);
__privateGet(this, _bottom).push(NaN, NaN, NaN, NaN, ((x0 + x1) / 2 - layerX) / layerWidth, ((y0 + y1) / 2 - layerY) / layerHeight);
return true;
}
[x0, y0, x1, y1, x2, y2] = __privateGet(this, _last).subarray(0, 6);
__privateGet(this, _top).push(((x0 + 5 * x1) / 6 - layerX) / layerWidth, ((y0 + 5 * y1) / 6 - layerY) / layerHeight, ((5 * x1 + x2) / 6 - layerX) / layerWidth, ((5 * y1 + y2) / 6 - layerY) / layerHeight, ((x1 + x2) / 2 - layerX) / layerWidth, ((y1 + y2) / 2 - layerY) / layerHeight);
[x2, y2, x1, y1, x0, y0] = __privateGet(this, _last).subarray(12, 18);
__privateGet(this, _bottom).push(((x0 + 5 * x1) / 6 - layerX) / layerWidth, ((y0 + 5 * y1) / 6 - layerY) / layerHeight, ((5 * x1 + x2) / 6 - layerX) / layerWidth, ((5 * y1 + y2) / 6 - layerY) / layerHeight, ((x1 + x2) / 2 - layerX) / layerWidth, ((y1 + y2) / 2 - layerY) / layerHeight);
return true;
}
toSVGPath() {
if (this.isEmpty()) {
return "";
}
const top = __privateGet(this, _top);
const bottom = __privateGet(this, _bottom);
const lastTop = __privateGet(this, _last).subarray(4, 6);
const lastBottom = __privateGet(this, _last).subarray(16, 18);
const [x, y, width, height] = __privateGet(this, _box3);
const [lastTopX, lastTopY, lastBottomX, lastBottomY] = __privateMethod(this, _getLastCoords, getLastCoords_fn).call(this);
if (isNaN(__privateGet(this, _last)[6]) && !this.isEmpty()) {
return `M${(__privateGet(this, _last)[2] - x) / width} ${(__privateGet(this, _last)[3] - y) / height} L${(__privateGet(this, _last)[4] - x) / width} ${(__privateGet(this, _last)[5] - y) / height} L${lastTopX} ${lastTopY} L${lastBottomX} ${lastBottomY} L${(__privateGet(this, _last)[16] - x) / width} ${(__privateGet(this, _last)[17] - y) / height} L${(__privateGet(this, _last)[14] - x) / width} ${(__privateGet(this, _last)[15] - y) / height} Z`;
}
const buffer = [];
buffer.push(`M${top[4]} ${top[5]}`);
for (let i = 6; i < top.length; i += 6) {
if (isNaN(top[i])) {
buffer.push(`L${top[i + 4]} ${top[i + 5]}`);
} else {
buffer.push(`C${top[i]} ${top[i + 1]} ${top[i + 2]} ${top[i + 3]} ${top[i + 4]} ${top[i + 5]}`);
}
}
buffer.push(`L${(lastTop[0] - x) / width} ${(lastTop[1] - y) / height} L${lastTopX} ${lastTopY} L${lastBottomX} ${lastBottomY} L${(lastBottom[0] - x) / width} ${(lastBottom[1] - y) / height}`);
for (let i = bottom.length - 6; i >= 6; i -= 6) {
if (isNaN(bottom[i])) {
buffer.push(`L${bottom[i + 4]} ${bottom[i + 5]}`);
} else {
buffer.push(`C${bottom[i]} ${bottom[i + 1]} ${bottom[i + 2]} ${bottom[i + 3]} ${bottom[i + 4]} ${bottom[i + 5]}`);
}
}
buffer.push(`L${bottom[4]} ${bottom[5]} Z`);
return buffer.join(" ");
}
getOutlines() {
var _a2, _b;
const top = __privateGet(this, _top);
const bottom = __privateGet(this, _bottom);
const last = __privateGet(this, _last);
const lastTop = last.subarray(4, 6);
const lastBottom = last.subarray(16, 18);
const [layerX, layerY, layerWidth, layerHeight] = __privateGet(this, _box3);
const points = new Float64Array(((_b = (_a2 = __privateGet(this, _points)) == null ? void 0 : _a2.length) != null ? _b : 0) + 2);
for (let i = 0, ii = points.length - 2; i < ii; i += 2) {
points[i] = (__privateGet(this, _points)[i] - layerX) / layerWidth;
points[i + 1] = (__privateGet(this, _points)[i + 1] - layerY) / layerHeight;
}
points[points.length - 2] = (__privateGet(this, _lastX) - layerX) / layerWidth;
points[points.length - 1] = (__privateGet(this, _lastY) - layerY) / layerHeight;
const [lastTopX, lastTopY, lastBottomX, lastBottomY] = __privateMethod(this, _getLastCoords, getLastCoords_fn).call(this);
if (isNaN(last[6]) && !this.isEmpty()) {
const outline2 = new Float64Array(36);
outline2.set([NaN, NaN, NaN, NaN, (last[2] - layerX) / layerWidth, (last[3] - layerY) / layerHeight, NaN, NaN, NaN, NaN, (last[4] - layerX) / layerWidth, (last[5] - layerY) / layerHeight, NaN, NaN, NaN, NaN, lastTopX, lastTopY, NaN, NaN, NaN, NaN, lastBottomX, lastBottomY, NaN, NaN, NaN, NaN, (last[16] - layerX) / layerWidth, (last[17] - layerY) / layerHeight, NaN, NaN, NaN, NaN, (last[14] - layerX) / layerWidth, (last[15] - layerY) / layerHeight], 0);
return new FreeHighlightOutline(outline2, points, __privateGet(this, _box3), __privateGet(this, _scaleFactor), __privateGet(this, _innerMargin), __privateGet(this, _isLTR));
}
const outline = new Float64Array(__privateGet(this, _top).length + 24 + __privateGet(this, _bottom).length);
let N = top.length;
for (let i = 0; i < N; i += 2) {
if (isNaN(top[i])) {
outline[i] = outline[i + 1] = NaN;
continue;
}
outline[i] = top[i];
outline[i + 1] = top[i + 1];
}
outline.set([NaN, NaN, NaN, NaN, (lastTop[0] - layerX) / layerWidth, (lastTop[1] - layerY) / layerHeight, NaN, NaN, NaN, NaN, lastTopX, lastTopY, NaN, NaN, NaN, NaN, lastBottomX, lastBottomY, NaN, NaN, NaN, NaN, (lastBottom[0] - layerX) / layerWidth, (lastBottom[1] - layerY) / layerHeight], N);
N += 24;
for (let i = bottom.length - 6; i >= 6; i -= 6) {
for (let j = 0; j < 6; j += 2) {
if (isNaN(bottom[i + j])) {
outline[N] = outline[N + 1] = NaN;
N += 2;
continue;
}
outline[N] = bottom[i + j];
outline[N + 1] = bottom[i + j + 1];
N += 2;
}
}
outline.set([NaN, NaN, NaN, NaN, bottom[4], bottom[5]], N);
return new FreeHighlightOutline(outline, points, __privateGet(this, _box3), __privateGet(this, _scaleFactor), __privateGet(this, _innerMargin), __privateGet(this, _isLTR));
}
};
var FreeOutliner = _FreeOutliner;
_box3 = new WeakMap();
_bottom = new WeakMap();
_innerMargin = new WeakMap();
_isLTR = new WeakMap();
_top = new WeakMap();
_last = new WeakMap();
_lastX = new WeakMap();
_lastY = new WeakMap();
_min = new WeakMap();
_min_dist = new WeakMap();
_scaleFactor = new WeakMap();
_thickness = new WeakMap();
_points = new WeakMap();
_MIN_DIST = new WeakMap();
_MIN_DIFF = new WeakMap();
_MIN = new WeakMap();
_getLastCoords = new WeakSet();
getLastCoords_fn = function() {
const lastTop = __privateGet(this, _last).subarray(4, 6);
const lastBottom = __privateGet(this, _last).subarray(16, 18);
const [x, y, width, height] = __privateGet(this, _box3);
return [(__privateGet(this, _lastX) + (lastTop[0] - lastBottom[0]) / 2 - x) / width, (__privateGet(this, _lastY) + (lastTop[1] - lastBottom[1]) / 2 - y) / height, (__privateGet(this, _lastX) + (lastBottom[0] - lastTop[0]) / 2 - x) / width, (__privateGet(this, _lastY) + (lastBottom[1] - lastTop[1]) / 2 - y) / height];
};
__privateAdd(FreeOutliner, _MIN_DIST, 8);
__privateAdd(FreeOutliner, _MIN_DIFF, 2);
__privateAdd(FreeOutliner, _MIN, __privateGet(_FreeOutliner, _MIN_DIST) + __privateGet(_FreeOutliner, _MIN_DIFF));
var _box4, _bbox, _innerMargin2, _isLTR2, _points2, _scaleFactor2, _outline, _rescale, rescale_fn, _rescaleAndSwap, rescaleAndSwap_fn, _computeMinMax, computeMinMax_fn;
var FreeHighlightOutline = class extends Outline {
constructor(outline, points, box, scaleFactor, innerMargin, isLTR) {
super();
__privateAdd(this, _rescale);
__privateAdd(this, _rescaleAndSwap);
__privateAdd(this, _computeMinMax);
__privateAdd(this, _box4, void 0);
__privateAdd(this, _bbox, null);
__privateAdd(this, _innerMargin2, void 0);
__privateAdd(this, _isLTR2, void 0);
__privateAdd(this, _points2, void 0);
__privateAdd(this, _scaleFactor2, void 0);
__privateAdd(this, _outline, void 0);
__privateSet(this, _outline, outline);
__privateSet(this, _points2, points);
__privateSet(this, _box4, box);
__privateSet(this, _scaleFactor2, scaleFactor);
__privateSet(this, _innerMargin2, innerMargin);
__privateSet(this, _isLTR2, isLTR);
__privateMethod(this, _computeMinMax, computeMinMax_fn).call(this, isLTR);
const {
x,
y,
width,
height
} = __privateGet(this, _bbox);
for (let i = 0, ii = outline.length; i < ii; i += 2) {
outline[i] = (outline[i] - x) / width;
outline[i + 1] = (outline[i + 1] - y) / height;
}
for (let i = 0, ii = points.length; i < ii; i += 2) {
points[i] = (points[i] - x) / width;
points[i + 1] = (points[i + 1] - y) / height;
}
}
toSVGPath() {
const buffer = [`M${__privateGet(this, _outline)[4]} ${__privateGet(this, _outline)[5]}`];
for (let i = 6, ii = __privateGet(this, _outline).length; i < ii; i += 6) {
if (isNaN(__privateGet(this, _outline)[i])) {
buffer.push(`L${__privateGet(this, _outline)[i + 4]} ${__privateGet(this, _outline)[i + 5]}`);
continue;
}
buffer.push(`C${__privateGet(this, _outline)[i]} ${__privateGet(this, _outline)[i + 1]} ${__privateGet(this, _outline)[i + 2]} ${__privateGet(this, _outline)[i + 3]} ${__privateGet(this, _outline)[i + 4]} ${__privateGet(this, _outline)[i + 5]}`);
}
buffer.push("Z");
return buffer.join(" ");
}
serialize([blX, blY, trX, trY], rotation) {
const width = trX - blX;
const height = trY - blY;
let outline;
let points;
switch (rotation) {
case 0:
outline = __privateMethod(this, _rescale, rescale_fn).call(this, __privateGet(this, _outline), blX, trY, width, -height);
points = __privateMethod(this, _rescale, rescale_fn).call(this, __privateGet(this, _points2), blX, trY, width, -height);
break;
case 90:
outline = __privateMethod(this, _rescaleAndSwap, rescaleAndSwap_fn).call(this, __privateGet(this, _outline), blX, blY, width, height);
points = __privateMethod(this, _rescaleAndSwap, rescaleAndSwap_fn).call(this, __privateGet(this, _points2), blX, blY, width, height);
break;
case 180:
outline = __privateMethod(this, _rescale, rescale_fn).call(this, __privateGet(this, _outline), trX, blY, -width, height);
points = __privateMethod(this, _rescale, rescale_fn).call(this, __privateGet(this, _points2), trX, blY, -width, height);
break;
case 270:
outline = __privateMethod(this, _rescaleAndSwap, rescaleAndSwap_fn).call(this, __privateGet(this, _outline), trX, trY, -width, -height);
points = __privateMethod(this, _rescaleAndSwap, rescaleAndSwap_fn).call(this, __privateGet(this, _points2), trX, trY, -width, -height);
break;
}
return {
outline: Array.from(outline),
points: [Array.from(points)]
};
}
get box() {
return __privateGet(this, _bbox);
}
getNewOutline(thickness, innerMargin) {
const {
x,
y,
width,
height
} = __privateGet(this, _bbox);
const [layerX, layerY, layerWidth, layerHeight] = __privateGet(this, _box4);
const sx = width * layerWidth;
const sy = height * layerHeight;
const tx = x * layerWidth + layerX;
const ty = y * layerHeight + layerY;
const outliner = new FreeOutliner({
x: __privateGet(this, _points2)[0] * sx + tx,
y: __privateGet(this, _points2)[1] * sy + ty
}, __privateGet(this, _box4), __privateGet(this, _scaleFactor2), thickness, __privateGet(this, _isLTR2), innerMargin != null ? innerMargin : __privateGet(this, _innerMargin2));
for (let i = 2; i < __privateGet(this, _points2).length; i += 2) {
outliner.add({
x: __privateGet(this, _points2)[i] * sx + tx,
y: __privateGet(this, _points2)[i + 1] * sy + ty
});
}
return outliner.getOutlines();
}
};
_box4 = new WeakMap();
_bbox = new WeakMap();
_innerMargin2 = new WeakMap();
_isLTR2 = new WeakMap();
_points2 = new WeakMap();
_scaleFactor2 = new WeakMap();
_outline = new WeakMap();
_rescale = new WeakSet();
rescale_fn = function(src, tx, ty, sx, sy) {
const dest = new Float64Array(src.length);
for (let i = 0, ii = src.length; i < ii; i += 2) {
dest[i] = tx + src[i] * sx;
dest[i + 1] = ty + src[i + 1] * sy;
}
return dest;
};
_rescaleAndSwap = new WeakSet();
rescaleAndSwap_fn = function(src, tx, ty, sx, sy) {
const dest = new Float64Array(src.length);
for (let i = 0, ii = src.length; i < ii; i += 2) {
dest[i] = tx + src[i + 1] * sx;
dest[i + 1] = ty + src[i] * sy;
}
return dest;
};
_computeMinMax = new WeakSet();
computeMinMax_fn = function(isLTR) {
const outline = __privateGet(this, _outline);
let lastX = outline[4];
let lastY = outline[5];
let minX = lastX;
let minY = lastY;
let maxX = lastX;
let maxY = lastY;
let lastPointX = lastX;
let lastPointY = lastY;
const ltrCallback = isLTR ? Math.max : Math.min;
for (let i = 6, ii = outline.length; i < ii; i += 6) {
if (isNaN(outline[i])) {
minX = Math.min(minX, outline[i + 4]);
minY = Math.min(minY, outline[i + 5]);
maxX = Math.max(maxX, outline[i + 4]);
maxY = Math.max(maxY, outline[i + 5]);
if (lastPointY < outline[i + 5]) {
lastPointX = outline[i + 4];
lastPointY = outline[i + 5];
} else if (lastPointY === outline[i + 5]) {
lastPointX = ltrCallback(lastPointX, outline[i + 4]);
}
} else {
const bbox = Util.bezierBoundingBox(lastX, lastY, ...outline.slice(i, i + 6));
minX = Math.min(minX, bbox[0]);
minY = Math.min(minY, bbox[1]);
maxX = Math.max(maxX, bbox[2]);
maxY = Math.max(maxY, bbox[3]);
if (lastPointY < bbox[3]) {
lastPointX = bbox[2];
lastPointY = bbox[3];
} else if (lastPointY === bbox[3]) {
lastPointX = ltrCallback(lastPointX, bbox[2]);
}
}
lastX = outline[i + 4];
lastY = outline[i + 5];
}
const x = minX - __privateGet(this, _innerMargin2), y = minY - __privateGet(this, _innerMargin2), width = maxX - minX + 2 * __privateGet(this, _innerMargin2), height = maxY - minY + 2 * __privateGet(this, _innerMargin2);
__privateSet(this, _bbox, {
x,
y,
width,
height,
lastPoint: [lastPointX, lastPointY]
});
};
var _boundKeyDown2, _boundPointerDown, _button, _buttonSwatch, _defaultColor, _dropdown, _dropdownWasFromKeyboard, _isMainColorPicker, _editor3, _eventBus, _uiManager2, _type, _getDropdownRoot, getDropdownRoot_fn, _colorSelect, colorSelect_fn, _keyDown2, keyDown_fn2, _openDropdown, openDropdown_fn, _pointerDown2, pointerDown_fn2, _isDropdownVisible, isDropdownVisible_get;
var _ColorPicker = class {
constructor({
editor = null,
uiManager = null
}) {
__privateAdd(this, _getDropdownRoot);
__privateAdd(this, _colorSelect);
__privateAdd(this, _keyDown2);
__privateAdd(this, _openDropdown);
__privateAdd(this, _pointerDown2);
__privateAdd(this, _isDropdownVisible);
__privateAdd(this, _boundKeyDown2, __privateMethod(this, _keyDown2, keyDown_fn2).bind(this));
__privateAdd(this, _boundPointerDown, __privateMethod(this, _pointerDown2, pointerDown_fn2).bind(this));
__privateAdd(this, _button, null);
__privateAdd(this, _buttonSwatch, null);
__privateAdd(this, _defaultColor, void 0);
__privateAdd(this, _dropdown, null);
__privateAdd(this, _dropdownWasFromKeyboard, false);
__privateAdd(this, _isMainColorPicker, false);
__privateAdd(this, _editor3, null);
__privateAdd(this, _eventBus, void 0);
__privateAdd(this, _uiManager2, null);
__privateAdd(this, _type, void 0);
var _a2;
if (editor) {
__privateSet(this, _isMainColorPicker, false);
__privateSet(this, _type, AnnotationEditorParamsType.HIGHLIGHT_COLOR);
__privateSet(this, _editor3, editor);
} else {
__privateSet(this, _isMainColorPicker, true);
__privateSet(this, _type, AnnotationEditorParamsType.HIGHLIGHT_DEFAULT_COLOR);
}
__privateSet(this, _uiManager2, (editor == null ? void 0 : editor._uiManager) || uiManager);
__privateSet(this, _eventBus, __privateGet(this, _uiManager2)._eventBus);
__privateSet(this, _defaultColor, (editor == null ? void 0 : editor.color) || ((_a2 = __privateGet(this, _uiManager2)) == null ? void 0 : _a2.highlightColors.values().next().value) || "#FFFF98");
}
static get _keyboardManager() {
return shadow(this, "_keyboardManager", new KeyboardManager([[["Escape", "mac+Escape"], _ColorPicker.prototype._hideDropdownFromKeyboard], [[" ", "mac+ "], _ColorPicker.prototype._colorSelectFromKeyboard], [["ArrowDown", "ArrowRight", "mac+ArrowDown", "mac+ArrowRight"], _ColorPicker.prototype._moveToNext], [["ArrowUp", "ArrowLeft", "mac+ArrowUp", "mac+ArrowLeft"], _ColorPicker.prototype._moveToPrevious], [["Home", "mac+Home"], _ColorPicker.prototype._moveToBeginning], [["End", "mac+End"], _ColorPicker.prototype._moveToEnd]]));
}
renderButton() {
const button = __privateSet(this, _button, document.createElement("button"));
button.className = "colorPicker";
button.tabIndex = "0";
button.setAttribute("data-l10n-id", "pdfjs-editor-colorpicker-button");
button.setAttribute("aria-haspopup", true);
const signal = __privateGet(this, _uiManager2)._signal;
button.addEventListener("click", __privateMethod(this, _openDropdown, openDropdown_fn).bind(this), {
signal
});
button.addEventListener("keydown", __privateGet(this, _boundKeyDown2), {
signal
});
const swatch = __privateSet(this, _buttonSwatch, document.createElement("span"));
swatch.className = "swatch";
swatch.setAttribute("aria-hidden", true);
swatch.style.backgroundColor = __privateGet(this, _defaultColor);
button.append(swatch);
return button;
}
renderMainDropdown() {
const dropdown = __privateSet(this, _dropdown, __privateMethod(this, _getDropdownRoot, getDropdownRoot_fn).call(this));
dropdown.setAttribute("aria-orientation", "horizontal");
dropdown.setAttribute("aria-labelledby", "highlightColorPickerLabel");
return dropdown;
}
_colorSelectFromKeyboard(event) {
if (event.target === __privateGet(this, _button)) {
__privateMethod(this, _openDropdown, openDropdown_fn).call(this, event);
return;
}
const color2 = event.target.getAttribute("data-color");
if (!color2) {
return;
}
__privateMethod(this, _colorSelect, colorSelect_fn).call(this, color2, event);
}
_moveToNext(event) {
var _a2, _b;
if (!__privateGet(this, _isDropdownVisible, isDropdownVisible_get)) {
__privateMethod(this, _openDropdown, openDropdown_fn).call(this, event);
return;
}
if (event.target === __privateGet(this, _button)) {
(_a2 = __privateGet(this, _dropdown).firstChild) == null ? void 0 : _a2.focus();
return;
}
(_b = event.target.nextSibling) == null ? void 0 : _b.focus();
}
_moveToPrevious(event) {
var _a2, _b;
if (event.target === ((_a2 = __privateGet(this, _dropdown)) == null ? void 0 : _a2.firstChild) || event.target === __privateGet(this, _button)) {
if (__privateGet(this, _isDropdownVisible, isDropdownVisible_get)) {
this._hideDropdownFromKeyboard();
}
return;
}
if (!__privateGet(this, _isDropdownVisible, isDropdownVisible_get)) {
__privateMethod(this, _openDropdown, openDropdown_fn).call(this, event);
}
(_b = event.target.previousSibling) == null ? void 0 : _b.focus();
}
_moveToBeginning(event) {
var _a2;
if (!__privateGet(this, _isDropdownVisible, isDropdownVisible_get)) {
__privateMethod(this, _openDropdown, openDropdown_fn).call(this, event);
return;
}
(_a2 = __privateGet(this, _dropdown).firstChild) == null ? void 0 : _a2.focus();
}
_moveToEnd(event) {
var _a2;
if (!__privateGet(this, _isDropdownVisible, isDropdownVisible_get)) {
__privateMethod(this, _openDropdown, openDropdown_fn).call(this, event);
return;
}
(_a2 = __privateGet(this, _dropdown).lastChild) == null ? void 0 : _a2.focus();
}
hideDropdown() {
var _a2;
(_a2 = __privateGet(this, _dropdown)) == null ? void 0 : _a2.classList.add("hidden");
window.removeEventListener("pointerdown", __privateGet(this, _boundPointerDown));
}
_hideDropdownFromKeyboard() {
var _a2;
if (__privateGet(this, _isMainColorPicker)) {
return;
}
if (!__privateGet(this, _isDropdownVisible, isDropdownVisible_get)) {
(_a2 = __privateGet(this, _editor3)) == null ? void 0 : _a2.unselect();
return;
}
this.hideDropdown();
__privateGet(this, _button).focus({
preventScroll: true,
focusVisible: __privateGet(this, _dropdownWasFromKeyboard)
});
}
updateColor(color2) {
if (__privateGet(this, _buttonSwatch)) {
__privateGet(this, _buttonSwatch).style.backgroundColor = color2;
}
if (!__privateGet(this, _dropdown)) {
return;
}
const i = __privateGet(this, _uiManager2).highlightColors.values();
for (const child of __privateGet(this, _dropdown).children) {
child.setAttribute("aria-selected", i.next().value === color2);
}
}
destroy() {
var _a2, _b;
(_a2 = __privateGet(this, _button)) == null ? void 0 : _a2.remove();
__privateSet(this, _button, null);
__privateSet(this, _buttonSwatch, null);
(_b = __privateGet(this, _dropdown)) == null ? void 0 : _b.remove();
__privateSet(this, _dropdown, null);
}
};
var ColorPicker = _ColorPicker;
_boundKeyDown2 = new WeakMap();
_boundPointerDown = new WeakMap();
_button = new WeakMap();
_buttonSwatch = new WeakMap();
_defaultColor = new WeakMap();
_dropdown = new WeakMap();
_dropdownWasFromKeyboard = new WeakMap();
_isMainColorPicker = new WeakMap();
_editor3 = new WeakMap();
_eventBus = new WeakMap();
_uiManager2 = new WeakMap();
_type = new WeakMap();
_getDropdownRoot = new WeakSet();
getDropdownRoot_fn = function() {
const div = document.createElement("div");
const signal = __privateGet(this, _uiManager2)._signal;
div.addEventListener("contextmenu", noContextMenu, {
signal
});
div.className = "dropdown";
div.role = "listbox";
div.setAttribute("aria-multiselectable", false);
div.setAttribute("aria-orientation", "vertical");
div.setAttribute("data-l10n-id", "pdfjs-editor-colorpicker-dropdown");
for (const [name, color2] of __privateGet(this, _uiManager2).highlightColors) {
const button = document.createElement("button");
button.tabIndex = "0";
button.role = "option";
button.setAttribute("data-color", color2);
button.title = name;
button.setAttribute("data-l10n-id", `pdfjs-editor-colorpicker-${name}`);
const swatch = document.createElement("span");
button.append(swatch);
swatch.className = "swatch";
swatch.style.backgroundColor = color2;
button.setAttribute("aria-selected", color2 === __privateGet(this, _defaultColor));
button.addEventListener("click", __privateMethod(this, _colorSelect, colorSelect_fn).bind(this, color2), {
signal
});
div.append(button);
}
div.addEventListener("keydown", __privateGet(this, _boundKeyDown2), {
signal
});
return div;
};
_colorSelect = new WeakSet();
colorSelect_fn = function(color2, event) {
event.stopPropagation();
__privateGet(this, _eventBus).dispatch("switchannotationeditorparams", {
source: this,
type: __privateGet(this, _type),
value: color2
});
};
_keyDown2 = new WeakSet();
keyDown_fn2 = function(event) {
_ColorPicker._keyboardManager.exec(this, event);
};
_openDropdown = new WeakSet();
openDropdown_fn = function(event) {
if (__privateGet(this, _isDropdownVisible, isDropdownVisible_get)) {
this.hideDropdown();
return;
}
__privateSet(this, _dropdownWasFromKeyboard, event.detail === 0);
window.addEventListener("pointerdown", __privateGet(this, _boundPointerDown), {
signal: __privateGet(this, _uiManager2)._signal
});
if (__privateGet(this, _dropdown)) {
__privateGet(this, _dropdown).classList.remove("hidden");
return;
}
const root = __privateSet(this, _dropdown, __privateMethod(this, _getDropdownRoot, getDropdownRoot_fn).call(this));
__privateGet(this, _button).append(root);
};
_pointerDown2 = new WeakSet();
pointerDown_fn2 = function(event) {
var _a2;
if ((_a2 = __privateGet(this, _dropdown)) == null ? void 0 : _a2.contains(event.target)) {
return;
}
this.hideDropdown();
};
_isDropdownVisible = new WeakSet();
isDropdownVisible_get = function() {
return __privateGet(this, _dropdown) && !__privateGet(this, _dropdown).classList.contains("hidden");
};
var _anchorNode, _anchorOffset, _boxes, _clipPathId, _colorPicker2, _focusOutlines, _focusNode, _focusOffset, _highlightDiv, _highlightOutlines, _id4, _isFreeHighlight, _lastPoint, _opacity, _outlineId, _text, _thickness2, _methodOfCreation, _createOutlines, createOutlines_fn, _createFreeOutlines, createFreeOutlines_fn, _updateColor2, updateColor_fn2, _updateThickness, updateThickness_fn, _changeThickness, changeThickness_fn, _cleanDrawLayer, cleanDrawLayer_fn, _addToDrawLayer, addToDrawLayer_fn, _rotateBbox, rotateBbox_fn, _keydown, keydown_fn, _setCaret, setCaret_fn, _getRotation, getRotation_fn, _serializeBoxes, serializeBoxes_fn, _serializeOutlines, serializeOutlines_fn, _highlightMove, highlightMove_fn, _endHighlight, endHighlight_fn;
var _HighlightEditor = class extends AnnotationEditor {
constructor(params) {
super({
...params,
name: "highlightEditor"
});
__privateAdd(this, _createOutlines);
__privateAdd(this, _createFreeOutlines);
__privateAdd(this, _updateColor2);
__privateAdd(this, _updateThickness);
__privateAdd(this, _changeThickness);
__privateAdd(this, _cleanDrawLayer);
__privateAdd(this, _addToDrawLayer);
__privateAdd(this, _keydown);
__privateAdd(this, _setCaret);
__privateAdd(this, _getRotation);
__privateAdd(this, _serializeBoxes);
__privateAdd(this, _serializeOutlines);
__privateAdd(this, _anchorNode, null);
__privateAdd(this, _anchorOffset, 0);
__privateAdd(this, _boxes, void 0);
__privateAdd(this, _clipPathId, null);
__privateAdd(this, _colorPicker2, null);
__privateAdd(this, _focusOutlines, null);
__privateAdd(this, _focusNode, null);
__privateAdd(this, _focusOffset, 0);
__privateAdd(this, _highlightDiv, null);
__privateAdd(this, _highlightOutlines, null);
__privateAdd(this, _id4, null);
__privateAdd(this, _isFreeHighlight, false);
__privateAdd(this, _lastPoint, null);
__privateAdd(this, _opacity, void 0);
__privateAdd(this, _outlineId, null);
__privateAdd(this, _text, "");
__privateAdd(this, _thickness2, void 0);
__privateAdd(this, _methodOfCreation, "");
this.color = params.color || _HighlightEditor._defaultColor;
__privateSet(this, _thickness2, params.thickness || _HighlightEditor._defaultThickness);
__privateSet(this, _opacity, params.opacity || _HighlightEditor._defaultOpacity);
__privateSet(this, _boxes, params.boxes || null);
__privateSet(this, _methodOfCreation, params.methodOfCreation || "");
__privateSet(this, _text, params.text || "");
this._isDraggable = false;
if (params.highlightId > -1) {
__privateSet(this, _isFreeHighlight, true);
__privateMethod(this, _createFreeOutlines, createFreeOutlines_fn).call(this, params);
__privateMethod(this, _addToDrawLayer, addToDrawLayer_fn).call(this);
} else {
__privateSet(this, _anchorNode, params.anchorNode);
__privateSet(this, _anchorOffset, params.anchorOffset);
__privateSet(this, _focusNode, params.focusNode);
__privateSet(this, _focusOffset, params.focusOffset);
__privateMethod(this, _createOutlines, createOutlines_fn).call(this);
__privateMethod(this, _addToDrawLayer, addToDrawLayer_fn).call(this);
this.rotate(this.rotation);
}
}
static get _keyboardManager() {
const proto = _HighlightEditor.prototype;
return shadow(this, "_keyboardManager", new KeyboardManager([[["ArrowLeft", "mac+ArrowLeft"], proto._moveCaret, {
args: [0]
}], [["ArrowRight", "mac+ArrowRight"], proto._moveCaret, {
args: [1]
}], [["ArrowUp", "mac+ArrowUp"], proto._moveCaret, {
args: [2]
}], [["ArrowDown", "mac+ArrowDown"], proto._moveCaret, {
args: [3]
}]]));
}
get telemetryInitialData() {
return {
action: "added",
type: __privateGet(this, _isFreeHighlight) ? "free_highlight" : "highlight",
color: this._uiManager.highlightColorNames.get(this.color),
thickness: __privateGet(this, _thickness2),
methodOfCreation: __privateGet(this, _methodOfCreation)
};
}
get telemetryFinalData() {
return {
type: "highlight",
color: this._uiManager.highlightColorNames.get(this.color)
};
}
static computeTelemetryFinalData(data) {
return {
numberOfColors: data.get("color").size
};
}
static initialize(l10n, uiManager) {
var _a2;
AnnotationEditor.initialize(l10n, uiManager);
_HighlightEditor._defaultColor || (_HighlightEditor._defaultColor = ((_a2 = uiManager.highlightColors) == null ? void 0 : _a2.values().next().value) || "#fff066");
}
static updateDefaultParams(type, value) {
switch (type) {
case AnnotationEditorParamsType.HIGHLIGHT_DEFAULT_COLOR:
_HighlightEditor._defaultColor = value;
break;
case AnnotationEditorParamsType.HIGHLIGHT_THICKNESS:
_HighlightEditor._defaultThickness = value;
break;
}
}
translateInPage(x, y) {
}
get toolbarPosition() {
return __privateGet(this, _lastPoint);
}
updateParams(type, value) {
switch (type) {
case AnnotationEditorParamsType.HIGHLIGHT_COLOR:
__privateMethod(this, _updateColor2, updateColor_fn2).call(this, value);
break;
case AnnotationEditorParamsType.HIGHLIGHT_THICKNESS:
__privateMethod(this, _updateThickness, updateThickness_fn).call(this, value);
break;
}
}
static get defaultPropertiesToUpdate() {
return [[AnnotationEditorParamsType.HIGHLIGHT_DEFAULT_COLOR, _HighlightEditor._defaultColor], [AnnotationEditorParamsType.HIGHLIGHT_THICKNESS, _HighlightEditor._defaultThickness]];
}
get propertiesToUpdate() {
return [[AnnotationEditorParamsType.HIGHLIGHT_COLOR, this.color || _HighlightEditor._defaultColor], [AnnotationEditorParamsType.HIGHLIGHT_THICKNESS, __privateGet(this, _thickness2) || _HighlightEditor._defaultThickness], [AnnotationEditorParamsType.HIGHLIGHT_FREE, __privateGet(this, _isFreeHighlight)]];
}
async addEditToolbar() {
const toolbar = await super.addEditToolbar();
if (!toolbar) {
return null;
}
if (this._uiManager.highlightColors) {
__privateSet(this, _colorPicker2, new ColorPicker({
editor: this
}));
toolbar.addColorPicker(__privateGet(this, _colorPicker2));
}
return toolbar;
}
disableEditing() {
super.disableEditing();
this.div.classList.toggle("disabled", true);
}
enableEditing() {
super.enableEditing();
this.div.classList.toggle("disabled", false);
}
fixAndSetPosition() {
return super.fixAndSetPosition(__privateMethod(this, _getRotation, getRotation_fn).call(this));
}
getBaseTranslation() {
return [0, 0];
}
getRect(tx, ty) {
return super.getRect(tx, ty, __privateMethod(this, _getRotation, getRotation_fn).call(this));
}
onceAdded() {
this.parent.addUndoableEditor(this);
this.div.focus();
}
remove() {
__privateMethod(this, _cleanDrawLayer, cleanDrawLayer_fn).call(this);
this._reportTelemetry({
action: "deleted"
});
super.remove();
}
rebuild() {
if (!this.parent) {
return;
}
super.rebuild();
if (this.div === null) {
return;
}
__privateMethod(this, _addToDrawLayer, addToDrawLayer_fn).call(this);
if (!this.isAttachedToDOM) {
this.parent.add(this);
}
}
setParent(parent) {
var _a2;
let mustBeSelected = false;
if (this.parent && !parent) {
__privateMethod(this, _cleanDrawLayer, cleanDrawLayer_fn).call(this);
} else if (parent) {
__privateMethod(this, _addToDrawLayer, addToDrawLayer_fn).call(this, parent);
mustBeSelected = !this.parent && ((_a2 = this.div) == null ? void 0 : _a2.classList.contains("selectedEditor"));
}
super.setParent(parent);
this.show(this._isVisible);
if (mustBeSelected) {
this.select();
}
}
rotate(angle) {
var _a2, _b, _c;
const {
drawLayer
} = this.parent;
let box;
if (__privateGet(this, _isFreeHighlight)) {
angle = (angle - this.rotation + 360) % 360;
box = __privateMethod(_a2 = _HighlightEditor, _rotateBbox, rotateBbox_fn).call(_a2, __privateGet(this, _highlightOutlines).box, angle);
} else {
box = __privateMethod(_b = _HighlightEditor, _rotateBbox, rotateBbox_fn).call(_b, this, angle);
}
drawLayer.rotate(__privateGet(this, _id4), angle);
drawLayer.rotate(__privateGet(this, _outlineId), angle);
drawLayer.updateBox(__privateGet(this, _id4), box);
drawLayer.updateBox(__privateGet(this, _outlineId), __privateMethod(_c = _HighlightEditor, _rotateBbox, rotateBbox_fn).call(_c, __privateGet(this, _focusOutlines).box, angle));
}
render() {
if (this.div) {
return this.div;
}
const div = super.render();
if (__privateGet(this, _text)) {
div.setAttribute("aria-label", __privateGet(this, _text));
div.setAttribute("role", "mark");
}
if (__privateGet(this, _isFreeHighlight)) {
div.classList.add("free");
} else {
this.div.addEventListener("keydown", __privateMethod(this, _keydown, keydown_fn).bind(this), {
signal: this._uiManager._signal
});
}
const highlightDiv = __privateSet(this, _highlightDiv, document.createElement("div"));
div.append(highlightDiv);
highlightDiv.setAttribute("aria-hidden", "true");
highlightDiv.className = "internal";
highlightDiv.style.clipPath = __privateGet(this, _clipPathId);
const [parentWidth, parentHeight] = this.parentDimensions;
this.setDims(this.width * parentWidth, this.height * parentHeight);
bindEvents(this, __privateGet(this, _highlightDiv), ["pointerover", "pointerleave"]);
this.enableEditing();
return div;
}
pointerover() {
this.parent.drawLayer.addClass(__privateGet(this, _outlineId), "hovered");
}
pointerleave() {
this.parent.drawLayer.removeClass(__privateGet(this, _outlineId), "hovered");
}
_moveCaret(direction) {
this.parent.unselect(this);
switch (direction) {
case 0:
case 2:
__privateMethod(this, _setCaret, setCaret_fn).call(this, true);
break;
case 1:
case 3:
__privateMethod(this, _setCaret, setCaret_fn).call(this, false);
break;
}
}
select() {
var _a2, _b;
super.select();
if (!__privateGet(this, _outlineId)) {
return;
}
(_a2 = this.parent) == null ? void 0 : _a2.drawLayer.removeClass(__privateGet(this, _outlineId), "hovered");
(_b = this.parent) == null ? void 0 : _b.drawLayer.addClass(__privateGet(this, _outlineId), "selected");
}
unselect() {
var _a2;
super.unselect();
if (!__privateGet(this, _outlineId)) {
return;
}
(_a2 = this.parent) == null ? void 0 : _a2.drawLayer.removeClass(__privateGet(this, _outlineId), "selected");
if (!__privateGet(this, _isFreeHighlight)) {
__privateMethod(this, _setCaret, setCaret_fn).call(this, false);
}
}
get _mustFixPosition() {
return !__privateGet(this, _isFreeHighlight);
}
show(visible = this._isVisible) {
super.show(visible);
if (this.parent) {
this.parent.drawLayer.show(__privateGet(this, _id4), visible);
this.parent.drawLayer.show(__privateGet(this, _outlineId), visible);
}
}
static startHighlighting(parent, isLTR, {
target: textLayer,
x,
y
}) {
const {
x: layerX,
y: layerY,
width: parentWidth,
height: parentHeight
} = textLayer.getBoundingClientRect();
const ac = new AbortController();
const signal = parent.combinedSignal(ac);
const pointerDown = (e) => {
e.preventDefault();
e.stopPropagation();
};
const pointerUpCallback = (e) => {
ac.abort();
__privateMethod(this, _endHighlight, endHighlight_fn).call(this, parent, e);
};
window.addEventListener("blur", pointerUpCallback, {
signal
});
window.addEventListener("pointerup", pointerUpCallback, {
signal
});
window.addEventListener("pointerdown", pointerDown, {
capture: true,
passive: false,
signal
});
window.addEventListener("contextmenu", noContextMenu, {
signal
});
textLayer.addEventListener("pointermove", __privateMethod(this, _highlightMove, highlightMove_fn).bind(this, parent), {
signal
});
this._freeHighlight = new FreeOutliner({
x,
y
}, [layerX, layerY, parentWidth, parentHeight], parent.scale, this._defaultThickness / 2, isLTR, 1e-3);
({
id: this._freeHighlightId,
clipPathId: this._freeHighlightClipId
} = parent.drawLayer.highlight(this._freeHighlight, this._defaultColor, this._defaultOpacity, true));
}
static deserialize(data, parent, uiManager) {
var _a2;
const editor = super.deserialize(data, parent, uiManager);
const {
rect: [blX, blY, trX, trY],
color: color2,
quadPoints
} = data;
editor.color = Util.makeHexColor(...color2);
__privateSet(editor, _opacity, data.opacity);
const [pageWidth, pageHeight] = editor.pageDimensions;
editor.width = (trX - blX) / pageWidth;
editor.height = (trY - blY) / pageHeight;
const boxes = __privateSet(editor, _boxes, []);
for (let i = 0; i < quadPoints.length; i += 8) {
boxes.push({
x: (quadPoints[4] - trX) / pageWidth,
y: (trY - (1 - quadPoints[i + 5])) / pageHeight,
width: (quadPoints[i + 2] - quadPoints[i]) / pageWidth,
height: (quadPoints[i + 5] - quadPoints[i + 1]) / pageHeight
});
}
__privateMethod(_a2 = editor, _createOutlines, createOutlines_fn).call(_a2);
return editor;
}
serialize(isForCopying = false) {
if (this.isEmpty() || isForCopying) {
return null;
}
const rect = this.getRect(0, 0);
const color2 = AnnotationEditor._colorManager.convert(this.color);
return {
annotationType: AnnotationEditorType.HIGHLIGHT,
color: color2,
opacity: __privateGet(this, _opacity),
thickness: __privateGet(this, _thickness2),
quadPoints: __privateMethod(this, _serializeBoxes, serializeBoxes_fn).call(this),
outlines: __privateMethod(this, _serializeOutlines, serializeOutlines_fn).call(this, rect),
pageIndex: this.pageIndex,
rect,
rotation: __privateMethod(this, _getRotation, getRotation_fn).call(this),
structTreeParentId: this._structTreeParentId
};
}
static canCreateNewEmptyEditor() {
return false;
}
};
var HighlightEditor = _HighlightEditor;
_anchorNode = new WeakMap();
_anchorOffset = new WeakMap();
_boxes = new WeakMap();
_clipPathId = new WeakMap();
_colorPicker2 = new WeakMap();
_focusOutlines = new WeakMap();
_focusNode = new WeakMap();
_focusOffset = new WeakMap();
_highlightDiv = new WeakMap();
_highlightOutlines = new WeakMap();
_id4 = new WeakMap();
_isFreeHighlight = new WeakMap();
_lastPoint = new WeakMap();
_opacity = new WeakMap();
_outlineId = new WeakMap();
_text = new WeakMap();
_thickness2 = new WeakMap();
_methodOfCreation = new WeakMap();
_createOutlines = new WeakSet();
createOutlines_fn = function() {
const outliner = new Outliner(__privateGet(this, _boxes), 1e-3);
__privateSet(this, _highlightOutlines, outliner.getOutlines());
({
x: this.x,
y: this.y,
width: this.width,
height: this.height
} = __privateGet(this, _highlightOutlines).box);
const outlinerForOutline = new Outliner(__privateGet(this, _boxes), 25e-4, 1e-3, this._uiManager.direction === "ltr");
__privateSet(this, _focusOutlines, outlinerForOutline.getOutlines());
const {
lastPoint
} = __privateGet(this, _focusOutlines).box;
__privateSet(this, _lastPoint, [(lastPoint[0] - this.x) / this.width, (lastPoint[1] - this.y) / this.height]);
};
_createFreeOutlines = new WeakSet();
createFreeOutlines_fn = function({
highlightOutlines,
highlightId,
clipPathId
}) {
var _a2, _b;
__privateSet(this, _highlightOutlines, highlightOutlines);
const extraThickness = 1.5;
__privateSet(this, _focusOutlines, highlightOutlines.getNewOutline(__privateGet(this, _thickness2) / 2 + extraThickness, 25e-4));
if (highlightId >= 0) {
__privateSet(this, _id4, highlightId);
__privateSet(this, _clipPathId, clipPathId);
this.parent.drawLayer.finalizeLine(highlightId, highlightOutlines);
__privateSet(this, _outlineId, this.parent.drawLayer.highlightOutline(__privateGet(this, _focusOutlines)));
} else if (this.parent) {
const angle = this.parent.viewport.rotation;
this.parent.drawLayer.updateLine(__privateGet(this, _id4), highlightOutlines);
this.parent.drawLayer.updateBox(__privateGet(this, _id4), __privateMethod(_a2 = _HighlightEditor, _rotateBbox, rotateBbox_fn).call(_a2, __privateGet(this, _highlightOutlines).box, (angle - this.rotation + 360) % 360));
this.parent.drawLayer.updateLine(__privateGet(this, _outlineId), __privateGet(this, _focusOutlines));
this.parent.drawLayer.updateBox(__privateGet(this, _outlineId), __privateMethod(_b = _HighlightEditor, _rotateBbox, rotateBbox_fn).call(_b, __privateGet(this, _focusOutlines).box, angle));
}
const {
x,
y,
width,
height
} = highlightOutlines.box;
switch (this.rotation) {
case 0:
this.x = x;
this.y = y;
this.width = width;
this.height = height;
break;
case 90: {
const [pageWidth, pageHeight] = this.parentDimensions;
this.x = y;
this.y = 1 - x;
this.width = width * pageHeight / pageWidth;
this.height = height * pageWidth / pageHeight;
break;
}
case 180:
this.x = 1 - x;
this.y = 1 - y;
this.width = width;
this.height = height;
break;
case 270: {
const [pageWidth, pageHeight] = this.parentDimensions;
this.x = 1 - y;
this.y = x;
this.width = width * pageHeight / pageWidth;
this.height = height * pageWidth / pageHeight;
break;
}
}
const {
lastPoint
} = __privateGet(this, _focusOutlines).box;
__privateSet(this, _lastPoint, [(lastPoint[0] - x) / width, (lastPoint[1] - y) / height]);
};
_updateColor2 = new WeakSet();
updateColor_fn2 = function(color2) {
const setColor = (col) => {
var _a2, _b;
this.color = col;
(_a2 = this.parent) == null ? void 0 : _a2.drawLayer.changeColor(__privateGet(this, _id4), col);
(_b = __privateGet(this, _colorPicker2)) == null ? void 0 : _b.updateColor(col);
};
const savedColor = this.color;
this.addCommands({
cmd: setColor.bind(this, color2),
undo: setColor.bind(this, savedColor),
post: this._uiManager.updateUI.bind(this._uiManager, this),
mustExec: true,
type: AnnotationEditorParamsType.HIGHLIGHT_COLOR,
overwriteIfSameType: true,
keepUndo: true
});
this._reportTelemetry({
action: "color_changed",
color: this._uiManager.highlightColorNames.get(color2)
}, true);
};
_updateThickness = new WeakSet();
updateThickness_fn = function(thickness) {
const savedThickness = __privateGet(this, _thickness2);
const setThickness = (th) => {
__privateSet(this, _thickness2, th);
__privateMethod(this, _changeThickness, changeThickness_fn).call(this, th);
};
this.addCommands({
cmd: setThickness.bind(this, thickness),
undo: setThickness.bind(this, savedThickness),
post: this._uiManager.updateUI.bind(this._uiManager, this),
mustExec: true,
type: AnnotationEditorParamsType.INK_THICKNESS,
overwriteIfSameType: true,
keepUndo: true
});
this._reportTelemetry({
action: "thickness_changed",
thickness
}, true);
};
_changeThickness = new WeakSet();
changeThickness_fn = function(thickness) {
if (!__privateGet(this, _isFreeHighlight)) {
return;
}
__privateMethod(this, _createFreeOutlines, createFreeOutlines_fn).call(this, {
highlightOutlines: __privateGet(this, _highlightOutlines).getNewOutline(thickness / 2)
});
this.fixAndSetPosition();
const [parentWidth, parentHeight] = this.parentDimensions;
this.setDims(this.width * parentWidth, this.height * parentHeight);
};
_cleanDrawLayer = new WeakSet();
cleanDrawLayer_fn = function() {
if (__privateGet(this, _id4) === null || !this.parent) {
return;
}
this.parent.drawLayer.remove(__privateGet(this, _id4));
__privateSet(this, _id4, null);
this.parent.drawLayer.remove(__privateGet(this, _outlineId));
__privateSet(this, _outlineId, null);
};
_addToDrawLayer = new WeakSet();
addToDrawLayer_fn = function(parent = this.parent) {
if (__privateGet(this, _id4) !== null) {
return;
}
({
id: __privateWrapper(this, _id4)._,
clipPathId: __privateWrapper(this, _clipPathId)._
} = parent.drawLayer.highlight(__privateGet(this, _highlightOutlines), this.color, __privateGet(this, _opacity)));
__privateSet(this, _outlineId, parent.drawLayer.highlightOutline(__privateGet(this, _focusOutlines)));
if (__privateGet(this, _highlightDiv)) {
__privateGet(this, _highlightDiv).style.clipPath = __privateGet(this, _clipPathId);
}
};
_rotateBbox = new WeakSet();
rotateBbox_fn = function({
x,
y,
width,
height
}, angle) {
switch (angle) {
case 90:
return {
x: 1 - y - height,
y: x,
width: height,
height: width
};
case 180:
return {
x: 1 - x - width,
y: 1 - y - height,
width,
height
};
case 270:
return {
x: y,
y: 1 - x - width,
width: height,
height: width
};
}
return {
x,
y,
width,
height
};
};
_keydown = new WeakSet();
keydown_fn = function(event) {
_HighlightEditor._keyboardManager.exec(this, event);
};
_setCaret = new WeakSet();
setCaret_fn = function(start) {
if (!__privateGet(this, _anchorNode)) {
return;
}
const selection = window.getSelection();
if (start) {
selection.setPosition(__privateGet(this, _anchorNode), __privateGet(this, _anchorOffset));
} else {
selection.setPosition(__privateGet(this, _focusNode), __privateGet(this, _focusOffset));
}
};
_getRotation = new WeakSet();
getRotation_fn = function() {
return __privateGet(this, _isFreeHighlight) ? this.rotation : 0;
};
_serializeBoxes = new WeakSet();
serializeBoxes_fn = function() {
if (__privateGet(this, _isFreeHighlight)) {
return null;
}
const [pageWidth, pageHeight] = this.pageDimensions;
const [pageX, pageY] = this.pageTranslation;
const boxes = __privateGet(this, _boxes);
const quadPoints = new Float32Array(boxes.length * 8);
let i = 0;
for (const {
x,
y,
width,
height
} of boxes) {
const sx = x * pageWidth + pageX;
const sy = (1 - y - height) * pageHeight + pageY;
quadPoints[i] = quadPoints[i + 4] = sx;
quadPoints[i + 1] = quadPoints[i + 3] = sy;
quadPoints[i + 2] = quadPoints[i + 6] = sx + width * pageWidth;
quadPoints[i + 5] = quadPoints[i + 7] = sy + height * pageHeight;
i += 8;
}
return quadPoints;
};
_serializeOutlines = new WeakSet();
serializeOutlines_fn = function(rect) {
return __privateGet(this, _highlightOutlines).serialize(rect, __privateMethod(this, _getRotation, getRotation_fn).call(this));
};
_highlightMove = new WeakSet();
highlightMove_fn = function(parent, event) {
if (this._freeHighlight.add(event)) {
parent.drawLayer.updatePath(this._freeHighlightId, this._freeHighlight);
}
};
_endHighlight = new WeakSet();
endHighlight_fn = function(parent, event) {
if (!this._freeHighlight.isEmpty()) {
parent.createAndAddNewEditor(event, false, {
highlightId: this._freeHighlightId,
highlightOutlines: this._freeHighlight.getOutlines(),
clipPathId: this._freeHighlightClipId,
methodOfCreation: "main_toolbar"
});
} else {
parent.drawLayer.removeFreeHighlight(this._freeHighlightId);
}
this._freeHighlightId = -1;
this._freeHighlight = null;
this._freeHighlightClipId = "";
};
__privateAdd(HighlightEditor, _rotateBbox);
__privateAdd(HighlightEditor, _highlightMove);
__privateAdd(HighlightEditor, _endHighlight);
__publicField(HighlightEditor, "_defaultColor", null);
__publicField(HighlightEditor, "_defaultOpacity", 1);
__publicField(HighlightEditor, "_defaultThickness", 12);
__publicField(HighlightEditor, "_l10nPromise");
__publicField(HighlightEditor, "_type", "highlight");
__publicField(HighlightEditor, "_editorType", AnnotationEditorType.HIGHLIGHT);
__publicField(HighlightEditor, "_freeHighlightId", -1);
__publicField(HighlightEditor, "_freeHighlight", null);
__publicField(HighlightEditor, "_freeHighlightClipId", "");
var _baseHeight, _baseWidth, _canvasContextMenuTimeoutId, _currentPath2D, _disableEditing, _drawingAC, _hasSomethingToDraw, _isCanvasInitialized, _observer, _pointerdownAC, _realWidth, _realHeight, _requestFrameCallback, _updateThickness2, updateThickness_fn2, _updateColor3, updateColor_fn3, _updateOpacity, updateOpacity_fn, _getInitialBBox, getInitialBBox_fn, _setStroke, setStroke_fn, _startDrawing, startDrawing_fn, _draw, draw_fn, _endPath, endPath_fn, _stopDrawing, stopDrawing_fn, _drawPoints, drawPoints_fn, _makeBezierCurve, makeBezierCurve_fn, _generateBezierPoints, generateBezierPoints_fn, _redraw, redraw_fn, _addPointerdownListener, addPointerdownListener_fn, _removePointerdownListener, removePointerdownListener_fn, _endDrawing, endDrawing_fn, _createCanvas, createCanvas_fn, _createObserver, createObserver_fn, _setCanvasDims, setCanvasDims_fn, _setScaleFactor, setScaleFactor_fn, _updateTransform, updateTransform_fn, _buildPath2D, buildPath2D_fn, _toPDFCoordinates, toPDFCoordinates_fn, _fromPDFCoordinates, fromPDFCoordinates_fn, _serializePaths, serializePaths_fn, _getBbox, getBbox_fn, _getPadding, getPadding_fn, _fitToContent, fitToContent_fn;
var _InkEditor = class extends AnnotationEditor {
constructor(params) {
super({
...params,
name: "inkEditor"
});
__privateAdd(this, _updateThickness2);
__privateAdd(this, _updateColor3);
__privateAdd(this, _updateOpacity);
__privateAdd(this, _getInitialBBox);
__privateAdd(this, _setStroke);
__privateAdd(this, _startDrawing);
__privateAdd(this, _draw);
__privateAdd(this, _endPath);
__privateAdd(this, _stopDrawing);
__privateAdd(this, _drawPoints);
__privateAdd(this, _makeBezierCurve);
__privateAdd(this, _generateBezierPoints);
__privateAdd(this, _redraw);
__privateAdd(this, _addPointerdownListener);
__privateAdd(this, _removePointerdownListener);
__privateAdd(this, _endDrawing);
__privateAdd(this, _createCanvas);
__privateAdd(this, _createObserver);
__privateAdd(this, _setCanvasDims);
__privateAdd(this, _setScaleFactor);
__privateAdd(this, _updateTransform);
__privateAdd(this, _serializePaths);
__privateAdd(this, _getBbox);
__privateAdd(this, _getPadding);
__privateAdd(this, _fitToContent);
__privateAdd(this, _baseHeight, 0);
__privateAdd(this, _baseWidth, 0);
__privateAdd(this, _canvasContextMenuTimeoutId, null);
__privateAdd(this, _currentPath2D, new Path2D());
__privateAdd(this, _disableEditing, false);
__privateAdd(this, _drawingAC, null);
__privateAdd(this, _hasSomethingToDraw, false);
__privateAdd(this, _isCanvasInitialized, false);
__privateAdd(this, _observer, null);
__privateAdd(this, _pointerdownAC, null);
__privateAdd(this, _realWidth, 0);
__privateAdd(this, _realHeight, 0);
__privateAdd(this, _requestFrameCallback, null);
this.color = params.color || null;
this.thickness = params.thickness || null;
this.opacity = params.opacity || null;
this.paths = [];
this.bezierPath2D = [];
this.allRawPaths = [];
this.currentPath = [];
this.scaleFactor = 1;
this.translationX = this.translationY = 0;
this.x = 0;
this.y = 0;
this._willKeepAspectRatio = true;
}
static initialize(l10n, uiManager) {
AnnotationEditor.initialize(l10n, uiManager);
}
static updateDefaultParams(type, value) {
switch (type) {
case AnnotationEditorParamsType.INK_THICKNESS:
_InkEditor._defaultThickness = value;
break;
case AnnotationEditorParamsType.INK_COLOR:
_InkEditor._defaultColor = value;
break;
case AnnotationEditorParamsType.INK_OPACITY:
_InkEditor._defaultOpacity = value / 100;
break;
}
}
updateParams(type, value) {
switch (type) {
case AnnotationEditorParamsType.INK_THICKNESS:
__privateMethod(this, _updateThickness2, updateThickness_fn2).call(this, value);
break;
case AnnotationEditorParamsType.INK_COLOR:
__privateMethod(this, _updateColor3, updateColor_fn3).call(this, value);
break;
case AnnotationEditorParamsType.INK_OPACITY:
__privateMethod(this, _updateOpacity, updateOpacity_fn).call(this, value);
break;
}
}
static get defaultPropertiesToUpdate() {
return [[AnnotationEditorParamsType.INK_THICKNESS, _InkEditor._defaultThickness], [AnnotationEditorParamsType.INK_COLOR, _InkEditor._defaultColor || AnnotationEditor._defaultLineColor], [AnnotationEditorParamsType.INK_OPACITY, Math.round(_InkEditor._defaultOpacity * 100)]];
}
get propertiesToUpdate() {
var _a2;
return [[AnnotationEditorParamsType.INK_THICKNESS, this.thickness || _InkEditor._defaultThickness], [AnnotationEditorParamsType.INK_COLOR, this.color || _InkEditor._defaultColor || AnnotationEditor._defaultLineColor], [AnnotationEditorParamsType.INK_OPACITY, Math.round(100 * ((_a2 = this.opacity) != null ? _a2 : _InkEditor._defaultOpacity))]];
}
rebuild() {
if (!this.parent) {
return;
}
super.rebuild();
if (this.div === null) {
return;
}
if (!this.canvas) {
__privateMethod(this, _createCanvas, createCanvas_fn).call(this);
__privateMethod(this, _createObserver, createObserver_fn).call(this);
}
if (!this.isAttachedToDOM) {
this.parent.add(this);
__privateMethod(this, _setCanvasDims, setCanvasDims_fn).call(this);
}
__privateMethod(this, _fitToContent, fitToContent_fn).call(this);
}
remove() {
var _a2;
if (this.canvas === null) {
return;
}
if (!this.isEmpty()) {
this.commit();
}
this.canvas.width = this.canvas.height = 0;
this.canvas.remove();
this.canvas = null;
if (__privateGet(this, _canvasContextMenuTimeoutId)) {
clearTimeout(__privateGet(this, _canvasContextMenuTimeoutId));
__privateSet(this, _canvasContextMenuTimeoutId, null);
}
(_a2 = __privateGet(this, _observer)) == null ? void 0 : _a2.disconnect();
__privateSet(this, _observer, null);
super.remove();
}
setParent(parent) {
if (!this.parent && parent) {
this._uiManager.removeShouldRescale(this);
} else if (this.parent && parent === null) {
this._uiManager.addShouldRescale(this);
}
super.setParent(parent);
}
onScaleChanging() {
const [parentWidth, parentHeight] = this.parentDimensions;
const width = this.width * parentWidth;
const height = this.height * parentHeight;
this.setDimensions(width, height);
}
enableEditMode() {
if (__privateGet(this, _disableEditing) || this.canvas === null) {
return;
}
super.enableEditMode();
this._isDraggable = false;
__privateMethod(this, _addPointerdownListener, addPointerdownListener_fn).call(this);
}
disableEditMode() {
if (!this.isInEditMode() || this.canvas === null) {
return;
}
super.disableEditMode();
this._isDraggable = !this.isEmpty();
this.div.classList.remove("editing");
__privateMethod(this, _removePointerdownListener, removePointerdownListener_fn).call(this);
}
onceAdded() {
this._isDraggable = !this.isEmpty();
}
isEmpty() {
return this.paths.length === 0 || this.paths.length === 1 && this.paths[0].length === 0;
}
commit() {
if (__privateGet(this, _disableEditing)) {
return;
}
super.commit();
this.isEditing = false;
this.disableEditMode();
this.setInForeground();
__privateSet(this, _disableEditing, true);
this.div.classList.add("disabled");
__privateMethod(this, _fitToContent, fitToContent_fn).call(this, true);
this.select();
this.parent.addInkEditorIfNeeded(true);
this.moveInDOM();
this.div.focus({
preventScroll: true
});
}
focusin(event) {
if (!this._focusEventsAllowed) {
return;
}
super.focusin(event);
this.enableEditMode();
}
canvasPointerdown(event) {
if (event.button !== 0 || !this.isInEditMode() || __privateGet(this, _disableEditing)) {
return;
}
this.setInForeground();
event.preventDefault();
if (!this.div.contains(document.activeElement)) {
this.div.focus({
preventScroll: true
});
}
__privateMethod(this, _startDrawing, startDrawing_fn).call(this, event.offsetX, event.offsetY);
}
canvasPointermove(event) {
event.preventDefault();
__privateMethod(this, _draw, draw_fn).call(this, event.offsetX, event.offsetY);
}
canvasPointerup(event) {
event.preventDefault();
__privateMethod(this, _endDrawing, endDrawing_fn).call(this, event);
}
canvasPointerleave(event) {
__privateMethod(this, _endDrawing, endDrawing_fn).call(this, event);
}
get isResizable() {
return !this.isEmpty() && __privateGet(this, _disableEditing);
}
render() {
if (this.div) {
return this.div;
}
let baseX, baseY;
if (this.width) {
baseX = this.x;
baseY = this.y;
}
super.render();
this.div.setAttribute("data-l10n-id", "pdfjs-ink");
const [x, y, w, h] = __privateMethod(this, _getInitialBBox, getInitialBBox_fn).call(this);
this.setAt(x, y, 0, 0);
this.setDims(w, h);
__privateMethod(this, _createCanvas, createCanvas_fn).call(this);
if (this.width) {
const [parentWidth, parentHeight] = this.parentDimensions;
this.setAspectRatio(this.width * parentWidth, this.height * parentHeight);
this.setAt(baseX * parentWidth, baseY * parentHeight, this.width * parentWidth, this.height * parentHeight);
__privateSet(this, _isCanvasInitialized, true);
__privateMethod(this, _setCanvasDims, setCanvasDims_fn).call(this);
this.setDims(this.width * parentWidth, this.height * parentHeight);
__privateMethod(this, _redraw, redraw_fn).call(this);
this.div.classList.add("disabled");
} else {
this.div.classList.add("editing");
this.enableEditMode();
}
__privateMethod(this, _createObserver, createObserver_fn).call(this);
return this.div;
}
setDimensions(width, height) {
const roundedWidth = Math.round(width);
const roundedHeight = Math.round(height);
if (__privateGet(this, _realWidth) === roundedWidth && __privateGet(this, _realHeight) === roundedHeight) {
return;
}
__privateSet(this, _realWidth, roundedWidth);
__privateSet(this, _realHeight, roundedHeight);
this.canvas.style.visibility = "hidden";
const [parentWidth, parentHeight] = this.parentDimensions;
this.width = width / parentWidth;
this.height = height / parentHeight;
this.fixAndSetPosition();
if (__privateGet(this, _disableEditing)) {
__privateMethod(this, _setScaleFactor, setScaleFactor_fn).call(this, width, height);
}
__privateMethod(this, _setCanvasDims, setCanvasDims_fn).call(this);
__privateMethod(this, _redraw, redraw_fn).call(this);
this.canvas.style.visibility = "visible";
this.fixDims();
}
static deserialize(data, parent, uiManager) {
var _a2, _b, _c;
if (data instanceof InkAnnotationElement) {
return null;
}
const editor = super.deserialize(data, parent, uiManager);
editor.thickness = data.thickness;
editor.color = Util.makeHexColor(...data.color);
editor.opacity = data.opacity;
const [pageWidth, pageHeight] = editor.pageDimensions;
const width = editor.width * pageWidth;
const height = editor.height * pageHeight;
const scaleFactor = editor.parentScale;
const padding = data.thickness / 2;
__privateSet(editor, _disableEditing, true);
__privateSet(editor, _realWidth, Math.round(width));
__privateSet(editor, _realHeight, Math.round(height));
const {
paths,
rect,
rotation
} = data;
for (let {
bezier
} of paths) {
bezier = __privateMethod(_a2 = _InkEditor, _fromPDFCoordinates, fromPDFCoordinates_fn).call(_a2, bezier, rect, rotation);
const path = [];
editor.paths.push(path);
let p0 = scaleFactor * (bezier[0] - padding);
let p1 = scaleFactor * (bezier[1] - padding);
for (let i = 2, ii = bezier.length; i < ii; i += 6) {
const p10 = scaleFactor * (bezier[i] - padding);
const p11 = scaleFactor * (bezier[i + 1] - padding);
const p20 = scaleFactor * (bezier[i + 2] - padding);
const p21 = scaleFactor * (bezier[i + 3] - padding);
const p30 = scaleFactor * (bezier[i + 4] - padding);
const p31 = scaleFactor * (bezier[i + 5] - padding);
path.push([[p0, p1], [p10, p11], [p20, p21], [p30, p31]]);
p0 = p30;
p1 = p31;
}
const path2D = __privateMethod(this, _buildPath2D, buildPath2D_fn).call(this, path);
editor.bezierPath2D.push(path2D);
}
const bbox = __privateMethod(_b = editor, _getBbox, getBbox_fn).call(_b);
__privateSet(editor, _baseWidth, Math.max(AnnotationEditor.MIN_SIZE, bbox[2] - bbox[0]));
__privateSet(editor, _baseHeight, Math.max(AnnotationEditor.MIN_SIZE, bbox[3] - bbox[1]));
__privateMethod(_c = editor, _setScaleFactor, setScaleFactor_fn).call(_c, width, height);
return editor;
}
serialize() {
if (this.isEmpty()) {
return null;
}
const rect = this.getRect(0, 0);
const color2 = AnnotationEditor._colorManager.convert(this.ctx.strokeStyle);
return {
annotationType: AnnotationEditorType.INK,
color: color2,
thickness: this.thickness,
opacity: this.opacity,
paths: __privateMethod(this, _serializePaths, serializePaths_fn).call(this, this.scaleFactor / this.parentScale, this.translationX, this.translationY, rect),
pageIndex: this.pageIndex,
rect,
rotation: this.rotation,
structTreeParentId: this._structTreeParentId
};
}
};
var InkEditor = _InkEditor;
_baseHeight = new WeakMap();
_baseWidth = new WeakMap();
_canvasContextMenuTimeoutId = new WeakMap();
_currentPath2D = new WeakMap();
_disableEditing = new WeakMap();
_drawingAC = new WeakMap();
_hasSomethingToDraw = new WeakMap();
_isCanvasInitialized = new WeakMap();
_observer = new WeakMap();
_pointerdownAC = new WeakMap();
_realWidth = new WeakMap();
_realHeight = new WeakMap();
_requestFrameCallback = new WeakMap();
_updateThickness2 = new WeakSet();
updateThickness_fn2 = function(thickness) {
const setThickness = (th) => {
this.thickness = th;
__privateMethod(this, _fitToContent, fitToContent_fn).call(this);
};
const savedThickness = this.thickness;
this.addCommands({
cmd: setThickness.bind(this, thickness),
undo: setThickness.bind(this, savedThickness),
post: this._uiManager.updateUI.bind(this._uiManager, this),
mustExec: true,
type: AnnotationEditorParamsType.INK_THICKNESS,
overwriteIfSameType: true,
keepUndo: true
});
};
_updateColor3 = new WeakSet();
updateColor_fn3 = function(color2) {
const setColor = (col) => {
this.color = col;
__privateMethod(this, _redraw, redraw_fn).call(this);
};
const savedColor = this.color;
this.addCommands({
cmd: setColor.bind(this, color2),
undo: setColor.bind(this, savedColor),
post: this._uiManager.updateUI.bind(this._uiManager, this),
mustExec: true,
type: AnnotationEditorParamsType.INK_COLOR,
overwriteIfSameType: true,
keepUndo: true
});
};
_updateOpacity = new WeakSet();
updateOpacity_fn = function(opacity) {
const setOpacity = (op) => {
this.opacity = op;
__privateMethod(this, _redraw, redraw_fn).call(this);
};
opacity /= 100;
const savedOpacity = this.opacity;
this.addCommands({
cmd: setOpacity.bind(this, opacity),
undo: setOpacity.bind(this, savedOpacity),
post: this._uiManager.updateUI.bind(this._uiManager, this),
mustExec: true,
type: AnnotationEditorParamsType.INK_OPACITY,
overwriteIfSameType: true,
keepUndo: true
});
};
_getInitialBBox = new WeakSet();
getInitialBBox_fn = function() {
const {
parentRotation,
parentDimensions: [width, height]
} = this;
switch (parentRotation) {
case 90:
return [0, height, height, width];
case 180:
return [width, height, width, height];
case 270:
return [width, 0, height, width];
default:
return [0, 0, width, height];
}
};
_setStroke = new WeakSet();
setStroke_fn = function() {
const {
ctx,
color: color2,
opacity,
thickness,
parentScale,
scaleFactor
} = this;
ctx.lineWidth = thickness * parentScale / scaleFactor;
ctx.lineCap = "round";
ctx.lineJoin = "round";
ctx.miterLimit = 10;
ctx.strokeStyle = `${color2}${opacityToHex(opacity)}`;
};
_startDrawing = new WeakSet();
startDrawing_fn = function(x, y) {
var _a2;
this.canvas.addEventListener("contextmenu", noContextMenu, {
signal: this._uiManager._signal
});
__privateMethod(this, _removePointerdownListener, removePointerdownListener_fn).call(this);
__privateSet(this, _drawingAC, new AbortController());
const signal = this._uiManager.combinedSignal(__privateGet(this, _drawingAC));
this.canvas.addEventListener("pointerleave", this.canvasPointerleave.bind(this), {
signal
});
this.canvas.addEventListener("pointermove", this.canvasPointermove.bind(this), {
signal
});
this.canvas.addEventListener("pointerup", this.canvasPointerup.bind(this), {
signal
});
this.isEditing = true;
if (!__privateGet(this, _isCanvasInitialized)) {
__privateSet(this, _isCanvasInitialized, true);
__privateMethod(this, _setCanvasDims, setCanvasDims_fn).call(this);
this.thickness || (this.thickness = _InkEditor._defaultThickness);
this.color || (this.color = _InkEditor._defaultColor || AnnotationEditor._defaultLineColor);
(_a2 = this.opacity) != null ? _a2 : this.opacity = _InkEditor._defaultOpacity;
}
this.currentPath.push([x, y]);
__privateSet(this, _hasSomethingToDraw, false);
__privateMethod(this, _setStroke, setStroke_fn).call(this);
__privateSet(this, _requestFrameCallback, () => {
__privateMethod(this, _drawPoints, drawPoints_fn).call(this);
if (__privateGet(this, _requestFrameCallback)) {
window.requestAnimationFrame(__privateGet(this, _requestFrameCallback));
}
});
window.requestAnimationFrame(__privateGet(this, _requestFrameCallback));
};
_draw = new WeakSet();
draw_fn = function(x, y) {
const [lastX, lastY] = this.currentPath.at(-1);
if (this.currentPath.length > 1 && x === lastX && y === lastY) {
return;
}
const currentPath = this.currentPath;
let path2D = __privateGet(this, _currentPath2D);
currentPath.push([x, y]);
__privateSet(this, _hasSomethingToDraw, true);
if (currentPath.length <= 2) {
path2D.moveTo(...currentPath[0]);
path2D.lineTo(x, y);
return;
}
if (currentPath.length === 3) {
__privateSet(this, _currentPath2D, path2D = new Path2D());
path2D.moveTo(...currentPath[0]);
}
__privateMethod(this, _makeBezierCurve, makeBezierCurve_fn).call(this, path2D, ...currentPath.at(-3), ...currentPath.at(-2), x, y);
};
_endPath = new WeakSet();
endPath_fn = function() {
if (this.currentPath.length === 0) {
return;
}
const lastPoint = this.currentPath.at(-1);
__privateGet(this, _currentPath2D).lineTo(...lastPoint);
};
_stopDrawing = new WeakSet();
stopDrawing_fn = function(x, y) {
__privateSet(this, _requestFrameCallback, null);
x = Math.min(Math.max(x, 0), this.canvas.width);
y = Math.min(Math.max(y, 0), this.canvas.height);
__privateMethod(this, _draw, draw_fn).call(this, x, y);
__privateMethod(this, _endPath, endPath_fn).call(this);
let bezier;
if (this.currentPath.length !== 1) {
bezier = __privateMethod(this, _generateBezierPoints, generateBezierPoints_fn).call(this);
} else {
const xy = [x, y];
bezier = [[xy, xy.slice(), xy.slice(), xy]];
}
const path2D = __privateGet(this, _currentPath2D);
const currentPath = this.currentPath;
this.currentPath = [];
__privateSet(this, _currentPath2D, new Path2D());
const cmd = () => {
this.allRawPaths.push(currentPath);
this.paths.push(bezier);
this.bezierPath2D.push(path2D);
this._uiManager.rebuild(this);
};
const undo = () => {
this.allRawPaths.pop();
this.paths.pop();
this.bezierPath2D.pop();
if (this.paths.length === 0) {
this.remove();
} else {
if (!this.canvas) {
__privateMethod(this, _createCanvas, createCanvas_fn).call(this);
__privateMethod(this, _createObserver, createObserver_fn).call(this);
}
__privateMethod(this, _fitToContent, fitToContent_fn).call(this);
}
};
this.addCommands({
cmd,
undo,
mustExec: true
});
};
_drawPoints = new WeakSet();
drawPoints_fn = function() {
if (!__privateGet(this, _hasSomethingToDraw)) {
return;
}
__privateSet(this, _hasSomethingToDraw, false);
const thickness = Math.ceil(this.thickness * this.parentScale);
const lastPoints = this.currentPath.slice(-3);
const x = lastPoints.map((xy) => xy[0]);
const y = lastPoints.map((xy) => xy[1]);
const xMin = Math.min(...x) - thickness;
const xMax = Math.max(...x) + thickness;
const yMin = Math.min(...y) - thickness;
const yMax = Math.max(...y) + thickness;
const {
ctx
} = this;
ctx.save();
ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);
for (const path of this.bezierPath2D) {
ctx.stroke(path);
}
ctx.stroke(__privateGet(this, _currentPath2D));
ctx.restore();
};
_makeBezierCurve = new WeakSet();
makeBezierCurve_fn = function(path2D, x0, y0, x1, y1, x2, y2) {
const prevX = (x0 + x1) / 2;
const prevY = (y0 + y1) / 2;
const x3 = (x1 + x2) / 2;
const y3 = (y1 + y2) / 2;
path2D.bezierCurveTo(prevX + 2 * (x1 - prevX) / 3, prevY + 2 * (y1 - prevY) / 3, x3 + 2 * (x1 - x3) / 3, y3 + 2 * (y1 - y3) / 3, x3, y3);
};
_generateBezierPoints = new WeakSet();
generateBezierPoints_fn = function() {
const path = this.currentPath;
if (path.length <= 2) {
return [[path[0], path[0], path.at(-1), path.at(-1)]];
}
const bezierPoints = [];
let i;
let [x0, y0] = path[0];
for (i = 1; i < path.length - 2; i++) {
const [x12, y12] = path[i];
const [x22, y22] = path[i + 1];
const x3 = (x12 + x22) / 2;
const y3 = (y12 + y22) / 2;
const control12 = [x0 + 2 * (x12 - x0) / 3, y0 + 2 * (y12 - y0) / 3];
const control22 = [x3 + 2 * (x12 - x3) / 3, y3 + 2 * (y12 - y3) / 3];
bezierPoints.push([[x0, y0], control12, control22, [x3, y3]]);
[x0, y0] = [x3, y3];
}
const [x1, y1] = path[i];
const [x2, y2] = path[i + 1];
const control1 = [x0 + 2 * (x1 - x0) / 3, y0 + 2 * (y1 - y0) / 3];
const control2 = [x2 + 2 * (x1 - x2) / 3, y2 + 2 * (y1 - y2) / 3];
bezierPoints.push([[x0, y0], control1, control2, [x2, y2]]);
return bezierPoints;
};
_redraw = new WeakSet();
redraw_fn = function() {
if (this.isEmpty()) {
__privateMethod(this, _updateTransform, updateTransform_fn).call(this);
return;
}
__privateMethod(this, _setStroke, setStroke_fn).call(this);
const {
canvas,
ctx
} = this;
ctx.setTransform(1, 0, 0, 1, 0, 0);
ctx.clearRect(0, 0, canvas.width, canvas.height);
__privateMethod(this, _updateTransform, updateTransform_fn).call(this);
for (const path of this.bezierPath2D) {
ctx.stroke(path);
}
};
_addPointerdownListener = new WeakSet();
addPointerdownListener_fn = function() {
if (__privateGet(this, _pointerdownAC)) {
return;
}
__privateSet(this, _pointerdownAC, new AbortController());
const signal = this._uiManager.combinedSignal(__privateGet(this, _pointerdownAC));
this.canvas.addEventListener("pointerdown", this.canvasPointerdown.bind(this), {
signal
});
};
_removePointerdownListener = new WeakSet();
removePointerdownListener_fn = function() {
var _a2;
(_a2 = this.pointerdownAC) == null ? void 0 : _a2.abort();
this.pointerdownAC = null;
};
_endDrawing = new WeakSet();
endDrawing_fn = function(event) {
var _a2;
(_a2 = __privateGet(this, _drawingAC)) == null ? void 0 : _a2.abort();
__privateSet(this, _drawingAC, null);
__privateMethod(this, _addPointerdownListener, addPointerdownListener_fn).call(this);
if (__privateGet(this, _canvasContextMenuTimeoutId)) {
clearTimeout(__privateGet(this, _canvasContextMenuTimeoutId));
}
__privateSet(this, _canvasContextMenuTimeoutId, setTimeout(() => {
__privateSet(this, _canvasContextMenuTimeoutId, null);
this.canvas.removeEventListener("contextmenu", noContextMenu);
}, 10));
__privateMethod(this, _stopDrawing, stopDrawing_fn).call(this, event.offsetX, event.offsetY);
this.addToAnnotationStorage();
this.setInBackground();
};
_createCanvas = new WeakSet();
createCanvas_fn = function() {
this.canvas = document.createElement("canvas");
this.canvas.width = this.canvas.height = 0;
this.canvas.className = "inkEditorCanvas";
this.canvas.setAttribute("data-l10n-id", "pdfjs-ink-canvas");
this.div.append(this.canvas);
this.ctx = this.canvas.getContext("2d");
};
_createObserver = new WeakSet();
createObserver_fn = function() {
__privateSet(this, _observer, new ResizeObserver((entries) => {
const rect = entries[0].contentRect;
if (rect.width && rect.height) {
this.setDimensions(rect.width, rect.height);
}
}));
__privateGet(this, _observer).observe(this.div);
this._uiManager._signal.addEventListener("abort", () => {
var _a2;
(_a2 = __privateGet(this, _observer)) == null ? void 0 : _a2.disconnect();
__privateSet(this, _observer, null);
}, {
once: true
});
};
_setCanvasDims = new WeakSet();
setCanvasDims_fn = function() {
if (!__privateGet(this, _isCanvasInitialized)) {
return;
}
const [parentWidth, parentHeight] = this.parentDimensions;
this.canvas.width = Math.ceil(this.width * parentWidth);
this.canvas.height = Math.ceil(this.height * parentHeight);
__privateMethod(this, _updateTransform, updateTransform_fn).call(this);
};
_setScaleFactor = new WeakSet();
setScaleFactor_fn = function(width, height) {
const padding = __privateMethod(this, _getPadding, getPadding_fn).call(this);
const scaleFactorW = (width - padding) / __privateGet(this, _baseWidth);
const scaleFactorH = (height - padding) / __privateGet(this, _baseHeight);
this.scaleFactor = Math.min(scaleFactorW, scaleFactorH);
};
_updateTransform = new WeakSet();
updateTransform_fn = function() {
const padding = __privateMethod(this, _getPadding, getPadding_fn).call(this) / 2;
this.ctx.setTransform(this.scaleFactor, 0, 0, this.scaleFactor, this.translationX * this.scaleFactor + padding, this.translationY * this.scaleFactor + padding);
};
_buildPath2D = new WeakSet();
buildPath2D_fn = function(bezier) {
const path2D = new Path2D();
for (let i = 0, ii = bezier.length; i < ii; i++) {
const [first, control1, control2, second] = bezier[i];
if (i === 0) {
path2D.moveTo(...first);
}
path2D.bezierCurveTo(control1[0], control1[1], control2[0], control2[1], second[0], second[1]);
}
return path2D;
};
_toPDFCoordinates = new WeakSet();
toPDFCoordinates_fn = function(points, rect, rotation) {
const [blX, blY, trX, trY] = rect;
switch (rotation) {
case 0:
for (let i = 0, ii = points.length; i < ii; i += 2) {
points[i] += blX;
points[i + 1] = trY - points[i + 1];
}
break;
case 90:
for (let i = 0, ii = points.length; i < ii; i += 2) {
const x = points[i];
points[i] = points[i + 1] + blX;
points[i + 1] = x + blY;
}
break;
case 180:
for (let i = 0, ii = points.length; i < ii; i += 2) {
points[i] = trX - points[i];
points[i + 1] += blY;
}
break;
case 270:
for (let i = 0, ii = points.length; i < ii; i += 2) {
const x = points[i];
points[i] = trX - points[i + 1];
points[i + 1] = trY - x;
}
break;
default:
throw new Error("Invalid rotation");
}
return points;
};
_fromPDFCoordinates = new WeakSet();
fromPDFCoordinates_fn = function(points, rect, rotation) {
const [blX, blY, trX, trY] = rect;
switch (rotation) {
case 0:
for (let i = 0, ii = points.length; i < ii; i += 2) {
points[i] -= blX;
points[i + 1] = trY - points[i + 1];
}
break;
case 90:
for (let i = 0, ii = points.length; i < ii; i += 2) {
const x = points[i];
points[i] = points[i + 1] - blY;
points[i + 1] = x - blX;
}
break;
case 180:
for (let i = 0, ii = points.length; i < ii; i += 2) {
points[i] = trX - points[i];
points[i + 1] -= blY;
}
break;
case 270:
for (let i = 0, ii = points.length; i < ii; i += 2) {
const x = points[i];
points[i] = trY - points[i + 1];
points[i + 1] = trX - x;
}
break;
default:
throw new Error("Invalid rotation");
}
return points;
};
_serializePaths = new WeakSet();
serializePaths_fn = function(s, tx, ty, rect) {
var _a2, _b;
const paths = [];
const padding = this.thickness / 2;
const shiftX = s * tx + padding;
const shiftY = s * ty + padding;
for (const bezier of this.paths) {
const buffer = [];
const points = [];
for (let j = 0, jj = bezier.length; j < jj; j++) {
const [first, control1, control2, second] = bezier[j];
if (first[0] === second[0] && first[1] === second[1] && jj === 1) {
const p0 = s * first[0] + shiftX;
const p1 = s * first[1] + shiftY;
buffer.push(p0, p1);
points.push(p0, p1);
break;
}
const p10 = s * first[0] + shiftX;
const p11 = s * first[1] + shiftY;
const p20 = s * control1[0] + shiftX;
const p21 = s * control1[1] + shiftY;
const p30 = s * control2[0] + shiftX;
const p31 = s * control2[1] + shiftY;
const p40 = s * second[0] + shiftX;
const p41 = s * second[1] + shiftY;
if (j === 0) {
buffer.push(p10, p11);
points.push(p10, p11);
}
buffer.push(p20, p21, p30, p31, p40, p41);
points.push(p20, p21);
if (j === jj - 1) {
points.push(p40, p41);
}
}
paths.push({
bezier: __privateMethod(_a2 = _InkEditor, _toPDFCoordinates, toPDFCoordinates_fn).call(_a2, buffer, rect, this.rotation),
points: __privateMethod(_b = _InkEditor, _toPDFCoordinates, toPDFCoordinates_fn).call(_b, points, rect, this.rotation)
});
}
return paths;
};
_getBbox = new WeakSet();
getBbox_fn = function() {
let xMin = Infinity;
let xMax = -Infinity;
let yMin = Infinity;
let yMax = -Infinity;
for (const path of this.paths) {
for (const [first, control1, control2, second] of path) {
const bbox = Util.bezierBoundingBox(...first, ...control1, ...control2, ...second);
xMin = Math.min(xMin, bbox[0]);
yMin = Math.min(yMin, bbox[1]);
xMax = Math.max(xMax, bbox[2]);
yMax = Math.max(yMax, bbox[3]);
}
}
return [xMin, yMin, xMax, yMax];
};
_getPadding = new WeakSet();
getPadding_fn = function() {
return __privateGet(this, _disableEditing) ? Math.ceil(this.thickness * this.parentScale) : 0;
};
_fitToContent = new WeakSet();
fitToContent_fn = function(firstTime = false) {
if (this.isEmpty()) {
return;
}
if (!__privateGet(this, _disableEditing)) {
__privateMethod(this, _redraw, redraw_fn).call(this);
return;
}
const bbox = __privateMethod(this, _getBbox, getBbox_fn).call(this);
const padding = __privateMethod(this, _getPadding, getPadding_fn).call(this);
__privateSet(this, _baseWidth, Math.max(AnnotationEditor.MIN_SIZE, bbox[2] - bbox[0]));
__privateSet(this, _baseHeight, Math.max(AnnotationEditor.MIN_SIZE, bbox[3] - bbox[1]));
const width = Math.ceil(padding + __privateGet(this, _baseWidth) * this.scaleFactor);
const height = Math.ceil(padding + __privateGet(this, _baseHeight) * this.scaleFactor);
const [parentWidth, parentHeight] = this.parentDimensions;
this.width = width / parentWidth;
this.height = height / parentHeight;
this.setAspectRatio(width, height);
const prevTranslationX = this.translationX;
const prevTranslationY = this.translationY;
this.translationX = -bbox[0];
this.translationY = -bbox[1];
__privateMethod(this, _setCanvasDims, setCanvasDims_fn).call(this);
__privateMethod(this, _redraw, redraw_fn).call(this);
__privateSet(this, _realWidth, width);
__privateSet(this, _realHeight, height);
this.setDims(width, height);
const unscaledPadding = firstTime ? padding / this.scaleFactor / 2 : 0;
this.translate(prevTranslationX - this.translationX - unscaledPadding, prevTranslationY - this.translationY - unscaledPadding);
};
__privateAdd(InkEditor, _buildPath2D);
__privateAdd(InkEditor, _toPDFCoordinates);
__privateAdd(InkEditor, _fromPDFCoordinates);
__publicField(InkEditor, "_defaultColor", null);
__publicField(InkEditor, "_defaultOpacity", 1);
__publicField(InkEditor, "_defaultThickness", 1);
__publicField(InkEditor, "_type", "ink");
__publicField(InkEditor, "_editorType", AnnotationEditorType.INK);
var _bitmap, _bitmapId, _bitmapPromise, _bitmapUrl, _bitmapFile, _bitmapFileName, _canvas, _observer2, _resizeTimeoutId, _isSvg, _hasBeenAddedInUndoStack, _getBitmapFetched, getBitmapFetched_fn, _getBitmapDone, getBitmapDone_fn, _getBitmap, getBitmap_fn, _createCanvas2, createCanvas_fn2, _setDimensions, setDimensions_fn, _scaleBitmap, scaleBitmap_fn, _drawBitmap, drawBitmap_fn, _serializeBitmap, serializeBitmap_fn, _createObserver2, createObserver_fn2;
var _StampEditor = class extends AnnotationEditor {
constructor(params) {
super({
...params,
name: "stampEditor"
});
__privateAdd(this, _getBitmapFetched);
__privateAdd(this, _getBitmapDone);
__privateAdd(this, _getBitmap);
__privateAdd(this, _createCanvas2);
__privateAdd(this, _setDimensions);
__privateAdd(this, _scaleBitmap);
__privateAdd(this, _drawBitmap);
__privateAdd(this, _serializeBitmap);
__privateAdd(this, _createObserver2);
__privateAdd(this, _bitmap, null);
__privateAdd(this, _bitmapId, null);
__privateAdd(this, _bitmapPromise, null);
__privateAdd(this, _bitmapUrl, null);
__privateAdd(this, _bitmapFile, null);
__privateAdd(this, _bitmapFileName, "");
__privateAdd(this, _canvas, null);
__privateAdd(this, _observer2, null);
__privateAdd(this, _resizeTimeoutId, null);
__privateAdd(this, _isSvg, false);
__privateAdd(this, _hasBeenAddedInUndoStack, false);
__privateSet(this, _bitmapUrl, params.bitmapUrl);
__privateSet(this, _bitmapFile, params.bitmapFile);
}
static initialize(l10n, uiManager) {
AnnotationEditor.initialize(l10n, uiManager);
}
static get supportedTypes() {
const types = ["apng", "avif", "bmp", "gif", "jpeg", "png", "svg+xml", "webp", "x-icon"];
return shadow(this, "supportedTypes", types.map((type) => `image/${type}`));
}
static get supportedTypesStr() {
return shadow(this, "supportedTypesStr", this.supportedTypes.join(","));
}
static isHandlingMimeForPasting(mime) {
return this.supportedTypes.includes(mime);
}
static paste(item, parent) {
parent.pasteEditor(AnnotationEditorType.STAMP, {
bitmapFile: item.getAsFile()
});
}
altTextFinish() {
if (this._uiManager.useNewAltTextFlow) {
this.div.hidden = false;
}
super.altTextFinish();
}
get telemetryFinalData() {
var _a2;
return {
type: "stamp",
hasAltText: !!((_a2 = this.altTextData) == null ? void 0 : _a2.altText)
};
}
static computeTelemetryFinalData(data) {
var _a2, _b;
const hasAltTextStats = data.get("hasAltText");
return {
hasAltText: (_a2 = hasAltTextStats.get(true)) != null ? _a2 : 0,
hasNoAltText: (_b = hasAltTextStats.get(false)) != null ? _b : 0
};
}
async mlGuessAltText(imageData = null, updateAltTextData = true) {
if (this.hasAltTextData()) {
return null;
}
const {
mlManager
} = this._uiManager;
if (!mlManager) {
throw new Error("No ML.");
}
if (!await mlManager.isEnabledFor("altText")) {
throw new Error("ML isn't enabled for alt text.");
}
const {
data,
width,
height
} = imageData || this.copyCanvas(null, true).imageData;
const response = await mlManager.guess({
name: "altText",
request: {
data,
width,
height,
channels: data.length / (width * height)
}
});
if (!response) {
throw new Error("No response from the AI service.");
}
if (response.error) {
throw new Error("Error from the AI service.");
}
if (response.cancel) {
return null;
}
if (!response.output) {
throw new Error("No valid response from the AI service.");
}
const altText = response.output;
await this.setGuessedAltText(altText);
if (updateAltTextData && !this.hasAltTextData()) {
this.altTextData = {
alt: altText,
decorative: false
};
}
return altText;
}
remove() {
var _a2, _b;
if (__privateGet(this, _bitmapId)) {
__privateSet(this, _bitmap, null);
this._uiManager.imageManager.deleteId(__privateGet(this, _bitmapId));
(_a2 = __privateGet(this, _canvas)) == null ? void 0 : _a2.remove();
__privateSet(this, _canvas, null);
(_b = __privateGet(this, _observer2)) == null ? void 0 : _b.disconnect();
__privateSet(this, _observer2, null);
if (__privateGet(this, _resizeTimeoutId)) {
clearTimeout(__privateGet(this, _resizeTimeoutId));
__privateSet(this, _resizeTimeoutId, null);
}
}
super.remove();
}
rebuild() {
if (!this.parent) {
if (__privateGet(this, _bitmapId)) {
__privateMethod(this, _getBitmap, getBitmap_fn).call(this);
}
return;
}
super.rebuild();
if (this.div === null) {
return;
}
if (__privateGet(this, _bitmapId) && __privateGet(this, _canvas) === null) {
__privateMethod(this, _getBitmap, getBitmap_fn).call(this);
}
if (!this.isAttachedToDOM) {
this.parent.add(this);
}
}
onceAdded() {
this._isDraggable = true;
this.div.focus();
}
isEmpty() {
return !(__privateGet(this, _bitmapPromise) || __privateGet(this, _bitmap) || __privateGet(this, _bitmapUrl) || __privateGet(this, _bitmapFile) || __privateGet(this, _bitmapId));
}
get isResizable() {
return true;
}
render() {
if (this.div) {
return this.div;
}
let baseX, baseY;
if (this.width) {
baseX = this.x;
baseY = this.y;
}
super.render();
this.div.hidden = true;
this.addAltTextButton();
if (__privateGet(this, _bitmap)) {
__privateMethod(this, _createCanvas2, createCanvas_fn2).call(this);
} else {
__privateMethod(this, _getBitmap, getBitmap_fn).call(this);
}
if (this.width) {
const [parentWidth, parentHeight] = this.parentDimensions;
this.setAt(baseX * parentWidth, baseY * parentHeight, this.width * parentWidth, this.height * parentHeight);
}
return this.div;
}
copyCanvas(maxDimension, createImageData = false) {
var _a2;
if (!maxDimension) {
maxDimension = 224;
}
const {
width: bitmapWidth,
height: bitmapHeight
} = __privateGet(this, _bitmap);
const canvas = document.createElement("canvas");
let bitmap = __privateGet(this, _bitmap);
let width = bitmapWidth, height = bitmapHeight;
if (bitmapWidth > maxDimension || bitmapHeight > maxDimension) {
const ratio = Math.min(maxDimension / bitmapWidth, maxDimension / bitmapHeight);
width = Math.floor(bitmapWidth * ratio);
height = Math.floor(bitmapHeight * ratio);
if (!__privateGet(this, _isSvg)) {
bitmap = __privateMethod(this, _scaleBitmap, scaleBitmap_fn).call(this, width, height);
}
}
canvas.width = width;
canvas.height = height;
const ctx = canvas.getContext("2d");
ctx.filter = this._uiManager.hcmFilter;
let white = "white", black = "#cfcfd8";
if (this._uiManager.hcmFilter !== "none") {
black = "black";
} else if ((_a2 = window.matchMedia) == null ? void 0 : _a2.call(window, "(prefers-color-scheme: dark)").matches) {
white = "#8f8f9d";
black = "#42414d";
}
const boxDim = 15;
const pattern = new OffscreenCanvas(boxDim * 2, boxDim * 2);
const patternCtx = pattern.getContext("2d");
patternCtx.fillStyle = white;
patternCtx.fillRect(0, 0, boxDim * 2, boxDim * 2);
patternCtx.fillStyle = black;
patternCtx.fillRect(0, 0, boxDim, boxDim);
patternCtx.fillRect(boxDim, boxDim, boxDim, boxDim);
ctx.fillStyle = ctx.createPattern(pattern, "repeat");
ctx.fillRect(0, 0, width, height);
if (createImageData) {
const offscreen = new OffscreenCanvas(width, height);
const offscreenCtx = offscreen.getContext("2d", {
willReadFrequently: true
});
offscreenCtx.drawImage(bitmap, 0, 0, bitmap.width, bitmap.height, 0, 0, width, height);
const data = offscreenCtx.getImageData(0, 0, width, height).data;
ctx.drawImage(offscreen, 0, 0);
return {
canvas,
imageData: {
width,
height,
data
}
};
}
ctx.drawImage(bitmap, 0, 0, bitmap.width, bitmap.height, 0, 0, width, height);
return {
canvas,
imageData: null
};
}
getImageForAltText() {
return __privateGet(this, _canvas);
}
static deserialize(data, parent, uiManager) {
if (data instanceof StampAnnotationElement) {
return null;
}
const editor = super.deserialize(data, parent, uiManager);
const {
rect,
bitmapUrl,
bitmapId,
isSvg,
accessibilityData
} = data;
if (bitmapId && uiManager.imageManager.isValidId(bitmapId)) {
__privateSet(editor, _bitmapId, bitmapId);
} else {
__privateSet(editor, _bitmapUrl, bitmapUrl);
}
__privateSet(editor, _isSvg, isSvg);
const [parentWidth, parentHeight] = editor.pageDimensions;
editor.width = (rect[2] - rect[0]) / parentWidth;
editor.height = (rect[3] - rect[1]) / parentHeight;
if (accessibilityData) {
editor.altTextData = accessibilityData;
}
return editor;
}
serialize(isForCopying = false, context = null) {
if (this.isEmpty()) {
return null;
}
const serialized = {
annotationType: AnnotationEditorType.STAMP,
bitmapId: __privateGet(this, _bitmapId),
pageIndex: this.pageIndex,
rect: this.getRect(0, 0),
rotation: this.rotation,
isSvg: __privateGet(this, _isSvg),
structTreeParentId: this._structTreeParentId
};
if (isForCopying) {
serialized.bitmapUrl = __privateMethod(this, _serializeBitmap, serializeBitmap_fn).call(this, true);
serialized.accessibilityData = this.serializeAltText(true);
return serialized;
}
const {
decorative,
altText
} = this.serializeAltText(false);
if (!decorative && altText) {
serialized.accessibilityData = {
type: "Figure",
alt: altText
};
}
if (context === null) {
return serialized;
}
context.stamps || (context.stamps = /* @__PURE__ */ new Map());
const area = __privateGet(this, _isSvg) ? (serialized.rect[2] - serialized.rect[0]) * (serialized.rect[3] - serialized.rect[1]) : null;
if (!context.stamps.has(__privateGet(this, _bitmapId))) {
context.stamps.set(__privateGet(this, _bitmapId), {
area,
serialized
});
serialized.bitmap = __privateMethod(this, _serializeBitmap, serializeBitmap_fn).call(this, false);
} else if (__privateGet(this, _isSvg)) {
const prevData = context.stamps.get(__privateGet(this, _bitmapId));
if (area > prevData.area) {
prevData.area = area;
prevData.serialized.bitmap.close();
prevData.serialized.bitmap = __privateMethod(this, _serializeBitmap, serializeBitmap_fn).call(this, false);
}
}
return serialized;
}
};
var StampEditor = _StampEditor;
_bitmap = new WeakMap();
_bitmapId = new WeakMap();
_bitmapPromise = new WeakMap();
_bitmapUrl = new WeakMap();
_bitmapFile = new WeakMap();
_bitmapFileName = new WeakMap();
_canvas = new WeakMap();
_observer2 = new WeakMap();
_resizeTimeoutId = new WeakMap();
_isSvg = new WeakMap();
_hasBeenAddedInUndoStack = new WeakMap();
_getBitmapFetched = new WeakSet();
getBitmapFetched_fn = function(data, fromId = false) {
if (!data) {
this.remove();
return;
}
__privateSet(this, _bitmap, data.bitmap);
if (!fromId) {
__privateSet(this, _bitmapId, data.id);
__privateSet(this, _isSvg, data.isSvg);
}
if (data.file) {
__privateSet(this, _bitmapFileName, data.file.name);
}
__privateMethod(this, _createCanvas2, createCanvas_fn2).call(this);
};
_getBitmapDone = new WeakSet();
getBitmapDone_fn = function() {
__privateSet(this, _bitmapPromise, null);
this._uiManager.enableWaiting(false);
if (!__privateGet(this, _canvas)) {
return;
}
if (this._uiManager.useNewAltTextWhenAddingImage && this._uiManager.useNewAltTextFlow && __privateGet(this, _bitmap)) {
this._editToolbar.hide();
this._uiManager.editAltText(this, true);
return;
}
if (!this._uiManager.useNewAltTextWhenAddingImage && this._uiManager.useNewAltTextFlow && __privateGet(this, _bitmap)) {
this._reportTelemetry({
action: "pdfjs.image.image_added",
data: {
alt_text_modal: false,
alt_text_type: "empty"
}
});
try {
this.mlGuessAltText();
} catch (e) {
}
}
this.div.focus();
};
_getBitmap = new WeakSet();
getBitmap_fn = function() {
if (__privateGet(this, _bitmapId)) {
this._uiManager.enableWaiting(true);
this._uiManager.imageManager.getFromId(__privateGet(this, _bitmapId)).then((data) => __privateMethod(this, _getBitmapFetched, getBitmapFetched_fn).call(this, data, true)).finally(() => __privateMethod(this, _getBitmapDone, getBitmapDone_fn).call(this));
return;
}
if (__privateGet(this, _bitmapUrl)) {
const url = __privateGet(this, _bitmapUrl);
__privateSet(this, _bitmapUrl, null);
this._uiManager.enableWaiting(true);
__privateSet(this, _bitmapPromise, this._uiManager.imageManager.getFromUrl(url).then((data) => __privateMethod(this, _getBitmapFetched, getBitmapFetched_fn).call(this, data)).finally(() => __privateMethod(this, _getBitmapDone, getBitmapDone_fn).call(this)));
return;
}
if (__privateGet(this, _bitmapFile)) {
const file = __privateGet(this, _bitmapFile);
__privateSet(this, _bitmapFile, null);
this._uiManager.enableWaiting(true);
__privateSet(this, _bitmapPromise, this._uiManager.imageManager.getFromFile(file).then((data) => __privateMethod(this, _getBitmapFetched, getBitmapFetched_fn).call(this, data)).finally(() => __privateMethod(this, _getBitmapDone, getBitmapDone_fn).call(this)));
return;
}
const input = document.createElement("input");
input.type = "file";
input.accept = _StampEditor.supportedTypesStr;
const signal = this._uiManager._signal;
__privateSet(this, _bitmapPromise, new Promise((resolve) => {
input.addEventListener("change", async () => {
if (!input.files || input.files.length === 0) {
this.remove();
} else {
this._uiManager.enableWaiting(true);
const data = await this._uiManager.imageManager.getFromFile(input.files[0]);
this._reportTelemetry({
action: "pdfjs.image.image_selected",
data: {
alt_text_modal: this._uiManager.useNewAltTextFlow
}
});
__privateMethod(this, _getBitmapFetched, getBitmapFetched_fn).call(this, data);
}
resolve();
}, {
signal
});
input.addEventListener("cancel", () => {
this.remove();
resolve();
}, {
signal
});
}).finally(() => __privateMethod(this, _getBitmapDone, getBitmapDone_fn).call(this)));
input.click();
};
_createCanvas2 = new WeakSet();
createCanvas_fn2 = function() {
const {
div
} = this;
let {
width,
height
} = __privateGet(this, _bitmap);
const [pageWidth, pageHeight] = this.pageDimensions;
const MAX_RATIO = 0.75;
if (this.width) {
width = this.width * pageWidth;
height = this.height * pageHeight;
} else if (width > MAX_RATIO * pageWidth || height > MAX_RATIO * pageHeight) {
const factor = Math.min(MAX_RATIO * pageWidth / width, MAX_RATIO * pageHeight / height);
width *= factor;
height *= factor;
}
const [parentWidth, parentHeight] = this.parentDimensions;
this.setDims(width * parentWidth / pageWidth, height * parentHeight / pageHeight);
this._uiManager.enableWaiting(false);
const canvas = __privateSet(this, _canvas, document.createElement("canvas"));
div.append(canvas);
if (!this._uiManager.useNewAltTextWhenAddingImage || !this._uiManager.useNewAltTextFlow) {
div.hidden = false;
}
__privateMethod(this, _drawBitmap, drawBitmap_fn).call(this, width, height);
__privateMethod(this, _createObserver2, createObserver_fn2).call(this);
if (!__privateGet(this, _hasBeenAddedInUndoStack)) {
this.parent.addUndoableEditor(this);
__privateSet(this, _hasBeenAddedInUndoStack, true);
}
this._reportTelemetry({
action: "inserted_image"
});
if (__privateGet(this, _bitmapFileName)) {
canvas.setAttribute("aria-label", __privateGet(this, _bitmapFileName));
}
};
_setDimensions = new WeakSet();
setDimensions_fn = function(width, height) {
var _a2;
const [parentWidth, parentHeight] = this.parentDimensions;
this.width = width / parentWidth;
this.height = height / parentHeight;
this.setDims(width, height);
if ((_a2 = this._initialOptions) == null ? void 0 : _a2.isCentered) {
this.center();
} else {
this.fixAndSetPosition();
}
this._initialOptions = null;
if (__privateGet(this, _resizeTimeoutId) !== null) {
clearTimeout(__privateGet(this, _resizeTimeoutId));
}
const TIME_TO_WAIT = 200;
__privateSet(this, _resizeTimeoutId, setTimeout(() => {
__privateSet(this, _resizeTimeoutId, null);
__privateMethod(this, _drawBitmap, drawBitmap_fn).call(this, width, height);
}, TIME_TO_WAIT));
};
_scaleBitmap = new WeakSet();
scaleBitmap_fn = function(width, height) {
const {
width: bitmapWidth,
height: bitmapHeight
} = __privateGet(this, _bitmap);
let newWidth = bitmapWidth;
let newHeight = bitmapHeight;
let bitmap = __privateGet(this, _bitmap);
while (newWidth > 2 * width || newHeight > 2 * height) {
const prevWidth = newWidth;
const prevHeight = newHeight;
if (newWidth > 2 * width) {
newWidth = newWidth >= 16384 ? Math.floor(newWidth / 2) - 1 : Math.ceil(newWidth / 2);
}
if (newHeight > 2 * height) {
newHeight = newHeight >= 16384 ? Math.floor(newHeight / 2) - 1 : Math.ceil(newHeight / 2);
}
const offscreen = new OffscreenCanvas(newWidth, newHeight);
const ctx = offscreen.getContext("2d");
ctx.drawImage(bitmap, 0, 0, prevWidth, prevHeight, 0, 0, newWidth, newHeight);
bitmap = offscreen.transferToImageBitmap();
}
return bitmap;
};
_drawBitmap = new WeakSet();
drawBitmap_fn = function(width, height) {
width = Math.ceil(width);
height = Math.ceil(height);
const canvas = __privateGet(this, _canvas);
if (!canvas || canvas.width === width && canvas.height === height) {
return;
}
canvas.width = width;
canvas.height = height;
const bitmap = __privateGet(this, _isSvg) ? __privateGet(this, _bitmap) : __privateMethod(this, _scaleBitmap, scaleBitmap_fn).call(this, width, height);
const ctx = canvas.getContext("2d");
ctx.filter = this._uiManager.hcmFilter;
ctx.drawImage(bitmap, 0, 0, bitmap.width, bitmap.height, 0, 0, width, height);
};
_serializeBitmap = new WeakSet();
serializeBitmap_fn = function(toUrl) {
if (toUrl) {
if (__privateGet(this, _isSvg)) {
const url = this._uiManager.imageManager.getSvgUrl(__privateGet(this, _bitmapId));
if (url) {
return url;
}
}
const canvas = document.createElement("canvas");
({
width: canvas.width,
height: canvas.height
} = __privateGet(this, _bitmap));
const ctx = canvas.getContext("2d");
ctx.drawImage(__privateGet(this, _bitmap), 0, 0);
return canvas.toDataURL();
}
if (__privateGet(this, _isSvg)) {
const [pageWidth, pageHeight] = this.pageDimensions;
const width = Math.round(this.width * pageWidth * PixelsPerInch.PDF_TO_CSS_UNITS);
const height = Math.round(this.height * pageHeight * PixelsPerInch.PDF_TO_CSS_UNITS);
const offscreen = new OffscreenCanvas(width, height);
const ctx = offscreen.getContext("2d");
ctx.drawImage(__privateGet(this, _bitmap), 0, 0, __privateGet(this, _bitmap).width, __privateGet(this, _bitmap).height, 0, 0, width, height);
return offscreen.transferToImageBitmap();
}
return structuredClone(__privateGet(this, _bitmap));
};
_createObserver2 = new WeakSet();
createObserver_fn2 = function() {
if (!this._uiManager._signal) {
return;
}
__privateSet(this, _observer2, new ResizeObserver((entries) => {
const rect = entries[0].contentRect;
if (rect.width && rect.height) {
__privateMethod(this, _setDimensions, setDimensions_fn).call(this, rect.width, rect.height);
}
}));
__privateGet(this, _observer2).observe(this.div);
this._uiManager._signal.addEventListener("abort", () => {
var _a2;
(_a2 = __privateGet(this, _observer2)) == null ? void 0 : _a2.disconnect();
__privateSet(this, _observer2, null);
}, {
once: true
});
};
__publicField(StampEditor, "_type", "stamp");
__publicField(StampEditor, "_editorType", AnnotationEditorType.STAMP);
var _accessibilityManager2, _allowClick, _annotationLayer, _clickAC, _editorFocusTimeoutId, _editors, _hadPointerDown, _isCleaningUp, _isDisabling, _textLayer, _textSelectionAC, _uiManager3, _editorTypes2, _textLayerPointerDown, textLayerPointerDown_fn, _currentEditorType, currentEditorType_get, _createNewEditor, createNewEditor_fn, _getCenterPoint, getCenterPoint_fn, _cleanup, cleanup_fn;
var _AnnotationEditorLayer = class {
constructor({
uiManager,
pageIndex,
div,
accessibilityManager,
annotationLayer,
drawLayer,
textLayer,
viewport,
l10n
}) {
__privateAdd(this, _textLayerPointerDown);
__privateAdd(this, _currentEditorType);
__privateAdd(this, _createNewEditor);
__privateAdd(this, _getCenterPoint);
__privateAdd(this, _cleanup);
__privateAdd(this, _accessibilityManager2, void 0);
__privateAdd(this, _allowClick, false);
__privateAdd(this, _annotationLayer, null);
__privateAdd(this, _clickAC, null);
__privateAdd(this, _editorFocusTimeoutId, null);
__privateAdd(this, _editors, /* @__PURE__ */ new Map());
__privateAdd(this, _hadPointerDown, false);
__privateAdd(this, _isCleaningUp, false);
__privateAdd(this, _isDisabling, false);
__privateAdd(this, _textLayer, null);
__privateAdd(this, _textSelectionAC, null);
__privateAdd(this, _uiManager3, void 0);
const editorTypes = [...__privateGet(_AnnotationEditorLayer, _editorTypes2).values()];
if (!_AnnotationEditorLayer._initialized) {
_AnnotationEditorLayer._initialized = true;
for (const editorType of editorTypes) {
editorType.initialize(l10n, uiManager);
}
}
uiManager.registerEditorTypes(editorTypes);
__privateSet(this, _uiManager3, uiManager);
this.pageIndex = pageIndex;
this.div = div;
__privateSet(this, _accessibilityManager2, accessibilityManager);
__privateSet(this, _annotationLayer, annotationLayer);
this.viewport = viewport;
__privateSet(this, _textLayer, textLayer);
this.drawLayer = drawLayer;
__privateGet(this, _uiManager3).addLayer(this);
}
get isEmpty() {
return __privateGet(this, _editors).size === 0;
}
get isInvisible() {
return this.isEmpty && __privateGet(this, _uiManager3).getMode() === AnnotationEditorType.NONE;
}
updateToolbar(mode) {
__privateGet(this, _uiManager3).updateToolbar(mode);
}
updateMode(mode = __privateGet(this, _uiManager3).getMode()) {
__privateMethod(this, _cleanup, cleanup_fn).call(this);
switch (mode) {
case AnnotationEditorType.NONE:
this.disableTextSelection();
this.togglePointerEvents(false);
this.toggleAnnotationLayerPointerEvents(true);
this.disableClick();
return;
case AnnotationEditorType.INK:
this.addInkEditorIfNeeded(false);
this.disableTextSelection();
this.togglePointerEvents(true);
this.disableClick();
break;
case AnnotationEditorType.HIGHLIGHT:
this.enableTextSelection();
this.togglePointerEvents(false);
this.disableClick();
break;
default:
this.disableTextSelection();
this.togglePointerEvents(true);
this.enableClick();
}
this.toggleAnnotationLayerPointerEvents(false);
const {
classList
} = this.div;
for (const editorType of __privateGet(_AnnotationEditorLayer, _editorTypes2).values()) {
classList.toggle(`${editorType._type}Editing`, mode === editorType._editorType);
}
this.div.hidden = false;
}
hasTextLayer(textLayer) {
var _a2;
return textLayer === ((_a2 = __privateGet(this, _textLayer)) == null ? void 0 : _a2.div);
}
addInkEditorIfNeeded(isCommitting) {
if (__privateGet(this, _uiManager3).getMode() !== AnnotationEditorType.INK) {
return;
}
if (!isCommitting) {
for (const editor2 of __privateGet(this, _editors).values()) {
if (editor2.isEmpty()) {
editor2.setInBackground();
return;
}
}
}
const editor = this.createAndAddNewEditor({
offsetX: 0,
offsetY: 0
}, false);
editor.setInBackground();
}
setEditingState(isEditing) {
__privateGet(this, _uiManager3).setEditingState(isEditing);
}
addCommands(params) {
__privateGet(this, _uiManager3).addCommands(params);
}
toggleDrawing(enabled = false) {
this.div.classList.toggle("drawing", !enabled);
}
togglePointerEvents(enabled = false) {
this.div.classList.toggle("disabled", !enabled);
}
toggleAnnotationLayerPointerEvents(enabled = false) {
var _a2;
(_a2 = __privateGet(this, _annotationLayer)) == null ? void 0 : _a2.div.classList.toggle("disabled", !enabled);
}
enable() {
this.div.tabIndex = 0;
this.togglePointerEvents(true);
const annotationElementIds = /* @__PURE__ */ new Set();
for (const editor of __privateGet(this, _editors).values()) {
editor.enableEditing();
editor.show(true);
if (editor.annotationElementId) {
__privateGet(this, _uiManager3).removeChangedExistingAnnotation(editor);
annotationElementIds.add(editor.annotationElementId);
}
}
if (!__privateGet(this, _annotationLayer)) {
return;
}
const editables = __privateGet(this, _annotationLayer).getEditableAnnotations();
for (const editable of editables) {
editable.hide();
if (__privateGet(this, _uiManager3).isDeletedAnnotationElement(editable.data.id)) {
continue;
}
if (annotationElementIds.has(editable.data.id)) {
continue;
}
const editor = this.deserialize(editable);
if (!editor) {
continue;
}
this.addOrRebuild(editor);
editor.enableEditing();
}
}
disable() {
var _a2;
__privateSet(this, _isDisabling, true);
this.div.tabIndex = -1;
this.togglePointerEvents(false);
const changedAnnotations = /* @__PURE__ */ new Map();
const resetAnnotations = /* @__PURE__ */ new Map();
for (const editor of __privateGet(this, _editors).values()) {
editor.disableEditing();
if (!editor.annotationElementId) {
continue;
}
if (editor.serialize() !== null) {
changedAnnotations.set(editor.annotationElementId, editor);
continue;
} else {
resetAnnotations.set(editor.annotationElementId, editor);
}
(_a2 = this.getEditableAnnotation(editor.annotationElementId)) == null ? void 0 : _a2.show();
editor.remove();
}
if (__privateGet(this, _annotationLayer)) {
const editables = __privateGet(this, _annotationLayer).getEditableAnnotations();
for (const editable of editables) {
const {
id
} = editable.data;
if (__privateGet(this, _uiManager3).isDeletedAnnotationElement(id)) {
continue;
}
let editor = resetAnnotations.get(id);
if (editor) {
editor.resetAnnotationElement(editable);
editor.show(false);
editable.show();
continue;
}
editor = changedAnnotations.get(id);
if (editor) {
__privateGet(this, _uiManager3).addChangedExistingAnnotation(editor);
editor.renderAnnotationElement(editable);
editor.show(false);
}
editable.show();
}
}
__privateMethod(this, _cleanup, cleanup_fn).call(this);
if (this.isEmpty) {
this.div.hidden = true;
}
const {
classList
} = this.div;
for (const editorType of __privateGet(_AnnotationEditorLayer, _editorTypes2).values()) {
classList.remove(`${editorType._type}Editing`);
}
this.disableTextSelection();
this.toggleAnnotationLayerPointerEvents(true);
__privateSet(this, _isDisabling, false);
}
getEditableAnnotation(id) {
var _a2;
return ((_a2 = __privateGet(this, _annotationLayer)) == null ? void 0 : _a2.getEditableAnnotation(id)) || null;
}
setActiveEditor(editor) {
const currentActive = __privateGet(this, _uiManager3).getActive();
if (currentActive === editor) {
return;
}
__privateGet(this, _uiManager3).setActiveEditor(editor);
}
enableTextSelection() {
var _a2;
this.div.tabIndex = -1;
if (((_a2 = __privateGet(this, _textLayer)) == null ? void 0 : _a2.div) && !__privateGet(this, _textSelectionAC)) {
__privateSet(this, _textSelectionAC, new AbortController());
const signal = __privateGet(this, _uiManager3).combinedSignal(__privateGet(this, _textSelectionAC));
__privateGet(this, _textLayer).div.addEventListener("pointerdown", __privateMethod(this, _textLayerPointerDown, textLayerPointerDown_fn).bind(this), {
signal
});
__privateGet(this, _textLayer).div.classList.add("highlighting");
}
}
disableTextSelection() {
var _a2;
this.div.tabIndex = 0;
if (((_a2 = __privateGet(this, _textLayer)) == null ? void 0 : _a2.div) && __privateGet(this, _textSelectionAC)) {
__privateGet(this, _textSelectionAC).abort();
__privateSet(this, _textSelectionAC, null);
__privateGet(this, _textLayer).div.classList.remove("highlighting");
}
}
enableClick() {
if (__privateGet(this, _clickAC)) {
return;
}
__privateSet(this, _clickAC, new AbortController());
const signal = __privateGet(this, _uiManager3).combinedSignal(__privateGet(this, _clickAC));
this.div.addEventListener("pointerdown", this.pointerdown.bind(this), {
signal
});
this.div.addEventListener("pointerup", this.pointerup.bind(this), {
signal
});
}
disableClick() {
var _a2;
(_a2 = __privateGet(this, _clickAC)) == null ? void 0 : _a2.abort();
__privateSet(this, _clickAC, null);
}
attach(editor) {
__privateGet(this, _editors).set(editor.id, editor);
const {
annotationElementId
} = editor;
if (annotationElementId && __privateGet(this, _uiManager3).isDeletedAnnotationElement(annotationElementId)) {
__privateGet(this, _uiManager3).removeDeletedAnnotationElement(editor);
}
}
detach(editor) {
var _a2;
__privateGet(this, _editors).delete(editor.id);
(_a2 = __privateGet(this, _accessibilityManager2)) == null ? void 0 : _a2.removePointerInTextLayer(editor.contentDiv);
if (!__privateGet(this, _isDisabling) && editor.annotationElementId) {
__privateGet(this, _uiManager3).addDeletedAnnotationElement(editor);
}
}
remove(editor) {
this.detach(editor);
__privateGet(this, _uiManager3).removeEditor(editor);
editor.div.remove();
editor.isAttachedToDOM = false;
if (!__privateGet(this, _isCleaningUp)) {
this.addInkEditorIfNeeded(false);
}
}
changeParent(editor) {
var _a2;
if (editor.parent === this) {
return;
}
if (editor.parent && editor.annotationElementId) {
__privateGet(this, _uiManager3).addDeletedAnnotationElement(editor.annotationElementId);
AnnotationEditor.deleteAnnotationElement(editor);
editor.annotationElementId = null;
}
this.attach(editor);
(_a2 = editor.parent) == null ? void 0 : _a2.detach(editor);
editor.setParent(this);
if (editor.div && editor.isAttachedToDOM) {
editor.div.remove();
this.div.append(editor.div);
}
}
add(editor) {
if (editor.parent === this && editor.isAttachedToDOM) {
return;
}
this.changeParent(editor);
__privateGet(this, _uiManager3).addEditor(editor);
this.attach(editor);
if (!editor.isAttachedToDOM) {
const div = editor.render();
this.div.append(div);
editor.isAttachedToDOM = true;
}
editor.fixAndSetPosition();
editor.onceAdded();
__privateGet(this, _uiManager3).addToAnnotationStorage(editor);
editor._reportTelemetry(editor.telemetryInitialData);
}
moveEditorInDOM(editor) {
var _a2;
if (!editor.isAttachedToDOM) {
return;
}
const {
activeElement
} = document;
if (editor.div.contains(activeElement) && !__privateGet(this, _editorFocusTimeoutId)) {
editor._focusEventsAllowed = false;
__privateSet(this, _editorFocusTimeoutId, setTimeout(() => {
__privateSet(this, _editorFocusTimeoutId, null);
if (!editor.div.contains(document.activeElement)) {
editor.div.addEventListener("focusin", () => {
editor._focusEventsAllowed = true;
}, {
once: true,
signal: __privateGet(this, _uiManager3)._signal
});
activeElement.focus();
} else {
editor._focusEventsAllowed = true;
}
}, 0));
}
editor._structTreeParentId = (_a2 = __privateGet(this, _accessibilityManager2)) == null ? void 0 : _a2.moveElementInDOM(this.div, editor.div, editor.contentDiv, true);
}
addOrRebuild(editor) {
if (editor.needsToBeRebuilt()) {
editor.parent || (editor.parent = this);
editor.rebuild();
editor.show();
} else {
this.add(editor);
}
}
addUndoableEditor(editor) {
const cmd = () => editor._uiManager.rebuild(editor);
const undo = () => {
editor.remove();
};
this.addCommands({
cmd,
undo,
mustExec: false
});
}
getNextId() {
return __privateGet(this, _uiManager3).getId();
}
combinedSignal(ac) {
return __privateGet(this, _uiManager3).combinedSignal(ac);
}
canCreateNewEmptyEditor() {
var _a2;
return (_a2 = __privateGet(this, _currentEditorType, currentEditorType_get)) == null ? void 0 : _a2.canCreateNewEmptyEditor();
}
pasteEditor(mode, params) {
__privateGet(this, _uiManager3).updateToolbar(mode);
__privateGet(this, _uiManager3).updateMode(mode);
const {
offsetX,
offsetY
} = __privateMethod(this, _getCenterPoint, getCenterPoint_fn).call(this);
const id = this.getNextId();
const editor = __privateMethod(this, _createNewEditor, createNewEditor_fn).call(this, {
parent: this,
id,
x: offsetX,
y: offsetY,
uiManager: __privateGet(this, _uiManager3),
isCentered: true,
...params
});
if (editor) {
this.add(editor);
}
}
deserialize(data) {
var _a2, _b;
return ((_b = __privateGet(_AnnotationEditorLayer, _editorTypes2).get((_a2 = data.annotationType) != null ? _a2 : data.annotationEditorType)) == null ? void 0 : _b.deserialize(data, this, __privateGet(this, _uiManager3))) || null;
}
createAndAddNewEditor(event, isCentered, data = {}) {
const id = this.getNextId();
const editor = __privateMethod(this, _createNewEditor, createNewEditor_fn).call(this, {
parent: this,
id,
x: event.offsetX,
y: event.offsetY,
uiManager: __privateGet(this, _uiManager3),
isCentered,
...data
});
if (editor) {
this.add(editor);
}
return editor;
}
addNewEditor() {
this.createAndAddNewEditor(__privateMethod(this, _getCenterPoint, getCenterPoint_fn).call(this), true);
}
setSelected(editor) {
__privateGet(this, _uiManager3).setSelected(editor);
}
toggleSelected(editor) {
__privateGet(this, _uiManager3).toggleSelected(editor);
}
isSelected(editor) {
return __privateGet(this, _uiManager3).isSelected(editor);
}
unselect(editor) {
__privateGet(this, _uiManager3).unselect(editor);
}
pointerup(event) {
const {
isMac
} = util_FeatureTest.platform;
if (event.button !== 0 || event.ctrlKey && isMac) {
return;
}
if (event.target !== this.div) {
return;
}
if (!__privateGet(this, _hadPointerDown)) {
return;
}
__privateSet(this, _hadPointerDown, false);
if (!__privateGet(this, _allowClick)) {
__privateSet(this, _allowClick, true);
return;
}
if (__privateGet(this, _uiManager3).getMode() === AnnotationEditorType.STAMP) {
__privateGet(this, _uiManager3).unselectAll();
return;
}
this.createAndAddNewEditor(event, false);
}
pointerdown(event) {
if (__privateGet(this, _uiManager3).getMode() === AnnotationEditorType.HIGHLIGHT) {
this.enableTextSelection();
}
if (__privateGet(this, _hadPointerDown)) {
__privateSet(this, _hadPointerDown, false);
return;
}
const {
isMac
} = util_FeatureTest.platform;
if (event.button !== 0 || event.ctrlKey && isMac) {
return;
}
if (event.target !== this.div) {
return;
}
__privateSet(this, _hadPointerDown, true);
const editor = __privateGet(this, _uiManager3).getActive();
__privateSet(this, _allowClick, !editor || editor.isEmpty());
}
findNewParent(editor, x, y) {
const layer = __privateGet(this, _uiManager3).findParent(x, y);
if (layer === null || layer === this) {
return false;
}
layer.changeParent(editor);
return true;
}
destroy() {
var _a2, _b;
if (((_a2 = __privateGet(this, _uiManager3).getActive()) == null ? void 0 : _a2.parent) === this) {
__privateGet(this, _uiManager3).commitOrRemove();
__privateGet(this, _uiManager3).setActiveEditor(null);
}
if (__privateGet(this, _editorFocusTimeoutId)) {
clearTimeout(__privateGet(this, _editorFocusTimeoutId));
__privateSet(this, _editorFocusTimeoutId, null);
}
for (const editor of __privateGet(this, _editors).values()) {
(_b = __privateGet(this, _accessibilityManager2)) == null ? void 0 : _b.removePointerInTextLayer(editor.contentDiv);
editor.setParent(null);
editor.isAttachedToDOM = false;
editor.div.remove();
}
this.div = null;
__privateGet(this, _editors).clear();
__privateGet(this, _uiManager3).removeLayer(this);
}
render({
viewport
}) {
this.viewport = viewport;
setLayerDimensions(this.div, viewport);
for (const editor of __privateGet(this, _uiManager3).getEditors(this.pageIndex)) {
this.add(editor);
editor.rebuild();
}
this.updateMode();
}
update({
viewport
}) {
__privateGet(this, _uiManager3).commitOrRemove();
__privateMethod(this, _cleanup, cleanup_fn).call(this);
const oldRotation = this.viewport.rotation;
const rotation = viewport.rotation;
this.viewport = viewport;
setLayerDimensions(this.div, {
rotation
});
if (oldRotation !== rotation) {
for (const editor of __privateGet(this, _editors).values()) {
editor.rotate(rotation);
}
}
this.addInkEditorIfNeeded(false);
}
get pageDimensions() {
const {
pageWidth,
pageHeight
} = this.viewport.rawDims;
return [pageWidth, pageHeight];
}
get scale() {
return __privateGet(this, _uiManager3).viewParameters.realScale;
}
};
var AnnotationEditorLayer = _AnnotationEditorLayer;
_accessibilityManager2 = new WeakMap();
_allowClick = new WeakMap();
_annotationLayer = new WeakMap();
_clickAC = new WeakMap();
_editorFocusTimeoutId = new WeakMap();
_editors = new WeakMap();
_hadPointerDown = new WeakMap();
_isCleaningUp = new WeakMap();
_isDisabling = new WeakMap();
_textLayer = new WeakMap();
_textSelectionAC = new WeakMap();
_uiManager3 = new WeakMap();
_editorTypes2 = new WeakMap();
_textLayerPointerDown = new WeakSet();
textLayerPointerDown_fn = function(event) {
__privateGet(this, _uiManager3).unselectAll();
const {
target
} = event;
if (target === __privateGet(this, _textLayer).div || target.classList.contains("endOfContent") && __privateGet(this, _textLayer).div.contains(target)) {
const {
isMac
} = util_FeatureTest.platform;
if (event.button !== 0 || event.ctrlKey && isMac) {
return;
}
__privateGet(this, _uiManager3).showAllEditors("highlight", true, true);
__privateGet(this, _textLayer).div.classList.add("free");
this.toggleDrawing();
HighlightEditor.startHighlighting(this, __privateGet(this, _uiManager3).direction === "ltr", event);
__privateGet(this, _textLayer).div.addEventListener("pointerup", () => {
__privateGet(this, _textLayer).div.classList.remove("free");
this.toggleDrawing(true);
}, {
once: true,
signal: __privateGet(this, _uiManager3)._signal
});
event.preventDefault();
}
};
_currentEditorType = new WeakSet();
currentEditorType_get = function() {
return __privateGet(_AnnotationEditorLayer, _editorTypes2).get(__privateGet(this, _uiManager3).getMode());
};
_createNewEditor = new WeakSet();
createNewEditor_fn = function(params) {
const editorType = __privateGet(this, _currentEditorType, currentEditorType_get);
return editorType ? new editorType.prototype.constructor(params) : null;
};
_getCenterPoint = new WeakSet();
getCenterPoint_fn = function() {
const {
x,
y,
width,
height
} = this.div.getBoundingClientRect();
const tlX = Math.max(0, x);
const tlY = Math.max(0, y);
const brX = Math.min(window.innerWidth, x + width);
const brY = Math.min(window.innerHeight, y + height);
const centerX = (tlX + brX) / 2 - x;
const centerY = (tlY + brY) / 2 - y;
const [offsetX, offsetY] = this.viewport.rotation % 180 === 0 ? [centerX, centerY] : [centerY, centerX];
return {
offsetX,
offsetY
};
};
_cleanup = new WeakSet();
cleanup_fn = function() {
__privateSet(this, _isCleaningUp, true);
for (const editor of __privateGet(this, _editors).values()) {
if (editor.isEmpty()) {
editor.remove();
}
}
__privateSet(this, _isCleaningUp, false);
};
__publicField(AnnotationEditorLayer, "_initialized", false);
__privateAdd(AnnotationEditorLayer, _editorTypes2, new Map([FreeTextEditor, InkEditor, StampEditor, HighlightEditor].map((type) => [type._editorType, type])));
var _parent2, _id5, _mapping, _toUpdate, _setBox, setBox_fn, _createSVG, createSVG_fn, _createClipPath, createClipPath_fn;
var _DrawLayer = class {
constructor({
pageIndex
}) {
__privateAdd(this, _createSVG);
__privateAdd(this, _createClipPath);
__privateAdd(this, _parent2, null);
__privateAdd(this, _id5, 0);
__privateAdd(this, _mapping, /* @__PURE__ */ new Map());
__privateAdd(this, _toUpdate, /* @__PURE__ */ new Map());
this.pageIndex = pageIndex;
}
setParent(parent) {
if (!__privateGet(this, _parent2)) {
__privateSet(this, _parent2, parent);
return;
}
if (__privateGet(this, _parent2) !== parent) {
if (__privateGet(this, _mapping).size > 0) {
for (const root of __privateGet(this, _mapping).values()) {
root.remove();
parent.append(root);
}
}
__privateSet(this, _parent2, parent);
}
}
static get _svgFactory() {
return shadow(this, "_svgFactory", new DOMSVGFactory());
}
highlight(outlines, color2, opacity, isPathUpdatable = false) {
const id = __privateWrapper(this, _id5)._++;
const root = __privateMethod(this, _createSVG, createSVG_fn).call(this, outlines.box);
root.classList.add("highlight");
if (outlines.free) {
root.classList.add("free");
}
const defs = _DrawLayer._svgFactory.createElement("defs");
root.append(defs);
const path = _DrawLayer._svgFactory.createElement("path");
defs.append(path);
const pathId = `path_p${this.pageIndex}_${id}`;
path.setAttribute("id", pathId);
path.setAttribute("d", outlines.toSVGPath());
if (isPathUpdatable) {
__privateGet(this, _toUpdate).set(id, path);
}
const clipPathId = __privateMethod(this, _createClipPath, createClipPath_fn).call(this, defs, pathId);
const use = _DrawLayer._svgFactory.createElement("use");
root.append(use);
root.setAttribute("fill", color2);
root.setAttribute("fill-opacity", opacity);
use.setAttribute("href", `#${pathId}`);
__privateGet(this, _mapping).set(id, root);
return {
id,
clipPathId: `url(#${clipPathId})`
};
}
highlightOutline(outlines) {
const id = __privateWrapper(this, _id5)._++;
const root = __privateMethod(this, _createSVG, createSVG_fn).call(this, outlines.box);
root.classList.add("highlightOutline");
const defs = _DrawLayer._svgFactory.createElement("defs");
root.append(defs);
const path = _DrawLayer._svgFactory.createElement("path");
defs.append(path);
const pathId = `path_p${this.pageIndex}_${id}`;
path.setAttribute("id", pathId);
path.setAttribute("d", outlines.toSVGPath());
path.setAttribute("vector-effect", "non-scaling-stroke");
let maskId;
if (outlines.free) {
root.classList.add("free");
const mask = _DrawLayer._svgFactory.createElement("mask");
defs.append(mask);
maskId = `mask_p${this.pageIndex}_${id}`;
mask.setAttribute("id", maskId);
mask.setAttribute("maskUnits", "objectBoundingBox");
const rect = _DrawLayer._svgFactory.createElement("rect");
mask.append(rect);
rect.setAttribute("width", "1");
rect.setAttribute("height", "1");
rect.setAttribute("fill", "white");
const use = _DrawLayer._svgFactory.createElement("use");
mask.append(use);
use.setAttribute("href", `#${pathId}`);
use.setAttribute("stroke", "none");
use.setAttribute("fill", "black");
use.setAttribute("fill-rule", "nonzero");
use.classList.add("mask");
}
const use1 = _DrawLayer._svgFactory.createElement("use");
root.append(use1);
use1.setAttribute("href", `#${pathId}`);
if (maskId) {
use1.setAttribute("mask", `url(#${maskId})`);
}
const use2 = use1.cloneNode();
root.append(use2);
use1.classList.add("mainOutline");
use2.classList.add("secondaryOutline");
__privateGet(this, _mapping).set(id, root);
return id;
}
finalizeLine(id, line) {
const path = __privateGet(this, _toUpdate).get(id);
__privateGet(this, _toUpdate).delete(id);
this.updateBox(id, line.box);
path.setAttribute("d", line.toSVGPath());
}
updateLine(id, line) {
const root = __privateGet(this, _mapping).get(id);
const defs = root.firstChild;
const path = defs.firstChild;
path.setAttribute("d", line.toSVGPath());
}
removeFreeHighlight(id) {
this.remove(id);
__privateGet(this, _toUpdate).delete(id);
}
updatePath(id, line) {
__privateGet(this, _toUpdate).get(id).setAttribute("d", line.toSVGPath());
}
updateBox(id, box) {
var _a2;
__privateMethod(_a2 = _DrawLayer, _setBox, setBox_fn).call(_a2, __privateGet(this, _mapping).get(id), box);
}
show(id, visible) {
__privateGet(this, _mapping).get(id).classList.toggle("hidden", !visible);
}
rotate(id, angle) {
__privateGet(this, _mapping).get(id).setAttribute("data-main-rotation", angle);
}
changeColor(id, color2) {
__privateGet(this, _mapping).get(id).setAttribute("fill", color2);
}
changeOpacity(id, opacity) {
__privateGet(this, _mapping).get(id).setAttribute("fill-opacity", opacity);
}
addClass(id, className) {
__privateGet(this, _mapping).get(id).classList.add(className);
}
removeClass(id, className) {
__privateGet(this, _mapping).get(id).classList.remove(className);
}
remove(id) {
if (__privateGet(this, _parent2) === null) {
return;
}
__privateGet(this, _mapping).get(id).remove();
__privateGet(this, _mapping).delete(id);
}
destroy() {
__privateSet(this, _parent2, null);
for (const root of __privateGet(this, _mapping).values()) {
root.remove();
}
__privateGet(this, _mapping).clear();
}
};
var DrawLayer = _DrawLayer;
_parent2 = new WeakMap();
_id5 = new WeakMap();
_mapping = new WeakMap();
_toUpdate = new WeakMap();
_setBox = new WeakSet();
setBox_fn = function(element, {
x = 0,
y = 0,
width = 1,
height = 1
} = {}) {
const {
style
} = element;
style.top = `${100 * y}%`;
style.left = `${100 * x}%`;
style.width = `${100 * width}%`;
style.height = `${100 * height}%`;
};
_createSVG = new WeakSet();
createSVG_fn = function(box) {
var _a2;
const svg = _DrawLayer._svgFactory.create(1, 1, true);
__privateGet(this, _parent2).append(svg);
svg.setAttribute("aria-hidden", true);
__privateMethod(_a2 = _DrawLayer, _setBox, setBox_fn).call(_a2, svg, box);
return svg;
};
_createClipPath = new WeakSet();
createClipPath_fn = function(defs, pathId) {
const clipPath = _DrawLayer._svgFactory.createElement("clipPath");
defs.append(clipPath);
const clipPathId = `clip_${pathId}`;
clipPath.setAttribute("id", clipPathId);
clipPath.setAttribute("clipPathUnits", "objectBoundingBox");
const clipPathUse = _DrawLayer._svgFactory.createElement("use");
clipPath.append(clipPathUse);
clipPathUse.setAttribute("href", `#${pathId}`);
clipPathUse.classList.add("clip");
return clipPathId;
};
__privateAdd(DrawLayer, _setBox);
var __webpack_exports__AbortException = __webpack_exports__.AbortException;
var __webpack_exports__AnnotationEditorLayer = __webpack_exports__.AnnotationEditorLayer;
var __webpack_exports__AnnotationEditorParamsType = __webpack_exports__.AnnotationEditorParamsType;
var __webpack_exports__AnnotationEditorType = __webpack_exports__.AnnotationEditorType;
var __webpack_exports__AnnotationEditorUIManager = __webpack_exports__.AnnotationEditorUIManager;
var __webpack_exports__AnnotationLayer = __webpack_exports__.AnnotationLayer;
var __webpack_exports__AnnotationMode = __webpack_exports__.AnnotationMode;
var __webpack_exports__CMapCompressionType = __webpack_exports__.CMapCompressionType;
var __webpack_exports__ColorPicker = __webpack_exports__.ColorPicker;
var __webpack_exports__DOMSVGFactory = __webpack_exports__.DOMSVGFactory;
var __webpack_exports__DrawLayer = __webpack_exports__.DrawLayer;
var __webpack_exports__FeatureTest = __webpack_exports__.FeatureTest;
var __webpack_exports__GlobalWorkerOptions = __webpack_exports__.GlobalWorkerOptions;
var __webpack_exports__ImageKind = __webpack_exports__.ImageKind;
var __webpack_exports__InvalidPDFException = __webpack_exports__.InvalidPDFException;
var __webpack_exports__MissingPDFException = __webpack_exports__.MissingPDFException;
var __webpack_exports__OPS = __webpack_exports__.OPS;
var __webpack_exports__PDFDataRangeTransport = __webpack_exports__.PDFDataRangeTransport;
var __webpack_exports__PDFDateString = __webpack_exports__.PDFDateString;
var __webpack_exports__PDFWorker = __webpack_exports__.PDFWorker;
var __webpack_exports__PasswordResponses = __webpack_exports__.PasswordResponses;
var __webpack_exports__PermissionFlag = __webpack_exports__.PermissionFlag;
var __webpack_exports__PixelsPerInch = __webpack_exports__.PixelsPerInch;
var __webpack_exports__RenderingCancelledException = __webpack_exports__.RenderingCancelledException;
var __webpack_exports__TextLayer = __webpack_exports__.TextLayer;
var __webpack_exports__UnexpectedResponseException = __webpack_exports__.UnexpectedResponseException;
var __webpack_exports__Util = __webpack_exports__.Util;
var __webpack_exports__VerbosityLevel = __webpack_exports__.VerbosityLevel;
var __webpack_exports__XfaLayer = __webpack_exports__.XfaLayer;
var __webpack_exports__build = __webpack_exports__.build;
var __webpack_exports__createValidAbsoluteUrl = __webpack_exports__.createValidAbsoluteUrl;
var __webpack_exports__fetchData = __webpack_exports__.fetchData;
var __webpack_exports__getDocument = __webpack_exports__.getDocument;
var __webpack_exports__getFilenameFromUrl = __webpack_exports__.getFilenameFromUrl;
var __webpack_exports__getPdfFilenameFromUrl = __webpack_exports__.getPdfFilenameFromUrl;
var __webpack_exports__getXfaPageViewport = __webpack_exports__.getXfaPageViewport;
var __webpack_exports__isDataScheme = __webpack_exports__.isDataScheme;
var __webpack_exports__isPdfFile = __webpack_exports__.isPdfFile;
var __webpack_exports__noContextMenu = __webpack_exports__.noContextMenu;
var __webpack_exports__normalizeUnicode = __webpack_exports__.normalizeUnicode;
var __webpack_exports__setLayerDimensions = __webpack_exports__.setLayerDimensions;
var __webpack_exports__shadow = __webpack_exports__.shadow;
var __webpack_exports__version = __webpack_exports__.version;
// inline-worker:__inline-worker
function inlineWorker(scriptText) {
let blob = new Blob([scriptText], { type: "text/javascript" });
let url = URL.createObjectURL(blob);
let worker = new Worker(url);
URL.revokeObjectURL(url);
return worker;
}
// src/processors/pdf.worker.js
function Worker2() {
return inlineWorker('var Rn=Object.defineProperty;var xu=Object.getOwnPropertyDescriptor;var mu=Object.getOwnPropertyNames;var pu=Object.prototype.hasOwnProperty;var wu=(e,A,t)=>A in e?Rn(e,A,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[A]=t;var yu=(e,A)=>{for(var t in A)Rn(e,t,{get:A[t],enumerable:!0})},bu=(e,A,t,i)=>{if(A&&typeof A=="object"||typeof A=="function")for(let s of mu(A))!pu.call(e,s)&&s!==t&&Rn(e,s,{get:()=>A[s],enumerable:!(i=xu(A,s))||i.enumerable});return e};var Du=e=>bu(Rn({},"__esModule",{value:!0}),e);var et=(e,A,t)=>(wu(e,typeof A!="symbol"?A+"":A,t),t),lo=(e,A,t)=>{if(!A.has(e))throw TypeError("Cannot "+t)};var ne=(e,A,t)=>(lo(e,A,"read from private field"),t?t.call(e):A.get(e)),HA=(e,A,t)=>{if(A.has(e))throw TypeError("Cannot add the same private member more than once");A instanceof WeakSet?A.add(e):A.set(e,t)},_s=(e,A,t,i)=>(lo(e,A,"write to private field"),i?i.call(e,t):A.set(e,t),t);var mA=(e,A,t)=>(lo(e,A,"access private method"),t);var Dx={};yu(Dx,{WorkerMessageHandler:()=>bx});module.exports=Du(Dx);var Ba={};Ba.d=(e,A)=>{for(var t in A)Ba.o(A,t)&&!Ba.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:A[t]})};Ba.o=(e,A)=>Object.prototype.hasOwnProperty.call(e,A);var qE=globalThis.pdfjsWorker={};Ba.d(qE,{WorkerMessageHandler:()=>H0});var ku=typeof process=="object"&&process+""=="[object process]"&&!process.versions.nw&&!(process.versions.electron&&process.type&&process.type!=="browser"),Wt=[1,0,0,1,0,0],E0=[.001,0,0,.001,0,0],Su=1e7,Qi=1.35,Cr=.35,R1=Cr/Qi,st={ANY:1,DISPLAY:2,PRINT:4,SAVE:8,ANNOTATIONS_FORMS:16,ANNOTATIONS_STORAGE:32,ANNOTATIONS_DISABLE:64,IS_EDITING:128,OPLIST:256};var TE="pdfjs_internal_editor_",bi={DISABLE:-1,NONE:0,FREETEXT:3,HIGHLIGHT:9,STAMP:13,INK:15};var N1={PRINT:4,MODIFY_CONTENTS:8,COPY:16,MODIFY_ANNOTATIONS:32,FILL_INTERACTIVE_FORMS:256,COPY_FOR_ACCESSIBILITY:512,ASSEMBLE:1024,PRINT_HIGH_QUALITY:2048},PE={FILL:0,STROKE:1,FILL_STROKE:2,INVISIBLE:3,FILL_ADD_TO_PATH:4,STROKE_ADD_TO_PATH:5,FILL_STROKE_ADD_TO_PATH:6,ADD_TO_PATH:7,FILL_STROKE_MASK:3,ADD_TO_PATH_FLAG:4},Ke={GRAYSCALE_1BPP:1,RGB_24BPP:2,RGBA_32BPP:3},Le={TEXT:1,LINK:2,FREETEXT:3,LINE:4,SQUARE:5,CIRCLE:6,POLYGON:7,POLYLINE:8,HIGHLIGHT:9,UNDERLINE:10,SQUIGGLY:11,STRIKEOUT:12,STAMP:13,CARET:14,INK:15,POPUP:16,FILEATTACHMENT:17,SOUND:18,MOVIE:19,WIDGET:20,SCREEN:21,PRINTERMARK:22,TRAPNET:23,WATERMARK:24,THREED:25,REDACT:26},Ho={GROUP:"Group",REPLY:"R"},it={INVISIBLE:1,HIDDEN:2,PRINT:4,NOZOOM:8,NOROTATE:16,NOVIEW:32,READONLY:64,LOCKED:128,TOGGLENOVIEW:256,LOCKEDCONTENTS:512},Te={READONLY:1,REQUIRED:2,NOEXPORT:4,MULTILINE:4096,PASSWORD:8192,NOTOGGLETOOFF:16384,RADIO:32768,PUSHBUTTON:65536,COMBO:131072,EDIT:262144,SORT:524288,FILESELECT:1048576,MULTISELECT:2097152,DONOTSPELLCHECK:4194304,DONOTSCROLL:8388608,COMB:16777216,RICHTEXT:33554432,RADIOSINUNISON:33554432,COMMITONSELCHANGE:67108864},Y0={SOLID:1,DASHED:2,BEVELED:3,INSET:4,UNDERLINE:5},WE={E:"Mouse Enter",X:"Mouse Exit",D:"Mouse Down",U:"Mouse Up",Fo:"Focus",Bl:"Blur",PO:"PageOpen",PC:"PageClose",PV:"PageVisible",PI:"PageInvisible",K:"Keystroke",F:"Format",V:"Validate",C:"Calculate"},Fu={WC:"WillClose",WS:"WillSave",DS:"DidSave",WP:"WillPrint",DP:"DidPrint"},Ru={O:"PageOpen",C:"PageClose"},Da={ERRORS:0,WARNINGS:1,INFOS:5},Br={NONE:0,BINARY:1},y={dependency:1,setLineWidth:2,setLineCap:3,setLineJoin:4,setMiterLimit:5,setDash:6,setRenderingIntent:7,setFlatness:8,setGState:9,save:10,restore:11,transform:12,moveTo:13,lineTo:14,curveTo:15,curveTo2:16,curveTo3:17,closePath:18,rectangle:19,stroke:20,closeStroke:21,fill:22,eoFill:23,fillStroke:24,eoFillStroke:25,closeFillStroke:26,closeEOFillStroke:27,endPath:28,clip:29,eoClip:30,beginText:31,endText:32,setCharSpacing:33,setWordSpacing:34,setHScale:35,setLeading:36,setFont:37,setTextRenderingMode:38,setTextRise:39,moveText:40,setLeadingMoveText:41,setTextMatrix:42,nextLine:43,showText:44,showSpacedText:45,nextLineShowText:46,nextLineSetSpacingShowText:47,setCharWidth:48,setCharWidthAndBounds:49,setStrokeColorSpace:50,setFillColorSpace:51,setStrokeColor:52,setStrokeColorN:53,setFillColor:54,setFillColorN:
}
// src/processors/pdf.ts
var isWorkerInitialized = false;
function initializeWorker() {
if (!isWorkerInitialized) {
__webpack_exports__GlobalWorkerOptions.workerPort = new Worker2();
isWorkerInitialized = true;
}
}
async function extractTextFromPDF(arrayBuffer) {
logger.time("Extracting text from PDF");
try {
initializeWorker();
const pdf = await __webpack_exports__getDocument({ data: arrayBuffer }).promise;
const numPages = pdf.numPages;
const textContents = await Promise.all(
Array.from({ length: numPages }, (_, i) => getPageText(pdf, i + 1))
);
const fullText = textContents.join("\n\n");
logger.table("Extracted text from PDF", {
textLength: fullText.length
});
logger.timeEnd("Extracting text from PDF");
return fullText;
} catch (error) {
logger.error("Error extracting text from PDF", { error });
throw new Error(`Failed to extract text from PDF: ${error.message}`);
}
}
async function getPageText(pdf, pageNum) {
const page = await pdf.getPage(pageNum);
const content = await page.getTextContent();
let lastY;
const textItems = [];
for (const item of content.items) {
if ("str" in item) {
if (lastY === item.transform[5] || !lastY) {
textItems.push(item.str);
} else {
textItems.push(`
${item.str}`);
}
lastY = item.transform[5];
}
}
return textItems.join("") + "\n\n";
}
// node_modules/idb/build/index.js
var instanceOfAny = (object, constructors) => constructors.some((c) => object instanceof c);
var idbProxyableTypes;
var cursorAdvanceMethods;
function getIdbProxyableTypes() {
return idbProxyableTypes || (idbProxyableTypes = [
IDBDatabase,
IDBObjectStore,
IDBIndex,
IDBCursor,
IDBTransaction
]);
}
function getCursorAdvanceMethods() {
return cursorAdvanceMethods || (cursorAdvanceMethods = [
IDBCursor.prototype.advance,
IDBCursor.prototype.continue,
IDBCursor.prototype.continuePrimaryKey
]);
}
var transactionDoneMap = /* @__PURE__ */ new WeakMap();
var transformCache = /* @__PURE__ */ new WeakMap();
var reverseTransformCache = /* @__PURE__ */ new WeakMap();
function promisifyRequest(request) {
const promise = new Promise((resolve, reject) => {
const unlisten = () => {
request.removeEventListener("success", success);
request.removeEventListener("error", error);
};
const success = () => {
resolve(wrap2(request.result));
unlisten();
};
const error = () => {
reject(request.error);
unlisten();
};
request.addEventListener("success", success);
request.addEventListener("error", error);
});
reverseTransformCache.set(promise, request);
return promise;
}
function cacheDonePromiseForTransaction(tx) {
if (transactionDoneMap.has(tx))
return;
const done = new Promise((resolve, reject) => {
const unlisten = () => {
tx.removeEventListener("complete", complete);
tx.removeEventListener("error", error);
tx.removeEventListener("abort", error);
};
const complete = () => {
resolve();
unlisten();
};
const error = () => {
reject(tx.error || new DOMException("AbortError", "AbortError"));
unlisten();
};
tx.addEventListener("complete", complete);
tx.addEventListener("error", error);
tx.addEventListener("abort", error);
});
transactionDoneMap.set(tx, done);
}
var idbProxyTraps = {
get(target, prop, receiver) {
if (target instanceof IDBTransaction) {
if (prop === "done")
return transactionDoneMap.get(target);
if (prop === "store") {
return receiver.objectStoreNames[1] ? void 0 : receiver.objectStore(receiver.objectStoreNames[0]);
}
}
return wrap2(target[prop]);
},
set(target, prop, value) {
target[prop] = value;
return true;
},
has(target, prop) {
if (target instanceof IDBTransaction && (prop === "done" || prop === "store")) {
return true;
}
return prop in target;
}
};
function replaceTraps(callback) {
idbProxyTraps = callback(idbProxyTraps);
}
function wrapFunction(func) {
if (getCursorAdvanceMethods().includes(func)) {
return function(...args) {
func.apply(unwrap(this), args);
return wrap2(this.request);
};
}
return function(...args) {
return wrap2(func.apply(unwrap(this), args));
};
}
function transformCachableValue(value) {
if (typeof value === "function")
return wrapFunction(value);
if (value instanceof IDBTransaction)
cacheDonePromiseForTransaction(value);
if (instanceOfAny(value, getIdbProxyableTypes()))
return new Proxy(value, idbProxyTraps);
return value;
}
function wrap2(value) {
if (value instanceof IDBRequest)
return promisifyRequest(value);
if (transformCache.has(value))
return transformCache.get(value);
const newValue = transformCachableValue(value);
if (newValue !== value) {
transformCache.set(value, newValue);
reverseTransformCache.set(newValue, value);
}
return newValue;
}
var unwrap = (value) => reverseTransformCache.get(value);
function openDB(name, version2, { blocked, upgrade, blocking, terminated } = {}) {
const request = indexedDB.open(name, version2);
const openPromise = wrap2(request);
if (upgrade) {
request.addEventListener("upgradeneeded", (event) => {
upgrade(wrap2(request.result), event.oldVersion, event.newVersion, wrap2(request.transaction), event);
});
}
if (blocked) {
request.addEventListener("blocked", (event) => blocked(
// Casting due to https://github.com/microsoft/TypeScript-DOM-lib-generator/pull/1405
event.oldVersion,
event.newVersion,
event
));
}
openPromise.then((db) => {
if (terminated)
db.addEventListener("close", () => terminated());
if (blocking) {
db.addEventListener("versionchange", (event) => blocking(event.oldVersion, event.newVersion, event));
}
}).catch(() => {
});
return openPromise;
}
var readMethods = ["get", "getKey", "getAll", "getAllKeys", "count"];
var writeMethods = ["put", "add", "delete", "clear"];
var cachedMethods = /* @__PURE__ */ new Map();
function getMethod(target, prop) {
if (!(target instanceof IDBDatabase && !(prop in target) && typeof prop === "string")) {
return;
}
if (cachedMethods.get(prop))
return cachedMethods.get(prop);
const targetFuncName = prop.replace(/FromIndex$/, "");
const useIndex = prop !== targetFuncName;
const isWrite = writeMethods.includes(targetFuncName);
if (
// Bail if the target doesn't exist on the target. Eg, getAll isn't in Edge.
!(targetFuncName in (useIndex ? IDBIndex : IDBObjectStore).prototype) || !(isWrite || readMethods.includes(targetFuncName))
) {
return;
}
const method = async function(storeName, ...args) {
const tx = this.transaction(storeName, isWrite ? "readwrite" : "readonly");
let target2 = tx.store;
if (useIndex)
target2 = target2.index(args.shift());
return (await Promise.all([
target2[targetFuncName](...args),
isWrite && tx.done
]))[0];
};
cachedMethods.set(prop, method);
return method;
}
replaceTraps((oldTraps) => ({
...oldTraps,
get: (target, prop, receiver) => getMethod(target, prop) || oldTraps.get(target, prop, receiver),
has: (target, prop) => !!getMethod(target, prop) || oldTraps.has(target, prop)
}));
var advanceMethodProps = ["continue", "continuePrimaryKey", "advance"];
var methodMap = {};
var advanceResults = /* @__PURE__ */ new WeakMap();
var ittrProxiedCursorToOriginalProxy = /* @__PURE__ */ new WeakMap();
var cursorIteratorTraps = {
get(target, prop) {
if (!advanceMethodProps.includes(prop))
return target[prop];
let cachedFunc = methodMap[prop];
if (!cachedFunc) {
cachedFunc = methodMap[prop] = function(...args) {
advanceResults.set(this, ittrProxiedCursorToOriginalProxy.get(this)[prop](...args));
};
}
return cachedFunc;
}
};
async function* iterate(...args) {
let cursor = this;
if (!(cursor instanceof IDBCursor)) {
cursor = await cursor.openCursor(...args);
}
if (!cursor)
return;
cursor = cursor;
const proxiedCursor = new Proxy(cursor, cursorIteratorTraps);
ittrProxiedCursorToOriginalProxy.set(proxiedCursor, cursor);
reverseTransformCache.set(proxiedCursor, unwrap(cursor));
while (cursor) {
yield proxiedCursor;
cursor = await (advanceResults.get(proxiedCursor) || cursor.continue());
advanceResults.delete(proxiedCursor);
}
}
function isIteratorProp(target, prop) {
return prop === Symbol.asyncIterator && instanceOfAny(target, [IDBIndex, IDBObjectStore, IDBCursor]) || prop === "iterate" && instanceOfAny(target, [IDBIndex, IDBObjectStore]);
}
replaceTraps((oldTraps) => ({
...oldTraps,
get(target, prop, receiver) {
if (isIteratorProp(target, prop))
return iterate;
return oldTraps.get(target, prop, receiver);
},
has(target, prop) {
return isIteratorProp(target, prop) || oldTraps.has(target, prop);
}
}));
// src/indexedDB.ts
var FileCache = class {
constructor() {
this.db = null;
this.vaultId = "";
}
async init(vaultId) {
this.vaultId = vaultId;
const dbName = `LocalGPTCache/${this.vaultId}`;
this.db = await openDB(dbName, 2, {
upgrade(db, oldVersion, newVersion) {
if (oldVersion < 1) {
db.createObjectStore("embeddings");
}
if (oldVersion < 2) {
db.createObjectStore("content");
}
}
});
}
async getEmbeddings(key) {
if (!this.db)
throw new Error("Database not initialized");
return this.db.get("embeddings", key);
}
async setEmbeddings(key, value) {
if (!this.db)
throw new Error("Database not initialized");
await this.db.put("embeddings", value, key);
}
async getContent(key) {
if (!this.db)
throw new Error("Database not initialized");
return this.db.get("content", key);
}
async setContent(key, value) {
if (!this.db)
throw new Error("Database not initialized");
await this.db.put("content", value, key);
}
async clearEmbeddings() {
if (!this.db)
throw new Error("Database not initialized");
await this.db.clear("embeddings");
}
async clearContent() {
if (!this.db)
throw new Error("Database not initialized");
await this.db.clear("content");
}
async clearAll() {
if (!this.db)
throw new Error("Database not initialized");
await this.db.clear("embeddings");
await this.db.clear("content");
}
};
var fileCache = new FileCache();
// src/rag.ts
var MAX_DEPTH = 10;
async function startProcessing(linkedFiles, vault, metadataCache, activeFile) {
logger.info("Starting RAG processing");
const processedDocs = /* @__PURE__ */ new Map();
await Promise.all(
linkedFiles.map(async (file) => {
const context = {
vault,
metadataCache,
currentDocumentPath: file.path,
activeFile
};
await processDocumentForRAG(file, context, processedDocs, 0, false);
})
);
return processedDocs;
}
async function getFileContent(file, vault) {
switch (file.extension) {
case "pdf":
const cachedContent = await fileCache.getContent(file.path);
if (cachedContent && cachedContent.mtime === file.stat.mtime) {
return cachedContent.content;
}
const arrayBuffer = await vault.readBinary(file);
const pdfContent = await extractTextFromPDF(arrayBuffer);
await fileCache.setContent(file.path, {
mtime: file.stat.mtime,
content: pdfContent
});
return pdfContent;
case "md":
default:
return await vault.cachedRead(file);
}
}
async function processDocumentForRAG(file, context, processedDocs, depth, isBacklink) {
var _a2;
logger.table("Processing document for RAG", {
filePath: file.path,
depth,
isBacklink
});
if (depth > MAX_DEPTH || processedDocs.has(file.path) || file.path === context.activeFile.path) {
return processedDocs;
}
try {
let content = "";
const isMdFile = file.extension === "md";
if (isMdFile) {
content = await getFileContent(file, context.vault);
} else {
const cachedData = await fileCache.getEmbeddings(file.path);
if (!((_a2 = cachedData == null ? void 0 : cachedData.chunks) == null ? void 0 : _a2.length) || cachedData.mtime !== file.stat.mtime) {
content = await getFileContent(file, context.vault);
}
}
const newDoc = new Document({
pageContent: content,
metadata: {
source: file.path,
basename: file.basename,
stat: file.stat,
depth,
isBacklink
}
});
processedDocs.set(file.path, newDoc);
if (isMdFile && !isBacklink) {
const linkedFiles = getLinkedFiles(
content,
context.vault,
context.metadataCache,
file.path
);
for (const linkedFile of linkedFiles) {
processedDocs = await processDocumentForRAG(
linkedFile,
context,
processedDocs,
depth + 1,
false
);
}
const backlinkFiles = getBacklinkFiles(
file,
context,
processedDocs
);
for (const backlinkFile of backlinkFiles) {
processedDocs = await processDocumentForRAG(
backlinkFile,
context,
processedDocs,
depth,
true
);
}
}
} catch (error) {
console.error(`Error processing document ${file.path}:`, error);
}
return processedDocs;
}
function getLinkedFiles(content, vault, metadataCache, currentFilePath) {
const linkRegex = /\[\[([^\]|#]+)(?:#[^\]|]+)?(?:\|[^\]]+)?\]\]/g;
const matches = content.matchAll(linkRegex);
return Array.from(matches, (match) => match[1]).map((linkText) => {
const linkPath = metadataCache.getFirstLinkpathDest(
linkText,
currentFilePath
);
return linkPath ? vault.getAbstractFileByPath(linkPath.path) : null;
}).filter(
(file) => file instanceof import_obsidian4.TFile && (file.extension === "md" || file.extension === "pdf")
);
}
function getBacklinkFiles(file, context, processedDocs) {
const resolvedLinks = context.metadataCache.resolvedLinks;
const backlinkPaths = Object.entries(resolvedLinks).filter(
([sourcePath, links]) => links[file.path] && !processedDocs.has(sourcePath)
).map(([sourcePath]) => sourcePath);
return backlinkPaths.map((path) => context.vault.getAbstractFileByPath(path)).filter(
(backlinkFile) => backlinkFile instanceof import_obsidian4.TFile && backlinkFile.extension === "md"
);
}
async function createVectorStore(documents, plugin, currentDocumentPath, aiProvider, addTotalProgressSteps, updateCompletedSteps) {
var _a2, _b;
const embedder = new CustomEmbeddings({
aiProvider,
updateCompletedSteps
});
const vectorStore = new MemoryVectorStore(embedder);
const chunksToEmbed = [];
const embeddingsByDocument = {};
for (const doc of documents) {
if (doc.metadata.source !== currentDocumentPath) {
const cachedData = await fileCache.getEmbeddings(
doc.metadata.source
);
embeddingsByDocument[doc.metadata.source] = embeddingsByDocument[doc.metadata.source] || [];
if ((_a2 = cachedData == null ? void 0 : cachedData.chunks) == null ? void 0 : _a2.length) {
if (cachedData.mtime === doc.metadata.stat.mtime) {
logger.debug("Using cached embedding", doc.metadata.source);
cachedData == null ? void 0 : cachedData.chunks.forEach((chunk) => {
const chunkDoc = new Document({
pageContent: chunk.content,
metadata: { ...doc.metadata }
});
embeddingsByDocument[doc.metadata.source].push({
doc: chunkDoc,
embedding: chunk.embedding
});
});
continue;
} else {
logger.warn(
"Cached embedding is outdated",
doc.metadata.source
);
}
}
const content = preprocessContent(doc.pageContent);
const chunks = splitContent(content);
for (const chunk of chunks) {
logger.table("Chunk", chunk, chunk.length);
const chunkDoc = new Document({
pageContent: chunk,
metadata: { ...doc.metadata }
});
chunksToEmbed.push({ chunk, doc: chunkDoc });
}
}
}
if (chunksToEmbed.length > 0) {
try {
addTotalProgressSteps(chunksToEmbed.length + 1);
const embeddings = await embedder.embedDocuments(
chunksToEmbed.map((item) => item.chunk)
);
for (const embedding of embeddings) {
const i = embeddings.indexOf(embedding);
const { doc } = chunksToEmbed[i];
embeddingsByDocument[doc.metadata.source] = embeddingsByDocument[doc.metadata.source] || [];
embeddingsByDocument[doc.metadata.source].push({
doc,
embedding
});
}
} catch (error) {
if (!((_b = aiProvider.abortController) == null ? void 0 : _b.signal.aborted)) {
console.error(`Error creating embeddings:`, error);
}
}
}
for (const [source, documentWithEmbeddings] of Object.entries(
embeddingsByDocument
)) {
for (const { doc, embedding } of documentWithEmbeddings) {
await vectorStore.addVectors([embedding], [doc]);
}
await fileCache.setEmbeddings(source, {
mtime: documentWithEmbeddings[0].doc.metadata.stat.mtime,
chunks: documentWithEmbeddings.map(({ doc, embedding }) => ({
content: doc.pageContent,
embedding
}))
});
}
return vectorStore;
}
async function queryVectorStore(query, vectorStore) {
logger.debug("Querying vector store", query);
const MAX_SEARCH_RESULTS = 10;
const HIGH_SCORE_THRESHOLD = 0.51;
const MAX_LOW_SCORE_RESULTS = 5;
const MAX_CONTEXT_LENGTH = 1e4;
logger.time("Querying vector store timer");
const results = await vectorStore.similaritySearchWithScore(
query,
MAX_SEARCH_RESULTS
);
logger.timeEnd("Querying vector store timer");
let totalLength = 0;
const groupedResults = results.reduce(
(acc, [doc, score]) => {
const basename = doc.metadata.basename || "Unknown";
if (!acc[basename]) {
acc[basename] = {
highScore: [],
lowScore: [],
createdTime: getCreatedTime(doc)
};
}
const content = doc.pageContent;
if (totalLength + content.length <= MAX_CONTEXT_LENGTH) {
if (score >= HIGH_SCORE_THRESHOLD) {
acc[basename].highScore.push(content);
} else {
acc[basename].lowScore.push(content);
}
totalLength += content.length;
}
return acc;
},
{}
);
let totalLowScoreCount = 0;
const finalResults = Object.entries(groupedResults).sort(([, a], [, b]) => b.createdTime - a.createdTime).map(([basename, { highScore, lowScore }]) => {
const highScoreContent = highScore.join("\n\n");
let lowScoreContent = "";
if (totalLowScoreCount < MAX_LOW_SCORE_RESULTS) {
const remainingSlots = MAX_LOW_SCORE_RESULTS - totalLowScoreCount;
const lowScoreToInclude = lowScore.slice(0, remainingSlots);
lowScoreContent = lowScoreToInclude.join("\n\n");
totalLowScoreCount += lowScoreToInclude.length;
}
const content = [highScoreContent, lowScoreContent].filter(Boolean).join("\n\n");
return `[[${basename}]]
${content}`;
});
return finalResults.join("\n\n").trim();
}
async function clearEmbeddingsCache() {
await fileCache.clearEmbeddings();
}
function getCreatedTime(doc) {
const frontmatterMatch = doc.pageContent.match(/^---\n([\s\S]*?)\n---/);
if (frontmatterMatch) {
const frontmatter = frontmatterMatch[1];
const createdMatch = frontmatter.match(
/created:\s*(\d{4}-\d{2}-\d{2})/
);
if (createdMatch) {
return new Date(createdMatch[1]).getTime();
}
}
return doc.metadata.stat.ctime;
}
// src/LocalGPTSettingTab.ts
var SEPARATOR = "\u2702\uFE0F";
var LocalGPTSettingTab = class extends import_obsidian5.PluginSettingTab {
constructor(app, plugin) {
super(app, plugin);
this.editEnabled = false;
this.modelsOptions = {};
this.changingOrder = false;
this.useFallback = false;
this.selectedProvider = "";
this.plugin = plugin;
}
display() {
const { containerEl } = this;
containerEl.empty();
this.selectedProvider = this.selectedProvider || this.plugin.settings.defaults.provider;
this.useFallback = this.useFallback || Boolean(this.plugin.settings.defaults.fallbackProvider);
const mainProviders = {
["ollama" /* OLLAMA */]: "Ollama",
["openaiCompatible" /* OPENAI_COMPATIBLE */]: "OpenAI compatible server"
};
const fallbackProviders = {
...mainProviders
};
if (this.plugin.settings.defaults.provider === "ollama" /* OLLAMA */) {
delete fallbackProviders["ollama" /* OLLAMA */];
fallbackProviders["ollama_fallback" /* OLLAMA_FALLBACK */] = "2\uFE0F\u20E3 Ollama";
}
if (this.plugin.settings.defaults.provider === "openaiCompatible" /* OPENAI_COMPATIBLE */) {
delete fallbackProviders["openaiCompatible" /* OPENAI_COMPATIBLE */];
fallbackProviders["openaiCompatible_fallback" /* OPENAI_COMPATIBLE_FALLBACK */] = "2\uFE0F\u20E3 OpenAI compatible servers";
}
const selectedAIProviderSetting = new import_obsidian5.Setting(containerEl).setHeading().setName("").addDropdown(
(dropdown) => dropdown.addOptions(mainProviders).setValue(String(this.plugin.settings.defaults.provider)).onChange(async (value) => {
this.plugin.settings.defaults.provider = value;
this.selectedProvider = value;
if (this.useFallback) {
this.plugin.settings.fallbackProvider = Object.keys(
mainProviders
).find((key) => key !== value);
}
await this.plugin.saveSettings();
this.display();
})
);
selectedAIProviderSetting.nameEl.innerHTML = "<h3>Selected AI provider</h3>";
new import_obsidian5.Setting(containerEl).setName("Creativity").setDesc("").addDropdown((dropdown) => {
dropdown.addOption("", "\u26AA None").addOptions({
low: "\uFE0F\u{1F4A1} Low",
medium: "\u{1F3A8} Medium",
high: "\u{1F680} High"
}).setValue(
String(this.plugin.settings.defaults.creativity) || ""
).onChange(async (value) => {
this.plugin.settings.defaults.creativity = value;
await this.plugin.saveSettings();
});
});
new import_obsidian5.Setting(containerEl).setName("Use fallback").addToggle((component) => {
component.setValue(this.useFallback).onChange(async (value) => {
this.useFallback = value;
if (value) {
const firstAvailableProvider = Object.keys(fallbackProviders)[0];
this.plugin.settings.defaults.fallbackProvider = firstAvailableProvider;
this.selectedProvider = firstAvailableProvider;
} else {
this.plugin.settings.defaults.fallbackProvider = "";
this.selectedProvider = this.plugin.settings.defaults.provider;
}
await this.plugin.saveSettings();
this.display();
});
});
if (this.useFallback) {
new import_obsidian5.Setting(containerEl).setName("Fallback AI provider").setDesc(
"If the Default provider is not accessible the plugin will try to reach the fallback one."
).addDropdown(
(dropdown) => dropdown.addOptions(fallbackProviders).setValue(
String(
this.plugin.settings.defaults.fallbackProvider
)
).onChange(async (value) => {
this.plugin.settings.defaults.fallbackProvider = value;
this.selectedProvider = value;
await this.plugin.saveSettings();
this.display();
})
);
}
containerEl.createEl("div", { cls: "local-gpt-settings-separator" });
containerEl.createEl("h3", { text: "Providers configuration" });
const selectedProviderConfig = this.plugin.settings.providers[this.selectedProvider];
const aiProvider = new import_obsidian5.Setting(containerEl).setHeading().setName("Configure AI provider").addDropdown(
(dropdown) => dropdown.addOptions({
...mainProviders,
...this.useFallback && {
["ollama_fallback" /* OLLAMA_FALLBACK */]: "2\uFE0F\u20E3 Ollama",
["openaiCompatible_fallback" /* OPENAI_COMPATIBLE_FALLBACK */]: "2\uFE0F\u20E3 OpenAI compatible servers"
}
}).setValue(String(this.selectedProvider)).onChange(async (value) => {
this.selectedProvider = value;
this.display();
})
);
if (selectedProviderConfig.type === "ollama" /* OLLAMA */) {
new import_obsidian5.Setting(containerEl).setName("Ollama URL").setDesc("Default is http://localhost:11434").addText(
(text) => text.setPlaceholder("http://localhost:11434").setValue(selectedProviderConfig.ollamaUrl).onChange(async (value) => {
selectedProviderConfig.ollamaUrl = value;
await this.plugin.saveSettings();
})
);
const ollamaDefaultModel = new import_obsidian5.Setting(containerEl).setName("Default model").setDesc("Name of the default Ollama model to use in prompts");
const ollamaEmbeddingModel = new import_obsidian5.Setting(containerEl).setName("Embedding model").setDesc(
"Optional. Name of the Ollama embedding model to use for Enhanced Actions"
);
if (selectedProviderConfig.ollamaUrl) {
OllamaAIProvider.getModels(selectedProviderConfig).then((models) => {
this.modelsOptions = models;
ollamaDefaultModel.addDropdown(
(dropdown) => dropdown.addOptions(this.modelsOptions).setValue(
String(
selectedProviderConfig.defaultModel
)
).onChange(async (value) => {
selectedProviderConfig.defaultModel = value;
await this.plugin.saveSettings();
})
).addButton(
(button) => button.setIcon("refresh-cw").onClick(async () => {
this.display();
})
);
ollamaEmbeddingModel.addDropdown(
(dropdown) => dropdown.addOption("", "No enhancement").addOptions(this.modelsOptions).setValue(
String(
selectedProviderConfig.embeddingModel
)
).onChange(async (value) => {
clearEmbeddingsCache();
selectedProviderConfig.embeddingModel = value;
await this.plugin.saveSettings();
})
);
}).catch(() => {
ollamaDefaultModel.descEl.innerHTML = `Get the models from <a href="https://ollama.ai/library">Ollama library</a> or check that Ollama URL is correct.`;
ollamaDefaultModel.addButton(
(button) => button.setIcon("refresh-cw").onClick(async () => {
this.display();
})
);
});
}
}
if (selectedProviderConfig.type === "openaiCompatible" /* OPENAI_COMPATIBLE */) {
const openAICompatible = new import_obsidian5.Setting(containerEl).setName("OpenAI compatible server URL").setDesc("").addText(
(text) => text.setPlaceholder("http://localhost:8080").setValue(selectedProviderConfig.url).onChange(async (value) => {
selectedProviderConfig.url = value;
await this.plugin.saveSettings();
})
);
openAICompatible.descEl.innerHTML = `
There are several options to run local OpenAI-like server:
<ul>
<li><a href="https://github.com/ggerganov/llama.cpp/blob/master/examples/server/README.md">llama.cpp</a></li>
<li><a href="https://github.com/abetlen/llama-cpp-python#openai-compatible-web-server">llama-cpp-python</a></li>
<li><a href="https://localai.io/model-compatibility/llama-cpp/#setup">LocalAI</a></li>
<li>Obabooga <a href="https://github.com/pfrankov/obsidian-local-gpt/discussions/8">Text generation web UI</a></li>
<li><a href="https://lmstudio.ai/">LM Studio</a></li>
</ul>
After all installation and configuration make sure that you're using compatible model.<br/>
For llama.cpp it is necessary to use models in ChatML format (e.g. <a href="https://huggingface.co/TheBloke/Orca-2-7B-GGUF/blob/main/orca-2-7b.Q4_K_M.gguf">Orca 2</a>)
`;
const apiKey = new import_obsidian5.Setting(containerEl).setName("API key").setDesc("").addText(
(text) => text.setPlaceholder("").setValue(selectedProviderConfig.apiKey).onChange(async (value) => {
selectedProviderConfig.apiKey = value;
await this.plugin.saveSettings();
})
);
apiKey.descEl.innerHTML = `
Optional. Check <a href="https://github.com/pfrankov/obsidian-local-gpt#using-with-openai">the docs</a> if you'd like to use OpenAI servers.
`;
const openaiDefaultModel = new import_obsidian5.Setting(containerEl).setName("Default model").setDesc(
"Optional. Name of the default model to use in prompts"
);
const openaiEmbeddingModel = new import_obsidian5.Setting(containerEl).setName("Embedding model").setDesc(
"Optional. Name of the embedding model to use for Enhanced Actions"
);
if (selectedProviderConfig.url) {
OpenAICompatibleAIProvider.getModels(selectedProviderConfig).then((models) => {
openaiDefaultModel.addDropdown(
(dropdown) => dropdown.addOption("", "Not specified").addOptions(models).setValue(
String(
selectedProviderConfig.defaultModel
) || ""
).onChange(async (value) => {
selectedProviderConfig.defaultModel = value;
await this.plugin.saveSettings();
})
).addButton(
(button) => button.setIcon("refresh-cw").onClick(async () => {
this.display();
})
);
openaiEmbeddingModel.addDropdown(
(dropdown) => dropdown.addOption("", "No enhancement").addOptions(models).setValue(
String(
selectedProviderConfig.embeddingModel
) || ""
).onChange(async (value) => {
clearEmbeddingsCache();
selectedProviderConfig.embeddingModel = value;
await this.plugin.saveSettings();
})
);
}).catch(() => {
openaiDefaultModel.addButton(
(button) => button.setIcon("refresh-cw").onClick(async () => {
this.display();
})
);
});
}
}
const editingAction = this.editExistingAction || {
name: "",
prompt: "",
model: "",
temperature: void 0,
system: "",
replace: false
};
const sharingActionsMapping = {
name: "Name: ",
system: "System: ",
prompt: "Prompt: ",
replace: "Replace: ",
model: "Model: "
};
containerEl.createEl("div", { cls: "local-gpt-settings-separator" });
containerEl.createEl("h3", { text: "Actions" });
if (!this.editEnabled) {
const quickAdd = new import_obsidian5.Setting(containerEl).setName("Quick add").setDesc("").addText((text) => {
text.inputEl.style.minWidth = "100%";
text.setPlaceholder("Paste action");
text.onChange(async (value) => {
const quickAddAction = value.split(SEPARATOR).map((part) => part.trim()).reduce((acc, part) => {
const foundMatchKey = Object.keys(
sharingActionsMapping
).find((key) => {
return part.startsWith(
sharingActionsMapping[key]
);
});
if (foundMatchKey) {
acc[foundMatchKey] = part.substring(
sharingActionsMapping[foundMatchKey].length,
part.length
);
}
return acc;
}, {});
if (quickAddAction.name) {
await this.addNewAction(quickAddAction);
text.setValue("");
this.display();
}
});
});
quickAdd.descEl.innerHTML = `You can share the best sets prompts or get one <a href="https://github.com/pfrankov/obsidian-local-gpt/discussions/2">from the community</a>.<br/><strong>Important:</strong> if you already have an action with the same name it will be overwritten.`;
new import_obsidian5.Setting(containerEl).setName("Add new manually").addButton(
(button) => button.setIcon("plus").onClick(async () => {
this.editEnabled = true;
this.editExistingAction = void 0;
this.display();
})
);
} else {
if (this.plugin.settings.providers[this.plugin.settings.defaults.provider].type === "ollama" /* OLLAMA */) {
new import_obsidian5.Setting(containerEl).setName("Model").setDesc("Optional").addDropdown((dropdown) => {
dropdown.addOption("", "Default model").addOptions(this.modelsOptions).onChange(async (value) => {
editingAction.model = value;
});
(editingAction == null ? void 0 : editingAction.model) && dropdown.setValue(editingAction.model);
});
}
new import_obsidian5.Setting(containerEl).setName("Action name").addText((text) => {
(editingAction == null ? void 0 : editingAction.name) && text.setValue(editingAction.name);
text.inputEl.style.minWidth = "100%";
text.setPlaceholder("Summarize selection");
text.onChange(async (value) => {
editingAction.name = value;
});
});
new import_obsidian5.Setting(containerEl).setName("System prompt").setDesc("Optional").addTextArea((text) => {
(editingAction == null ? void 0 : editingAction.system) && text.setValue(editingAction.system);
text.inputEl.style.minWidth = "100%";
text.inputEl.style.minHeight = "6em";
text.inputEl.style.resize = "vertical";
text.setPlaceholder("You are a helpful assistant.");
text.onChange(async (value) => {
editingAction.system = value;
});
});
const promptSetting = new import_obsidian5.Setting(containerEl).setName("Prompt").setDesc("").addTextArea((text) => {
(editingAction == null ? void 0 : editingAction.prompt) && text.setValue(editingAction.prompt);
text.inputEl.style.minWidth = "100%";
text.inputEl.style.minHeight = "6em";
text.inputEl.style.resize = "vertical";
text.setPlaceholder("");
text.onChange(async (value) => {
editingAction.prompt = value;
});
});
promptSetting.descEl.innerHTML = `Please read about<br/><a href="https://github.com/pfrankov/obsidian-local-gpt/blob/master/docs/prompt-templating.md">Prompt templating</a><br/>if you want to customize<br/>your resulting prompts`;
new import_obsidian5.Setting(containerEl).setName("Replace selected text").setDesc(
"If checked, the highlighted text will be replaced with a response from the model."
).addToggle((component) => {
(editingAction == null ? void 0 : editingAction.replace) && component.setValue(editingAction.replace);
component.onChange(async (value) => {
editingAction.replace = value;
});
});
const actionButtonsRow = new import_obsidian5.Setting(containerEl).setName("");
if (this.editExistingAction) {
actionButtonsRow.addButton((button) => {
button.buttonEl.style.marginRight = "2em";
button.setButtonText("Remove").onClick(async () => {
if (!button.buttonEl.hasClass("mod-warning")) {
button.setClass("mod-warning");
return;
}
this.plugin.settings.actions = this.plugin.settings.actions.filter(
(innerAction) => innerAction !== editingAction
);
await this.plugin.saveSettings();
this.editExistingAction = void 0;
this.editEnabled = false;
this.display();
});
});
}
actionButtonsRow.addButton((button) => {
button.setButtonText("Close").onClick(async () => {
this.editEnabled = false;
this.editExistingAction = void 0;
this.display();
});
}).addButton(
(button) => button.setCta().setButtonText("Save").onClick(async () => {
if (!editingAction.name) {
new import_obsidian5.Notice(
"Please enter a name for the action."
);
return;
}
if (!this.editExistingAction) {
if (this.plugin.settings.actions.find(
(action) => action.name === editingAction.name
)) {
new import_obsidian5.Notice(
`An action with the name "${editingAction.name}" already exists.`
);
return;
}
await this.addNewAction(editingAction);
} else {
if (this.plugin.settings.actions.filter(
(action) => action.name === editingAction.name
).length > 1) {
new import_obsidian5.Notice(
`An action with the name "${editingAction.name}" already exists.`
);
return;
}
const index = this.plugin.settings.actions.findIndex(
(innerAction) => innerAction === editingAction
);
this.plugin.settings.actions[index] = editingAction;
}
await this.plugin.saveSettings();
this.editEnabled = false;
this.editExistingAction = void 0;
this.display();
})
);
}
containerEl.createEl("h4", { text: "Actions list" });
let defaultModel = "";
if (selectedProviderConfig.type === "ollama" /* OLLAMA */) {
defaultModel = selectedProviderConfig.defaultModel;
}
this.plugin.settings.actions.forEach((action, actionIndex) => {
const sharingString = [
action.name && `${sharingActionsMapping.name}${action.name}`,
action.system && `${sharingActionsMapping.system}${action.system}`,
action.prompt && `${sharingActionsMapping.prompt}${action.prompt}`,
action.replace && `${sharingActionsMapping.replace}${action.replace}`,
this.plugin.settings.defaults.provider === "ollama" /* OLLAMA */ && (action.model || defaultModel) && `${sharingActionsMapping.model}${action.model || defaultModel}`
].filter(Boolean).join(` ${SEPARATOR}
`);
if (!this.changingOrder) {
let escapeTitle = function(title) {
if (!title) {
return "";
}
return title.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#039;");
};
const actionRow = new import_obsidian5.Setting(containerEl).setName(action.name).setDesc("").addButton(
(button) => button.setIcon("copy").onClick(async () => {
navigator.clipboard.writeText(sharingString);
new import_obsidian5.Notice("Copied");
})
).addButton(
(button) => button.setButtonText("Edit").onClick(async () => {
this.editEnabled = true;
this.editExistingAction = this.plugin.settings.actions.find(
(innerAction) => innerAction.name == action.name
);
this.display();
})
);
const systemTitle = escapeTitle(action.system);
const promptTitle = escapeTitle(action.prompt);
actionRow.descEl.innerHTML = [
action.system && `<div title="${systemTitle}" style="text-overflow: ellipsis; overflow: hidden; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;">
<b>${sharingActionsMapping.system}</b>${action.system}</div>`,
action.prompt && `<div title="${promptTitle}" style="text-overflow: ellipsis; overflow: hidden; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;">
<b>${sharingActionsMapping.prompt}</b>${action.prompt}
</div>`,
this.plugin.settings.defaults.provider === "ollama" /* OLLAMA */ && action.model && `<b>${sharingActionsMapping.model}</b>${action.model}`
].filter(Boolean).join("<br/>\n");
} else {
const actionRow = new import_obsidian5.Setting(containerEl).setName(action.name).setDesc("");
if (actionIndex > 0) {
actionRow.addButton(
(button) => button.setIcon("arrow-up").onClick(async () => {
const prev = this.plugin.settings.actions[actionIndex - 1];
this.plugin.settings.actions[actionIndex - 1] = action;
this.plugin.settings.actions[actionIndex] = prev;
await this.plugin.saveSettings();
this.display();
})
);
}
if (actionIndex < this.plugin.settings.actions.length - 1) {
actionRow.addButton(
(button) => button.setIcon("arrow-down").onClick(async () => {
const next = this.plugin.settings.actions[actionIndex + 1];
this.plugin.settings.actions[actionIndex + 1] = action;
this.plugin.settings.actions[actionIndex] = next;
await this.plugin.saveSettings();
this.display();
})
);
}
}
});
if (this.plugin.settings.actions.length) {
new import_obsidian5.Setting(containerEl).setName("").addButton((button) => {
this.changingOrder && button.setCta();
button.setButtonText(this.changingOrder ? "Done" : "Change order").onClick(async () => {
this.changingOrder = !this.changingOrder;
this.display();
});
});
}
containerEl.createEl("h4", { text: "Danger zone" });
new import_obsidian5.Setting(containerEl).setName("Reset actions").setDesc(
"\u{1F6A8} Reset all actions to the default. This cannot be undone and will delete all your custom actions."
).addButton(
(button) => button.setClass("mod-warning").setButtonText("Reset").onClick(async () => {
button.setDisabled(true);
button.buttonEl.setAttribute("disabled", "true");
button.buttonEl.classList.remove("mod-warning");
this.plugin.settings.actions = DEFAULT_SETTINGS.actions;
await this.plugin.saveSettings();
this.display();
})
);
}
async addNewAction(editingAction) {
const alreadyExistingActionIndex = this.plugin.settings.actions.findIndex(
(action) => action.name === editingAction.name
);
if (alreadyExistingActionIndex >= 0) {
this.plugin.settings.actions[alreadyExistingActionIndex] = editingAction;
new import_obsidian5.Notice(`Rewritten "${editingAction.name}" action`);
} else {
this.plugin.settings.actions = [
editingAction,
...this.plugin.settings.actions
];
new import_obsidian5.Notice(`Added "${editingAction.name}" action`);
}
await this.plugin.saveSettings();
}
};
// src/spinnerPlugin.ts
var import_state = require("@codemirror/state");
var import_view = require("@codemirror/view");
var _LoaderWidget = class extends import_view.WidgetType {
toDOM(view) {
return _LoaderWidget.element.cloneNode(true);
}
};
var LoaderWidget = _LoaderWidget;
LoaderWidget.element = document.createElement("span");
(() => {
_LoaderWidget.element.addClasses(["local-gpt-loading", "local-gpt-dots"]);
})();
var ContentWidget = class extends import_view.WidgetType {
constructor(text) {
super();
this.text = text;
this.dom = null;
}
eq(other) {
return other.text === this.text;
}
updateText(newText) {
if (this.dom && this.text !== newText) {
const addedText = newText.slice(this.text.length);
this.dom.textContent = newText.slice(0, -addedText.length);
let lastSpan = this.dom.querySelector("span:last-child");
if (!lastSpan) {
lastSpan = document.createElement("span");
this.dom.appendChild(lastSpan);
}
lastSpan.textContent = addedText;
this.text = newText;
}
}
toDOM(view) {
if (!this.dom) {
this.dom = document.createElement("div");
this.dom.addClass("local-gpt-content");
this.updateText(this.text);
}
return this.dom;
}
};
var SpinnerPlugin = class {
constructor(editorView) {
this.editorView = editorView;
this.positions = /* @__PURE__ */ new Map();
this.decorations = import_view.Decoration.none;
}
show(position) {
const isEndOfLine = this.isPositionAtEndOfLine(
this.editorView.state,
position
);
this.positions.set(position, {
isEndOfLine,
widget: new LoaderWidget()
});
this.updateDecorations();
return () => this.hide(position);
}
hide(position) {
this.positions.delete(position);
this.updateDecorations();
}
updateContent(text, position) {
let updated = false;
const updatePosition = (data) => {
if (data.widget instanceof LoaderWidget) {
data.widget = new ContentWidget(text);
updated = true;
} else if (data.widget instanceof ContentWidget) {
data.widget.updateText(text);
updated = true;
}
};
if (position !== void 0) {
const data = this.positions.get(position);
if (data)
updatePosition(data);
} else {
this.positions.forEach(updatePosition);
}
if (updated) {
this.updateDecorations();
}
}
update(update) {
if (update.docChanged || update.viewportChanged) {
this.updateDecorations();
}
}
updateDecorations() {
const builder = new import_state.RangeSetBuilder();
this.positions.forEach((data, position) => {
builder.add(
position,
position,
import_view.Decoration.widget({
widget: data.widget,
side: data.isEndOfLine ? 1 : -1
})
);
});
this.decorations = builder.finish();
this.editorView.requestMeasure();
}
isPositionAtEndOfLine(state, position) {
return position === state.doc.lineAt(position).to;
}
};
var spinnerPlugin = import_view.ViewPlugin.fromClass(SpinnerPlugin, {
decorations: (v) => v.decorations
});
// src/main.ts
var LocalGPT = class extends import_obsidian6.Plugin {
constructor() {
super(...arguments);
this.abortControllers = [];
this.currentPercentage = 0;
this.targetPercentage = 0;
this.animationFrameId = null;
this.totalProgressSteps = 0;
this.completedProgressSteps = 0;
this.escapeHandler = (event) => {
if (event.key === "Escape") {
this.abortControllers.forEach(
(abortControllers) => {
abortControllers.abort();
}
);
this.abortControllers = [];
}
};
}
async onload() {
await this.loadSettings();
this.reload();
this.app.workspace.onLayoutReady(async () => {
await fileCache.init(this.app.appId);
window.setTimeout(() => {
this.checkUpdates();
}, 5e3);
});
this.registerEditorExtension(spinnerPlugin);
this.addSettingTab(new LocalGPTSettingTab(this.app, this));
this.initializeStatusBar();
}
initializeStatusBar() {
this.statusBarItem = this.addStatusBarItem();
this.statusBarItem.addClass("local-gpt-status");
this.statusBarItem.hide();
}
processText(text, selectedText) {
if (!text.trim()) {
return "";
}
return ["\n", text.trim().replace(selectedText, "").trim(), "\n"].join(
""
);
}
addCommands() {
this.addCommand({
id: "context-menu",
name: "Show context menu",
editorCallback: (editor) => {
const editorView = editor.cm;
const cursorPositionFrom = editor.getCursor("from");
const cursorPositionTo = editor.getCursor("to");
const contextMenu = new import_obsidian6.Menu();
this.settings.actions.forEach((action) => {
contextMenu.addItem((item) => {
item.setTitle(action.name).onClick(
this.runAction.bind(this, action, editor)
);
});
});
const fromRect = editorView.coordsAtPos(
editor.posToOffset(cursorPositionFrom)
);
const toRect = editorView.coordsAtPos(
editor.posToOffset(cursorPositionTo)
);
contextMenu.showAtPosition({
x: fromRect.left,
y: toRect.top + (editorView.defaultLineHeight || 0)
});
}
});
this.settings.actions.forEach((action, index) => {
this.addCommand({
id: `quick-access-${index + 1}`,
name: `${index + 1} | ${action.name}`,
editorCallback: (editor) => {
this.runAction(action, editor);
}
});
});
}
async runAction(action, editor) {
const editorView = editor.cm;
const selection = editor.getSelection();
let selectedText = selection || editor.getValue();
const cursorPositionFrom = editor.getCursor("from");
const cursorPositionTo = editor.getCursor("to");
const abortController = new AbortController();
this.abortControllers.push(abortController);
const spinner = editorView.plugin(spinnerPlugin) || void 0;
const hideSpinner = spinner == null ? void 0 : spinner.show(editor.posToOffset(cursorPositionTo));
this.app.workspace.updateOptions();
const onUpdate = (updatedString) => {
spinner.updateContent(
this.processText(updatedString, selectedText)
);
this.app.workspace.updateOptions();
};
const getAIProvider = (providerName) => {
switch (this.settings.providers[providerName].type) {
case "openaiCompatible" /* OPENAI_COMPATIBLE */: {
const { url, apiKey, defaultModel, embeddingModel } = this.settings.providers[providerName];
return new OpenAICompatibleAIProvider({
url,
apiKey,
defaultModel,
embeddingModel,
abortController,
onUpdate
});
}
case "ollama" /* OLLAMA */:
default: {
const { ollamaUrl, defaultModel, embeddingModel } = this.settings.providers[providerName];
return new OllamaAIProvider({
defaultModel,
ollamaUrl,
embeddingModel,
abortController,
onUpdate
});
}
}
};
const aiProvider = getAIProvider(this.settings.defaults.provider);
const regexp = /!\[\[(.+?\.(?:png|jpe?g))]]/gi;
const fileNames = Array.from(
selectedText.matchAll(regexp),
(match) => match[1]
);
selectedText = selectedText.replace(regexp, "");
const imagesInBase64 = (await Promise.all(
fileNames.map((fileName) => {
const filePath = this.app.metadataCache.getFirstLinkpathDest(
fileName,
// @ts-ignore
this.app.workspace.getActiveFile().path
);
if (!filePath) {
return Promise.resolve("");
}
return this.app.vault.adapter.readBinary(filePath.path).then((buffer) => {
const bytes = new Uint8Array(buffer);
const output = [];
for (const byte of bytes) {
output.push(String.fromCharCode(byte));
}
const binString = output.join("");
return btoa(binString);
});
})
)).filter(Boolean) || [];
logger.time("Processing Embeddings");
const context = await this.enhanceWithContext(selectedText, aiProvider);
logger.timeEnd("Processing Embeddings");
logger.debug("Selected text", selectedText);
const aiRequest = {
text: selectedText,
action,
images: imagesInBase64,
options: {
temperature: CREATIVITY[this.settings.defaults.creativity].temperature
},
context
};
aiProvider.process(aiRequest).catch((error) => {
if (this.settings.defaults.fallbackProvider) {
new import_obsidian6.Notice(`Action processed with a fallback`);
return getAIProvider(
this.settings.defaults.fallbackProvider
).process(aiRequest);
}
return Promise.reject(error);
}).then((data) => {
hideSpinner && hideSpinner();
this.app.workspace.updateOptions();
if (action.replace) {
editor.replaceRange(
data.trim(),
cursorPositionFrom,
cursorPositionTo
);
} else {
const isLastLine = editor.lastLine() === cursorPositionTo.line;
const text = this.processText(data, selectedText);
editor.replaceRange(isLastLine ? "\n" + text : text, {
ch: 0,
line: cursorPositionTo.line + 1
});
}
}).catch((error) => {
if (!abortController.signal.aborted) {
new import_obsidian6.Notice(`Error while generating text: ${error.message}`);
}
hideSpinner && hideSpinner();
this.app.workspace.updateOptions();
}).finally(() => {
logger.separator();
});
}
async enhanceWithContext(selectedText, aiProvider) {
var _a2, _b, _c, _d;
const activeFile = this.app.workspace.getActiveFile();
if (!activeFile) {
return "";
}
if (!this.settings.providers[this.settings.defaults.provider].embeddingModel) {
return "";
}
const linkedFiles = getLinkedFiles(
selectedText,
this.app.vault,
this.app.metadataCache,
activeFile.path
);
if (linkedFiles.length === 0) {
return "";
}
try {
if ((_a2 = aiProvider.abortController) == null ? void 0 : _a2.signal.aborted) {
return "";
}
this.initializeProgress();
const processedDocs = await startProcessing(
linkedFiles,
this.app.vault,
this.app.metadataCache,
activeFile
);
if (processedDocs.size === 0) {
this.hideStatusBar();
return "";
}
if ((_b = aiProvider.abortController) == null ? void 0 : _b.signal.aborted) {
this.hideStatusBar();
return "";
}
const vectorStore = await createVectorStore(
Array.from(processedDocs.values()),
this,
activeFile.path,
aiProvider,
this.addTotalProgressSteps.bind(this),
this.updateCompletedSteps.bind(this)
);
if ((_c = aiProvider.abortController) == null ? void 0 : _c.signal.aborted) {
this.hideStatusBar();
return "";
}
const relevantContext = await queryVectorStore(
selectedText,
vectorStore
);
this.hideStatusBar();
if (relevantContext.trim()) {
return relevantContext;
}
} catch (error) {
this.hideStatusBar();
if ((_d = aiProvider.abortController) == null ? void 0 : _d.signal.aborted) {
return "";
}
console.error("Error processing RAG:", error);
new import_obsidian6.Notice(
`Error processing related documents: ${error.message}. Continuing with original text.`
);
}
return "";
}
onunload() {
document.removeEventListener("keydown", this.escapeHandler);
window.clearInterval(this.updatingInterval);
if (this.animationFrameId !== null) {
cancelAnimationFrame(this.animationFrameId);
}
}
async loadSettings() {
const loadedData = await this.loadData();
let needToSave = false;
if (loadedData) {
if (!loadedData._version || loadedData._version < 1) {
needToSave = true;
loadedData.providers = DEFAULT_SETTINGS.providers;
loadedData.providers.ollama.ollamaUrl = loadedData.ollamaUrl;
delete loadedData.ollamaUrl;
loadedData.providers.ollama.defaultModel = // @ts-ignore
loadedData.defaultModel;
delete loadedData.defaultModel;
loadedData.providers.openaiCompatible && // @ts-ignore
(loadedData.providers.openaiCompatible.apiKey = "");
loadedData._version = 2;
}
if (loadedData._version < 3) {
needToSave = true;
loadedData.defaultProvider = // @ts-ignore
loadedData.selectedProvider || // @ts-ignore
DEFAULT_SETTINGS.defaultProvider;
delete loadedData.selectedProvider;
Object.keys(loadedData.providers).forEach((key) => {
loadedData.providers[key].type = key;
});
loadedData._version = 3;
}
if (loadedData._version < 4) {
needToSave = true;
loadedData.defaults = {
provider: (
// @ts-ignore
loadedData.defaultProvider || DEFAULT_SETTINGS.defaults.provider
),
fallbackProvider: (
// @ts-ignore
loadedData.fallbackProvider || DEFAULT_SETTINGS.defaults.fallbackProvider
),
creativity: DEFAULT_SETTINGS.defaults.creativity
};
delete loadedData.defaultProvider;
delete loadedData.fallbackProvider;
loadedData._version = 4;
}
if (loadedData._version < 5) {
needToSave = true;
Object.keys(DEFAULT_SETTINGS.providers).forEach((provider) => {
if (loadedData.providers[provider]) {
loadedData.providers[provider].embeddingModel = DEFAULT_SETTINGS.providers[provider].embeddingModel;
}
});
loadedData._version = 5;
setTimeout(() => {
new import_obsidian6.Notice(
`\u{1F389} LocalGPT can finally use
context from links!
Check the Settings!`,
0
);
}, 1e4);
}
Object.keys(DEFAULT_SETTINGS.providers).forEach((key) => {
if (loadedData.providers[key]) {
return;
}
loadedData.providers[key] = DEFAULT_SETTINGS.providers[key];
needToSave = true;
});
}
this.settings = Object.assign({}, DEFAULT_SETTINGS, loadedData);
if (needToSave) {
await this.saveData(this.settings);
}
}
async checkUpdates() {
try {
const { json: response } = await (0, import_obsidian6.requestUrl)({
url: "https://api.github.com/repos/pfrankov/obsidian-local-gpt/releases/latest",
method: "GET",
headers: {
"Content-Type": "application/json"
},
contentType: "application/json"
});
if (response.tag_name !== this.manifest.version) {
new import_obsidian6.Notice(`\u2B06\uFE0F Local GPT: a new version is available`);
}
} catch (error) {
console.error("Error checking for updates:", error);
}
}
reload() {
this.onunload();
this.addCommands();
this.abortControllers = [];
this.updatingInterval = window.setInterval(
this.checkUpdates.bind(this),
108e5
);
document.addEventListener("keydown", this.escapeHandler);
}
async saveSettings() {
await this.saveData(this.settings);
this.reload();
}
initializeProgress() {
this.totalProgressSteps = 0;
this.completedProgressSteps = 0;
this.currentPercentage = 0;
this.targetPercentage = 0;
this.statusBarItem.show();
this.updateStatusBar();
}
addTotalProgressSteps(steps) {
this.totalProgressSteps += steps;
this.updateProgressBar();
}
updateCompletedSteps(steps) {
this.completedProgressSteps += steps;
this.updateProgressBar();
}
updateProgressBar() {
const newTargetPercentage = this.totalProgressSteps > 0 ? Math.round(
this.completedProgressSteps / this.totalProgressSteps * 100
) : 0;
if (this.targetPercentage !== newTargetPercentage) {
this.targetPercentage = newTargetPercentage;
if (this.animationFrameId === null) {
this.animatePercentage();
}
}
}
updateStatusBar() {
this.statusBarItem.setAttr(
"data-text",
this.currentPercentage ? `\u2728 Enhancing ${this.currentPercentage}%` : "\u2728 Enhancing"
);
this.statusBarItem.setText(` `);
}
animatePercentage() {
const startTime = performance.now();
const duration = 300;
const animate = (currentTime) => {
const elapsedTime = currentTime - startTime;
const progress = Math.min(elapsedTime / duration, 1);
this.currentPercentage = Math.round(
this.currentPercentage + (this.targetPercentage - this.currentPercentage) * progress
);
this.updateStatusBar();
if (progress < 1) {
this.animationFrameId = requestAnimationFrame(animate);
} else {
this.animationFrameId = null;
}
};
this.animationFrameId = requestAnimationFrame(animate);
}
hideStatusBar() {
this.statusBarItem.hide();
this.totalProgressSteps = 0;
this.completedProgressSteps = 0;
this.currentPercentage = 0;
this.targetPercentage = 0;
}
};
/*! Bundled license information:
@langchain/core/dist/utils/fast-json-patch/src/helpers.js:
(*!
* https://github.com/Starcounter-Jack/JSON-Patch
* (c) 2017-2022 Joachim Wester
* MIT licensed
*)
@langchain/core/dist/utils/fast-json-patch/src/duplex.js:
(*!
* https://github.com/Starcounter-Jack/JSON-Patch
* (c) 2013-2021 Joachim Wester
* MIT license
*)
*/
/* nosourcemap */