diff --git a/api-data-store-server-java/src/main/java/ch/ethz/sis/afsclient/client/AfsClient.java b/api-data-store-server-java/src/main/java/ch/ethz/sis/afsclient/client/AfsClient.java index fa151f65157082e898a19c2fd80f4aea338551f6..f2eed8819c9e798f6e2db8eb178b3c1a79e1937c 100644 --- a/api-data-store-server-java/src/main/java/ch/ethz/sis/afsclient/client/AfsClient.java +++ b/api-data-store-server-java/src/main/java/ch/ethz/sis/afsclient/client/AfsClient.java @@ -187,31 +187,39 @@ public final class AfsClient implements PublicAPI @Override public void begin(final UUID transactionId) throws Exception { - + validateSessionToken(); + Map<String, Object> parameters = + Map.of("transactionId", transactionId, + "sessionToken", getSessionToken()); + request("POST", "begin", Map.of(), jsonObjectMapper.writeValue(parameters)); } @Override public Boolean prepare() throws Exception { - return null; + validateSessionToken(); + return request("POST", "prepare", Map.of()); } @Override public void commit() throws Exception { - + validateSessionToken(); + request("POST", "commit", Map.of()); } @Override public void rollback() throws Exception { - + validateSessionToken(); + request("POST", "rollback", Map.of()); } @Override public List<UUID> recover() throws Exception { - return null; + validateSessionToken(); + return request("POST", "recover", Map.of()); } private <T> T request(@NonNull final String httpMethod, @NonNull final String apiMethod, diff --git a/api-data-store-server-java/src/test/java/ch/ethz/sis/afsclient/client/AfsClientTest.java b/api-data-store-server-java/src/test/java/ch/ethz/sis/afsclient/client/AfsClientTest.java index 654a2a554b5917567fa950128645d9098cad49da..1d8b56026d2808e3a2d3f8b2442b3a6d8d55d280 100644 --- a/api-data-store-server-java/src/test/java/ch/ethz/sis/afsclient/client/AfsClientTest.java +++ b/api-data-store-server-java/src/test/java/ch/ethz/sis/afsclient/client/AfsClientTest.java @@ -5,6 +5,8 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.CoreMatchers.containsString; import java.net.URI; +import java.util.List; +import java.util.UUID; import org.junit.*; @@ -179,28 +181,61 @@ public class AfsClientTest } @Test - public void testBegin() + public void begin_methodIsPost() throws Exception { + login(); + + UUID transactionId = UUID.randomUUID(); + + httpServer.setNextResponse("{\"result\": null}"); + afsClient.begin(transactionId); + + assertEquals("POST", httpServer.getHttpExchange().getRequestMethod()); } @Test - public void testPrepare() + public void prepare_methodIsPost() throws Exception { + login(); + + httpServer.setNextResponse("{\"result\": true}"); + Boolean result = afsClient.prepare(); + + assertEquals("POST", httpServer.getHttpExchange().getRequestMethod()); + assertTrue(result); } @Test - public void testCommit() + public void commit_methodIsPost() throws Exception { + login(); + httpServer.setNextResponse("{\"result\": null}"); + + afsClient.commit(); + assertEquals("POST", httpServer.getHttpExchange().getRequestMethod()); } @Test - public void testRollback() + public void rollback_methodIsPost() throws Exception { + login(); + + httpServer.setNextResponse("{\"result\": null}"); + + afsClient.rollback(); + assertEquals("POST", httpServer.getHttpExchange().getRequestMethod()); } @Test - public void testRecover() + public void recover_methodIsPost() throws Exception { + login(); + + httpServer.setNextResponse("{\"result\": null}"); + + List<UUID> result = afsClient.recover(); + assertEquals("POST", httpServer.getHttpExchange().getRequestMethod()); + assertNull(result); } private void login() throws Exception diff --git a/api-openbis-python3-pybis/src/python/CHANGELOG.md b/api-openbis-python3-pybis/src/python/CHANGELOG.md index a39d46450b1e446a32537891bf617bee939dab37..ba0b76116abdd1e3c372ee5b2a5eebe13034f5c3 100644 --- a/api-openbis-python3-pybis/src/python/CHANGELOG.md +++ b/api-openbis-python3-pybis/src/python/CHANGELOG.md @@ -1,6 +1,7 @@ ## Changes with pybis-1.35.4 -- Changes to internal implementation of data set download/upload to use OpenBIS V3 API +- Changes to internal implementation of data set download/upload to use OpenBIS V3 API +- Added TIMESTAMP property reformatting to fit formats supported by OpenBIS ## Changes with pybis-1.35.3 diff --git a/api-openbis-python3-pybis/src/python/pybis/__init__.py b/api-openbis-python3-pybis/src/python/pybis/__init__.py index 3956728e2d33bb3d9984d8f6eea4b83b3c98dbe3..1c663c6235de3d77311ab88baab9f6571329d912 100644 --- a/api-openbis-python3-pybis/src/python/pybis/__init__.py +++ b/api-openbis-python3-pybis/src/python/pybis/__init__.py @@ -15,7 +15,7 @@ name = "pybis" __author__ = "ID SIS • ETH Zürich" __email__ = "openbis-support@id.ethz.ch" -__version__ = "1.35.4rc1" +__version__ = "1.35.4rc2" from . import pybis from .pybis import DataSet diff --git a/api-openbis-python3-pybis/src/python/pybis/dataset.py b/api-openbis-python3-pybis/src/python/pybis/dataset.py index 8222f8de6e855d1bac388367193a1add526664e2..9ba2f319b59b4f2e3776b74d40d077571bd6157f 100644 --- a/api-openbis-python3-pybis/src/python/pybis/dataset.py +++ b/api-openbis-python3-pybis/src/python/pybis/dataset.py @@ -814,7 +814,7 @@ class DataSet( parentIds = [] dataset_type = self.type.code - properties = self.props.all_nonempty() + properties = self.formatter.format(self.props.all_nonempty()) request = { "method": "createReportFromAggregationService", @@ -882,7 +882,7 @@ class DataSet( else: request["params"][1][0]["autoGeneratedCode"] = False - props = self.p._all_props() + props = self.formatter.format(self.p._all_props()) DSpermId = data_stores["code"][0] request["params"][1][0]["properties"] = props request["params"][1][0]["dataStoreId"] = { @@ -902,7 +902,7 @@ class DataSet( # updating the DataSET else: request = self._up_attrs() - props = self.p._all_props() + props = self.formatter.format(self.p._all_props()) request["params"][1][0]["properties"] = props self.openbis._post_request(self.openbis.as_v3, request) @@ -960,6 +960,7 @@ class DataSet( wait_until_finished=True, ) + props = self.formatter.format(self.props.all_nonempty()) param = { "@type": "dss.dto.dataset.create.UploadedDataSetCreation", "@id": "1", @@ -969,7 +970,7 @@ class DataSet( "permId": self.type.code, "entityKind": "DATA_SET"}, - "properties": self.props.all_nonempty(), + "properties": props, "parentIds": [], "uploadId": upload_id } diff --git a/api-openbis-python3-pybis/src/python/pybis/material.py b/api-openbis-python3-pybis/src/python/pybis/material.py index 74b8e3b6040edba8df5cd80aecb4cf9613195506..f5ed4c6a54df290c5ba8bfcff24fd95705c5b849 100644 --- a/api-openbis-python3-pybis/src/python/pybis/material.py +++ b/api-openbis-python3-pybis/src/python/pybis/material.py @@ -15,6 +15,7 @@ from .attribute import AttrHolder from .openbis_object import OpenBisObject from .property import PropertyHolder +from .property_reformatter import PropertyReformatter from .utils import VERBOSE @@ -25,8 +26,11 @@ class Material(OpenBisObject): self.__dict__["entity"] = "material" self.__dict__["openbis"] = openbis_obj self.__dict__["type"] = type - self.__dict__["p"] = PropertyHolder(openbis_obj, type) + ph = PropertyHolder(openbis_obj, type) + self.__dict__["p"] = ph + self.__dict__["props"] = ph self.__dict__["a"] = AttrHolder(openbis_obj, "material", type) + self.__dict__["formatter"] = PropertyReformatter(openbis_obj) if data is not None: self._set_data(data) @@ -53,7 +57,7 @@ class Material(OpenBisObject): f"Property '{prop_name}' is mandatory and must not be None" ) - props = self.p._all_props() + props = self.formatter.format(self.p._all_props()) if self.is_new: request = self._new_attrs() diff --git a/api-openbis-python3-pybis/src/python/pybis/openbis_object.py b/api-openbis-python3-pybis/src/python/pybis/openbis_object.py index 812f6afe8f10745cac1ddb4d6d2458e0b84e0458..5afb398015beec585ff177b47a25ea1a3af9b000 100644 --- a/api-openbis-python3-pybis/src/python/pybis/openbis_object.py +++ b/api-openbis-python3-pybis/src/python/pybis/openbis_object.py @@ -12,15 +12,17 @@ # See the License for the specific language governing permissions and # limitations under the License. # -from .property import PropertyHolder +from collections import defaultdict + from .attribute import AttrHolder -from .utils import VERBOSE from .definitions import ( get_definition_for_entity, get_type_for_entity, get_method_for_entity, ) -from collections import defaultdict +from .property import PropertyHolder +from .property_reformatter import PropertyReformatter +from .utils import VERBOSE class OpenBisObject: @@ -39,6 +41,7 @@ class OpenBisObject: self.__dict__["type"] = type self.__dict__["p"] = PropertyHolder(openbis_obj, type) self.__dict__["a"] = AttrHolder(openbis_obj, self._entity, type) + self.__dict__["formatter"] = PropertyReformatter(openbis_obj) # existing OpenBIS object if data is not None: @@ -196,7 +199,7 @@ class OpenBisObject: f"Property '{prop_name}' is mandatory and must not be None" ) - props = self.p._all_props() + props = self.formatter.format(self.p._all_props()) # NEW if self.is_new: diff --git a/api-openbis-python3-pybis/src/python/pybis/property_reformatter.py b/api-openbis-python3-pybis/src/python/pybis/property_reformatter.py new file mode 100644 index 0000000000000000000000000000000000000000..12bab0878747b87643d05cb0bdcd4f0217cc7904 --- /dev/null +++ b/api-openbis-python3-pybis/src/python/pybis/property_reformatter.py @@ -0,0 +1,60 @@ +# Copyright ETH 2023 Zürich, Scientific IT Services +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +from datetime import datetime + +import pandas as pd + + +def is_of_openbis_supported_date_format(value): + is_supported = False + for date_format in PropertyReformatter.SUPPORTED_DATETIME_FORMATS: + try: + datetime.strptime(value, date_format) + is_supported = True + except ValueError: + pass + return is_supported + + +class PropertyReformatter: + """Helper class for reformatting of properties, is needed""" + LONG_DATETIME_FORMAT = "%Y-%m-%d %H:%M:%S" + + SUPPORTED_DATETIME_FORMATS = ["%Y-%m-%d", "%y-%m-%d", # ShortDateFormat + "%Y-%m-%d %H:%M", "%y-%m-%d %H:%M", # NormalDateFormat + "%Y-%m-%d %H:%M:%S", "%y-%m-%d %H:%M:%S"] # LongDateFormat + + def __init__(self, openbis_obj): + self.openbis = openbis_obj + + def format(self, properties): + if properties is None: + raise ValueError('properties can not be None!') + + for key, value in properties.items(): + property_type = self.openbis.get_property_type(key) + if property_type.dataType == 'TIMESTAMP': + properties[key] = self._format_timestamp(value) + + return properties + + def _format_timestamp(self, value): + if is_of_openbis_supported_date_format(value): + return value + timestamp = pd.to_datetime(value) + result = timestamp.strftime(PropertyReformatter.LONG_DATETIME_FORMAT) + print( + f'WARNING: "{value}" is not of any OpenBis supported datetime formats. Reformatting to "{result}"') + return result diff --git a/api-openbis-python3-pybis/src/python/pybis/sample.py b/api-openbis-python3-pybis/src/python/pybis/sample.py index f60147c1b67bea18345cb168b925c577094788a2..5514a7f6821d71de91e62fd10c0cc3426c62a991 100644 --- a/api-openbis-python3-pybis/src/python/pybis/sample.py +++ b/api-openbis-python3-pybis/src/python/pybis/sample.py @@ -13,9 +13,9 @@ # limitations under the License. # from .attribute import AttrHolder -from .definitions import openbis_definitions from .openbis_object import OpenBisObject from .property import PropertyHolder +from .property_reformatter import PropertyReformatter from .utils import VERBOSE @@ -23,7 +23,7 @@ class Sample(OpenBisObject, entity="sample", single_item_method_name="get_sample """A Sample (new: Object) is one of the most commonly used entities in openBIS.""" def __init__( - self, openbis_obj, type, project=None, data=None, props=None, attrs=None, **kwargs + self, openbis_obj, type, project=None, data=None, props=None, attrs=None, **kwargs ): self.__dict__["openbis"] = openbis_obj self.__dict__["type"] = type @@ -31,6 +31,7 @@ class Sample(OpenBisObject, entity="sample", single_item_method_name="get_sample self.__dict__["p"] = ph self.__dict__["props"] = ph self.__dict__["a"] = AttrHolder(openbis_obj, "sample", type) + self.__dict__["formatter"] = PropertyReformatter(openbis_obj) if data is not None: self._set_data(data) @@ -227,8 +228,8 @@ class Sample(OpenBisObject, entity="sample", single_item_method_name="get_sample for prop_name, prop in self.props._property_names.items(): if prop["mandatory"]: if ( - getattr(self.props, prop_name) is None - or getattr(self.props, prop_name) == "" + getattr(self.props, prop_name) is None + or getattr(self.props, prop_name) == "" ): raise ValueError( f"Property '{prop_name}' is mandatory and must not be None" @@ -236,6 +237,7 @@ class Sample(OpenBisObject, entity="sample", single_item_method_name="get_sample sampleProject = self.project.code if self.project else None sampleExperiment = self.experiment.code if self.experiment else None + properties = PropertyReformatter(self.openbis).format(self.props()) request = { "method": "createReportFromAggregationService", @@ -250,7 +252,7 @@ class Sample(OpenBisObject, entity="sample", single_item_method_name="get_sample "sampleExperiment": sampleExperiment, "sampleCode": self.code, "sampleType": self.type.code, - "sampleProperties": self.props(), + "sampleProperties": properties, "sampleParents": self.parents, "sampleParentsNew": None, "sampleChildrenNew": self.children, diff --git a/api-openbis-python3-pybis/src/python/setup.cfg b/api-openbis-python3-pybis/src/python/setup.cfg index 0ed57517007935ead08457c7520c1f6eced32020..33566edd7c598970b6f9c92d939c5b20ade4221f 100644 --- a/api-openbis-python3-pybis/src/python/setup.cfg +++ b/api-openbis-python3-pybis/src/python/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = PyBIS -version = 1.35.4rc1 +version = 1.35.4rc2 author = ID SIS • ETH Zürich author_email = openbis-support@id.ethz.ch license = Apache Software License Version 2.0 diff --git a/api-openbis-python3-pybis/src/python/setup.py b/api-openbis-python3-pybis/src/python/setup.py index 13bf0a77a67615bfc0e29cc12a2f1389305e7b51..4acf36d6494403aaee559792686a8d3c2383c2f7 100644 --- a/api-openbis-python3-pybis/src/python/setup.py +++ b/api-openbis-python3-pybis/src/python/setup.py @@ -26,7 +26,7 @@ with open("README.md", "r", encoding="utf-8") as fh: setup( name="PyBIS", - version="1.35.4rc1", + version="1.35.4rc2", author="ID SIS • ETH Zürich", author_email="openbis-support@id.ethz.ch", description="openBIS connection and interaction, optimized for using with Jupyter", diff --git a/api-openbis-python3-pybis/src/python/tests/test_dataset.py b/api-openbis-python3-pybis/src/python/tests/test_dataset.py index 616833729b97569d1e6f0d562b14761415d10e9e..9df35c4a92bd8fbe54867274b99e503a6ed8b279 100644 --- a/api-openbis-python3-pybis/src/python/tests/test_dataset.py +++ b/api-openbis-python3-pybis/src/python/tests/test_dataset.py @@ -12,9 +12,11 @@ # See the License for the specific language governing permissions and # limitations under the License. # +import datetime import os import re import time +import uuid import pytest from pybis.things import Things @@ -209,3 +211,49 @@ def test_create_new_dataset_v3_directory(space): assert dataset.permId is not None assert dataset.file_list == ["testdir/testfile"] + +def test_dataset_property_in_isoformat_date(space): + o = space.openbis + + timestamp = time.strftime("%a_%y%m%d_%H%M%S").lower() + + # Create custom TIMESTAMP property type + property_type_code = "test_property_type_" + timestamp + "_" + str(uuid.uuid4()) + pt_date = o.new_property_type( + code=property_type_code, + label='custom property of data type timestamp', + description='custom property created in unit test', + dataType='TIMESTAMP', + ) + pt_date.save() + + # Create new dataset type + type_code = "test_dataset_type_" + timestamp + "_" + str(uuid.uuid4()) + dataset_type = o.new_dataset_type(code=type_code) + dataset_type.save() + + # Assign created property to new dataset type + dataset_type.assign_property(property_type_code) + + # Create new dataset with timestamp property in non-supported format + timestamp_property = datetime.datetime.now().isoformat() + testfile_path = os.path.join(os.path.dirname(__file__), "testdir/testfile") + + dataset = o.new_dataset( + type=type_code, + experiment="/DEFAULT/DEFAULT/DEFAULT", + files=[testfile_path], + props={property_type_code: timestamp_property}, + ) + dataset.save() + + # New dataset case + assert len(dataset.p()) == 1 + assert dataset.p[property_type_code] is not None + + # Update dataset case + dataset.p[property_type_code] = timestamp_property + dataset.save() + + assert len(dataset.p()) == 1 + assert dataset.p[property_type_code] is not None diff --git a/api-openbis-python3-pybis/src/python/tests/test_experiment.py b/api-openbis-python3-pybis/src/python/tests/test_experiment.py index 557b0c6eb12d4c3060e7e98b0f13ade6092bca69..68a0c6ec0ed7b9c8c741912fbd0f522a1944a93e 100644 --- a/api-openbis-python3-pybis/src/python/tests/test_experiment.py +++ b/api-openbis-python3-pybis/src/python/tests/test_experiment.py @@ -12,20 +12,18 @@ # See the License for the specific language governing permissions and # limitations under the License. # -import json -import random -import re -import pytest +import datetime import time -from pybis import DataSet -from pybis import Openbis +import uuid + +import pytest def test_create_delete_experiment(space): - o=space.openbis + o = space.openbis timestamp = time.strftime('%a_%y%m%d_%H%M%S').upper() - new_code='test_experiment_'+timestamp + new_code = 'test_experiment_' + timestamp with pytest.raises(TypeError): # experiments must be assigned to a project @@ -52,7 +50,7 @@ def test_create_delete_experiment(space): e_exists = o.get_experiment(e_new.permId) assert e_exists is not None - e_new.delete('delete test experiment '+new_code.upper()) + e_new.delete('delete test experiment ' + new_code.upper()) with pytest.raises(ValueError): e_no_longer_exists = o.get_experiment(e_exists.permId) @@ -60,9 +58,53 @@ def test_create_delete_experiment(space): def test_get_experiments(space): # test paging - o=space.openbis + o = space.openbis current_datasets = o.get_experiments(start_with=1, count=1) assert current_datasets is not None # we cannot assert == 1, because search is delayed due to lucene search... assert len(current_datasets) <= 1 + +def test_experiment_property_in_isoformat_date(space): + o = space.openbis + + timestamp = time.strftime("%a_%y%m%d_%H%M%S").lower() + + # Create custom TIMESTAMP property type + property_type_code = "test_property_type_" + timestamp + "_" + str(uuid.uuid4()) + pt_date = o.new_property_type( + code=property_type_code, + label='custom property of data type timestamp for experiment', + description='custom property created in unit test', + dataType='TIMESTAMP', + ) + pt_date.save() + + type_code = "test_experiment_type_" + timestamp + "_" + str(uuid.uuid4()) + experiment_type = o.new_experiment_type( + type_code, + description=None, + validationPlugin=None, + ) + experiment_type.save() + experiment_type.assign_property(property_type_code) + + project = o.get_projects()[0] + code = "my_experiment_{}".format(timestamp) + timestamp_property = datetime.datetime.now().isoformat() + props = {property_type_code: timestamp_property} + + exp = o.new_experiment(code=code, project=project, type=type_code, props=props) + exp.save() + + # New experiment case + assert len(exp.p()) == 1 + assert exp.p[property_type_code] is not None + + # Update experiment case + exp.p[property_type_code] = timestamp_property + exp.save() + + assert len(exp.p()) == 1 + assert exp.p[property_type_code] is not None + diff --git a/api-openbis-python3-pybis/src/python/tests/test_sample.py b/api-openbis-python3-pybis/src/python/tests/test_sample.py index b6600b2951370d1c17d672a93fa5fbf668e979d8..595e6fb097414cd162ad3253bf4658f9dab914ab 100644 --- a/api-openbis-python3-pybis/src/python/tests/test_sample.py +++ b/api-openbis-python3-pybis/src/python/tests/test_sample.py @@ -12,12 +12,14 @@ # See the License for the specific language governing permissions and # limitations under the License. # +import datetime import random import re -import uuid -import pytest import time +import uuid + import pandas as pd +import pytest def test_create_delete_sample(space): @@ -54,11 +56,11 @@ def test_create_delete_sample(space): assert sample_by_permId.registrationDate is not None # check date format: 2019-03-22 11:36:40 assert ( - re.search( - r"^\d{4}\-\d{2}\-\d{2} \d{2}\:\d{2}\:\d{2}$", - sample_by_permId.registrationDate, - ) - is not None + re.search( + r"^\d{4}\-\d{2}\-\d{2} \d{2}\:\d{2}\:\d{2}$", + sample_by_permId.registrationDate, + ) + is not None ) # get sample by identifier @@ -91,7 +93,7 @@ def test_parent_child(space): sample_type = "UNKNOWN" timestamp = time.strftime("%a_%y%m%d_%H%M%S").upper() parent_code = ( - "parent_sample_{}".format(timestamp) + "_" + str(random.randint(0, 1000)) + "parent_sample_{}".format(timestamp) + "_" + str(random.randint(0, 1000)) ) sample_parent = o.new_sample(code=parent_code, type=sample_type, space=space) sample_parent.save() @@ -106,7 +108,7 @@ def test_parent_child(space): ex_sample_parents = sample_child.get_parents() ex_sample_parent = ex_sample_parents[0] assert ( - ex_sample_parent.identifier == "/{}/{}".format(space.code, parent_code).upper() + ex_sample_parent.identifier == "/{}/{}".format(space.code, parent_code).upper() ) ex_sample_children = ex_sample_parent.get_children() @@ -137,3 +139,62 @@ def test_empty_data_frame(openbis_instance): pa = s.get_property_assignments() pd.testing.assert_frame_equal(pa.df, pd.DataFrame()) + + +def test_sample_property_in_isoformat_date(space): + o = space.openbis + + timestamp = time.strftime("%a_%y%m%d_%H%M%S").lower() + + # Create custom TIMESTAMP property type + property_type_code = "test_property_type_" + timestamp + "_" + str(uuid.uuid4()) + pt_date = o.new_property_type( + code=property_type_code, + label='custom property of data type timestamp', + description='custom property created in unit test', + dataType='TIMESTAMP', + ) + pt_date.save() + + # Create custom sample type + sample_type_code = "test_sample_type_" + timestamp + "_" + str(uuid.uuid4()) + sample_type = o.new_sample_type( + code=sample_type_code, + generatedCodePrefix="S", + autoGeneratedCode=True, + listable=True, + ) + sample_type.save() + + # Assign created property to new sample type + sample_type.assign_property( + prop=property_type_code, + section='', + ordinal=5, + mandatory=False, + showInEditView=True, + showRawValueInForms=True + ) + + sample_code = "my_sample_{}".format(timestamp) + # Create new sample with timestamp property in non-supported format + timestamp_property = datetime.datetime.now().isoformat() + sample = o.new_sample(code=sample_code, + type=sample_type_code, + space=space, + props={ + property_type_code: timestamp_property}) + sample.save() + + # New item case + assert len(sample.props()) == 1 + key, val = sample.props().popitem() + assert key == property_type_code + + # Update item case + sample.props = {property_type_code: timestamp_property} + sample.save() + + assert len(sample.props()) == 1 + key, val = sample.props().popitem() + assert key == property_type_code diff --git a/app-openbis-command-line/src/python/CHANGELOG.md b/app-openbis-command-line/src/python/CHANGELOG.md index 10f574390cf1741ba669ad68aa36311716c1d0bd..675e0d034e01550c52bb0b7648fa85cd6d4969c0 100644 --- a/app-openbis-command-line/src/python/CHANGELOG.md +++ b/app-openbis-command-line/src/python/CHANGELOG.md @@ -1,3 +1,29 @@ +# New in version 0.4.2 + +* Added filtering by object in object and data_set search commands +* Added recursive search to object and data_set search commands +* Updated documentation regarding authentication + +# New in version 0.4.1 + +* Fixed parameters for determine_hostname method in addref functionality + +# New in version 0.4.0.1 + +* Minor fixes to physical data handling + +# New in version 0.4.0 + +* Implementation of physical data handling + +# New in version 0.3.0 + +* changed pybis dependency to version >= 1.33.0 + +# New in version 0.2.3 + +* Fixes to CRC32 calculation + # New in version 0.2.2 * added compatibility with git-annex 8.2 diff --git a/app-openbis-command-line/src/python/obis/__init__.py b/app-openbis-command-line/src/python/obis/__init__.py index eaaa15140e978d4a96a2ffb4c38c467ad19d650d..ca2cdd57ee2dfcd20ce8bc2a7a0e04837f651243 100644 --- a/app-openbis-command-line/src/python/obis/__init__.py +++ b/app-openbis-command-line/src/python/obis/__init__.py @@ -14,6 +14,6 @@ # __author__ = "ID SIS • ETH Zürich" __email__ = "openbis-support@id.ethz.ch" -__version__ = "0.4.0.1" +__version__ = "0.4.2rc1" from .dm import * diff --git a/app-openbis-command-line/src/python/obis/dm/commands/openbis_command.py b/app-openbis-command-line/src/python/obis/dm/commands/openbis_command.py index 68e7db6d4ed2d3904c99de55efb2508fb83e5b7e..e694b4f32007c7e991a6ce09d103809013954a7c 100644 --- a/app-openbis-command-line/src/python/obis/dm/commands/openbis_command.py +++ b/app-openbis-command-line/src/python/obis/dm/commands/openbis_command.py @@ -22,7 +22,7 @@ import pybis from .. import config as dm_config from ..command_result import CommandException from ..command_result import CommandResult -from ..utils import complete_openbis_config +from ..utils import complete_openbis_config, OperationType class OpenbisCommand(object): @@ -154,7 +154,8 @@ class OpenbisCommand(object): def login(self): """ Restore session token if available. """ if 'config' in self.config_dict.keys(): - if 'openbis_token' in self.config_dict['config'].keys(): + if 'openbis_token' in self.config_dict['config'].keys() and \ + self.config_dict['config']['openbis_token'] is not None: self.openbis.set_token(self.config_dict['config']['openbis_token'], True) """ Checks for valid session and asks user for password if login is needed. """ @@ -225,8 +226,8 @@ class OpenbisCommand(object): # ask user hostname = self.ask_for_hostname(socket.gethostname()) # store - self.data_mgmt.config('config', True, False, - prop='hostname', value=hostname, set=True) + self.data_mgmt.config('config', True, False, OperationType.SET, prop='hostname', + value=hostname) return hostname def ask_for_hostname(self, hostname): diff --git a/app-openbis-command-line/src/python/obis/dm/commands/search.py b/app-openbis-command-line/src/python/obis/dm/commands/search.py index bb41b68df36cba2320564cee77260d6f9e2c5368..d4570b2ccdbf14bb03106e2f15e8270ed2193b8a 100644 --- a/app-openbis-command-line/src/python/obis/dm/commands/search.py +++ b/app-openbis-command-line/src/python/obis/dm/commands/search.py @@ -19,43 +19,53 @@ from ..utils import cd from ...scripts.click_util import click_echo +def _dfs(objects, prop, func): + """Helper function that perform DFS search over children graph of objects""" + stack = [getattr(openbis_obj, prop) for openbis_obj in + objects] # datasets and samples provide children in different formats + downloaded = {getattr(openbis_obj, prop): openbis_obj for openbis_obj in objects} + visited = set() + stack.reverse() + output = [] + while stack: + key = stack.pop() + if key not in visited: + visited.add(key) + if key in downloaded: + obj = downloaded[key] + else: + obj = func(key) + output += [obj] + children = obj.children.copy() + children.reverse() + for child in children: + stack.append(child) + return output + + class Search(OpenbisCommand): """ - Command to search data in openBIS. + Command to search samples or datasets in openBIS. """ - def __init__(self, dm, filters, save_path): + def __init__(self, dm, filters, recursive, save_path): """ :param dm: data management :param filters: Dictionary of filter to be used during search + :param recursive: Flag indicating recursive search in children :param save_path: Path to save results. If not set, results will not be saved. """ self.filters = filters + self.recursive = recursive self.save_path = save_path self.load_global_config(dm) + self.props = "*" + self.attrs = ["parents", "children"] super(Search, self).__init__(dm) def search_samples(self): - properties = None - if self.filters['property_code'] is not None and self.filters['property_value'] is not None: - properties = { - self.filters['property_code']: self.filters['property_value'], - } - - args = dict(space=self.filters['space'], - project=self.filters['project'], # Not Supported with Project Samples disabled - experiment=self.filters['experiment'], - type=self.filters['type_code'], - where=properties, - attrs=["parents", "children"], - props="*") # Fetch all properties - - if self.filters['registration_date'] is not None: - args['registrationDate'] = self.filters['registration_date'] - if self.filters['modification_date'] is not None: - args['modificationDate'] = self.filters['modification_date'] + search_results = self._search_samples() - search_results = self.openbis.get_samples(**args) click_echo(f"Objects found: {len(search_results)}") if self.save_path is not None: click_echo(f"Saving search results in {self.save_path}") @@ -66,37 +76,81 @@ class Search(OpenbisCommand): return CommandResult(returncode=0, output="Search completed.") + def _search_samples(self): + """Helper method to search samples""" + + if "object_code" in self.filters: + results = self.openbis.get_samples(identifier=self.filters['object_code'], + attrs=self.attrs, props=self.props) + else: + args = self._get_filtering_args(self.props) + results = self.openbis.get_samples(**args) + + if self.recursive: + output = _dfs(results.objects, 'identifier', + self.openbis.get_sample) # samples provide identifiers as children + search_results = self.openbis._sample_list_for_response(props=self.props, + response=[sample.data for sample + in output], + parsed=True) + else: + search_results = results + return search_results + def search_data_sets(self): if self.save_path is not None and self.fileservice_url() is None: return CommandResult(returncode=-1, output="Configuration fileservice_url needs to be set for download.") - properties = None + if self.recursive: + search_results = self._search_samples() # Look for samples recursively + o = [] + for sample in search_results.objects: # get datasets + o += sample.get_datasets( + attrs=self.attrs, props=self.props) + output = _dfs(o, 'permId', # datasets provide permIds as children + self.openbis.get_dataset) # look for child datasets of sample datasets + datasets = self.openbis._dataset_list_for_response(props=self.props, + response=[dataset.data for dataset + in output], + parsed=True) + else: + if "object_code" in self.filters: + results = self.openbis.get_sample(self.filters['object_code']).get_datasets( + attrs=self.attrs, props=self.props) + else: + args = self._get_filtering_args(self.props) + results = self.openbis.get_datasets(**args) + datasets = results + + click_echo(f"Data sets found: {len(datasets)}") + if self.save_path is not None: + click_echo(f"Saving search results in {self.save_path}") + with cd(self.data_mgmt.invocation_path): + datasets.df.to_csv(self.save_path, index=False) + else: + click_echo(f"Search results:\n{datasets}") + + return CommandResult(returncode=0, output="Search completed.") + + def _get_filtering_args(self, props): + where = None if self.filters['property_code'] is not None and self.filters['property_value'] is not None: - properties = { + where = { self.filters['property_code']: self.filters['property_value'], } + args = dict(space=self.filters['space'], - project=self.filters['project'], # Not Supported with Project Samples disabled + project=self.filters['project'], + # Not Supported with Project Samples disabled experiment=self.filters['experiment'], type=self.filters['type_code'], - where=properties, - attrs=["parents", "children"], - props="*") # Fetch all properties + where=where, + attrs=self.attrs, + props=props) if self.filters['registration_date'] is not None: args['registrationDate'] = self.filters['registration_date'] if self.filters['modification_date'] is not None: args['modificationDate'] = self.filters['modification_date'] - - datasets = self.openbis.get_datasets(**args) - - click_echo(f"Data sets found: {len(datasets)}") - if self.save_path is not None: - click_echo(f"Saving search results in {self.save_path}") - with cd(self.data_mgmt.invocation_path): - datasets.df.to_csv(self.save_path, index=False) - else: - click_echo(f"Search results:\n{datasets}") - - return CommandResult(returncode=0, output="Search completed.") + return args diff --git a/app-openbis-command-line/src/python/obis/dm/data_mgmt.py b/app-openbis-command-line/src/python/obis/dm/data_mgmt.py index eacdecccc553ffb793bd2690b31ae1f66bd7e5e2..e1ddceafd4da8109d269bee06b2ba3360d8d9c71 100644 --- a/app-openbis-command-line/src/python/obis/dm/data_mgmt.py +++ b/app-openbis-command-line/src/python/obis/dm/data_mgmt.py @@ -71,7 +71,8 @@ def DataMgmt(echo_func=None, settings_resolver=None, openbis_config={}, git_conf repository_type = Type.LINK if repository_type == Type.PHYSICAL: - return PhysicalDataMgmt(settings_resolver, None, None, openbis, log, data_path, + complete_openbis_config(openbis_config, settings_resolver) + return PhysicalDataMgmt(settings_resolver, openbis_config, None, openbis, log, data_path, metadata_path, invocation_path) else: complete_git_config(git_config) @@ -229,17 +230,19 @@ class AbstractDataMgmt(metaclass=abc.ABCMeta): return @abc.abstractmethod - def search_object(self, filters, save): + def search_object(self, filters, recursive, save): """Search for objects in openBIS using filtering criteria. :param filters: dictionary of filter parameters + :param recursive: Flag indicating if search should include children recursively :param save: File path to save results. If missing, search results will not be saved. """ return @abc.abstractmethod - def search_data_set(self, filters, save): + def search_data_set(self, filters, recursive, save): """Search for datasets in openBIS using filtering criteria. :param filters: dictionary of filter parameters + :param recursive: Flag indicating if search should include children recursively :param save: File path to save results. If missing, search results will not be saved. """ return @@ -642,12 +645,12 @@ class PhysicalDataMgmt(AbstractDataMgmt): cmd = Upload(self, sample_id, data_set_type, files) return cmd.run() - def search_object(self,filters, save): - cmd = Search(self, filters, save) + def search_object(self, filters, recursive, save): + cmd = Search(self, filters, recursive, save) return cmd.search_samples() - def search_data_set(self, filters, save): - cmd = Search(self, filters, save) + def search_data_set(self, filters, recursive, save): + cmd = Search(self, filters, recursive, save) return cmd.search_data_sets() def config(self, category, is_global, is_data_set_property, operation_type, prop=None, diff --git a/app-openbis-command-line/src/python/obis/dm/data_mgmt_test.py b/app-openbis-command-line/src/python/obis/dm/data_mgmt_test.py index 99274b686a4f29dae7d6b252b1a596c70be723ae..2869aaf0aa01e98aaf77f8ef5cbc728165d942c5 100644 --- a/app-openbis-command-line/src/python/obis/dm/data_mgmt_test.py +++ b/app-openbis-command-line/src/python/obis/dm/data_mgmt_test.py @@ -213,17 +213,17 @@ def test_external_dms_code_and_address(tmpdir): hostname = socket.gethostname() expected_edms_id = obis_sync.external_dms_id() result = obis_sync.git_wrapper.git_init() - assert result.failure() == False + assert result.failure() is False result = obis_sync.git_wrapper.git_top_level_path() - assert result.failure() == False + assert result.failure() is False edms_path, folder = os.path.split(result.output) path_hash = hashlib.sha1(edms_path.encode("utf-8")).hexdigest()[0:8] if expected_edms_id is None: expected_edms_id = "{}-{}-{}".format(user, hostname, path_hash).upper() # when - result = obis_sync.get_or_create_external_data_management_system(); + result = obis_sync.get_or_create_external_data_management_system() # then - assert result.failure() == False + assert result.failure() is False dm.openbis.get_external_data_management_system.assert_called_with(expected_edms_id) diff --git a/app-openbis-command-line/src/python/obis/dm/git.py b/app-openbis-command-line/src/python/obis/dm/git.py index c22df44daa7cfe6f7bfff37b38cc98c119c1576e..0c5ba19353d698b6ab72177ff65ea04425f344fb 100644 --- a/app-openbis-command-line/src/python/obis/dm/git.py +++ b/app-openbis-command-line/src/python/obis/dm/git.py @@ -17,12 +17,14 @@ import shutil from .checksum import ChecksumGeneratorCrc32, ChecksumGeneratorGitAnnex from .utils import run_shell +from ..scripts.click_util import click_echo class GitWrapper(object): """A wrapper on commands to git and git annex.""" - def __init__(self, git_path=None, git_annex_path=None, find_git=None, data_path=None, metadata_path=None, invocation_path=None): + def __init__(self, git_path=None, git_annex_path=None, find_git=None, data_path=None, + metadata_path=None, invocation_path=None): self.git_path = git_path self.git_annex_path = git_annex_path self.data_path = data_path @@ -39,17 +41,20 @@ class GitWrapper(object): cmd += params return run_shell(cmd, strip_leading_whitespace=strip_leading_whitespace) - def can_run(self): """Return true if the perquisites are satisfied to run (git and git annex)""" if self.git_path is None: + click_echo('No git path found!') return False if self.git_annex_path is None: + click_echo('No git-annex path found!') return False if self._git(['help']).failure(): + click_echo('Can not run git!') # git help should have a returncode of 0 return False if self._git(['annex', 'help']).failure(): + click_echo('Can not run git-annex!') # git help should have a returncode of 0 return False result = run_shell([self.git_path, 'annex', 'version']) @@ -60,7 +65,7 @@ class GitWrapper(object): try: self.annex_major_version = int(self.annex_version.split(".")[0]) except Exception as e: - print("Invalid git-annex version line:",result.output) + print("Invalid git-annex version line:", result.output) return False return True @@ -199,9 +204,11 @@ class GitRepoFileInfo(object): def cksum(self, files, git_annex_hash_as_checksum=False): if git_annex_hash_as_checksum == False: - checksum_generator = ChecksumGeneratorCrc32(self.git_wrapper.data_path, self.git_wrapper.metadata_path) + checksum_generator = ChecksumGeneratorCrc32(self.git_wrapper.data_path, + self.git_wrapper.metadata_path) else: - checksum_generator = ChecksumGeneratorGitAnnex(self.git_wrapper.data_path, self.git_wrapper.metadata_path) + checksum_generator = ChecksumGeneratorGitAnnex(self.git_wrapper.data_path, + self.git_wrapper.metadata_path) checksums = [] diff --git a/app-openbis-command-line/src/python/obis/dm/utils.py b/app-openbis-command-line/src/python/obis/dm/utils.py index 580e7e2cbcc0bc914507a96ed9bacfe6c4140269..7ecf98a8c94bd0e5383b1b04f4f7a96f41e03e6b 100644 --- a/app-openbis-command-line/src/python/obis/dm/utils.py +++ b/app-openbis-command-line/src/python/obis/dm/utils.py @@ -44,12 +44,12 @@ def complete_openbis_config(config, resolver, local_only=True): config['verify_certificates'] = config_dict['verify_certificates'] if config.get('token') is None: config['token'] = None - if config.get('is_physical') is None: - config['is_physical'] = None + if config.get('is_physical') is None and config_dict['is_physical'] is not None: + config['is_physical'] = config_dict['is_physical'] if config.get( 'allow_http_but_do_not_use_this_in_production_and_only_within_safe_networks') is None: config['allow_http_but_do_not_use_this_in_production_and_only_within_safe_networks'] = not \ - config_dict['allow_only_https'] + config_dict['allow_only_https'] def complete_git_config(config): diff --git a/app-openbis-command-line/src/python/obis/scripts/cli.py b/app-openbis-command-line/src/python/obis/scripts/cli.py index 33cc94059f4712f7e5d8d54a4c7ca3a424ce105a..b64e610d0b34f19db84b5f657fc7844eba5dd542 100644 --- a/app-openbis-command-line/src/python/obis/scripts/cli.py +++ b/app-openbis-command-line/src/python/obis/scripts/cli.py @@ -217,14 +217,14 @@ def _clear(ctx, settings): @click.option('-g', '--is_global', default=False, is_flag=True, help='Get global or local.') @click.pass_context def settings(ctx, is_global): - """ Get all settings. - """ + """ External Data Store: Get all settings. """ ctx.obj['is_global'] = is_global @settings.command('get') @click.pass_context def settings_get(ctx): + """ External Data Store: Get setting. """ runner = DataMgmtRunner(ctx.obj, halt_on_error_log=False) settings = runner.get_settings() settings_str = json.dumps(settings, indent=4, sort_keys=True) @@ -237,8 +237,7 @@ def settings_get(ctx): @click.option('-g', '--is_global', default=False, is_flag=True, help='Set/get global or local.') @click.pass_context def repository(ctx, is_global): - """ Get/set settings related to the repository. - """ + """ External Data Store: Get/set settings related to the repository. """ runner = DataMgmtRunner(ctx.obj, halt_on_error_log=False) ctx.obj['is_global'] = is_global ctx.obj['runner'] = runner @@ -249,6 +248,7 @@ def repository(ctx, is_global): @click.argument('settings', type=SettingsSet(), nargs=-1) @click.pass_context def repository_set(ctx, settings): + """ External Data Store: Set settings related to the repository. """ return ctx.obj['runner'].run("repository_set", lambda dm: _set(ctx, settings)) @@ -256,6 +256,7 @@ def repository_set(ctx, settings): @click.argument('settings', type=SettingsGet(), nargs=-1) @click.pass_context def repository_get(ctx, settings): + """ External Data Store: Get settings related to the repository. """ return ctx.obj['runner'].run("repository_get", lambda dm: _get(ctx, settings)) @@ -263,6 +264,7 @@ def repository_get(ctx, settings): @click.argument('settings', type=SettingsClear(), nargs=-1) @click.pass_context def repository_clear(ctx, settings): + """ External Data Store: Clear settings related to the repository. """ return ctx.obj['runner'].run("repository_clear", lambda dm: _clear(ctx, settings)) @@ -275,6 +277,8 @@ _search_params = [ click.option('-space', '--space', default=None, help='Space code'), click.option('-project', '--project', default=None, help='Full project identification code'), click.option('-experiment', '--experiment', default=None, help='Full experiment code'), + click.option('-object', '--object', 'object_code', default=None, + help='Object identification information, it can be permId or identifier'), click.option('-type', '--type', 'type_code', default=None, help='Type code'), click.option('-property', 'property_code', default=None, help='Property code'), click.option('-property-value', 'property_value', default=None, @@ -284,6 +288,8 @@ _search_params = [ click.option('-modification-date', '--modification-date', 'modification_date', default=None, help='Modification date, it can be in the format "oYYYY-MM-DD" (e.g. ">2023-01-01")'), click.option('-save', '--save', default=None, help='Filename to save results'), + click.option('-r', '--recursive', 'recursive', is_flag=True, default=False, + help='Search data recursively'), ] @@ -293,8 +299,7 @@ _search_params = [ help='Configure data set property.') @click.pass_context def data_set(ctx, is_global, is_data_set_property): - """ Get/set settings related to the data set. - """ + """ External Data Store: Get/set settings related to the data set. """ runner = DataMgmtRunner(ctx.obj, halt_on_error_log=False) ctx.obj['is_global'] = is_global ctx.obj['is_data_set_property'] = is_data_set_property @@ -306,6 +311,7 @@ def data_set(ctx, is_global, is_data_set_property): @click.argument('data_set_settings', type=SettingsSet(), nargs=-1) @click.pass_context def data_set_set(ctx, data_set_settings): + """ External Data Store: Set settings related to the data set. """ return ctx.obj['runner'].run("data_set_set", lambda dm: _set(ctx, data_set_settings)) @@ -313,6 +319,7 @@ def data_set_set(ctx, data_set_settings): @click.argument('data_set_settings', type=SettingsGet(), nargs=-1) @click.pass_context def data_set_get(ctx, data_set_settings): + """ External Data Store: Get settings related to the data set. """ return ctx.obj['runner'].run("data_set_get", lambda dm: _get(ctx, data_set_settings)) @@ -320,6 +327,7 @@ def data_set_get(ctx, data_set_settings): @click.argument('data_set_settings', type=SettingsClear(), nargs=-1) @click.pass_context def data_set_clear(ctx, data_set_settings): + """ External Data Store: Clear settings related to the data set. """ return ctx.obj['runner'].run("data_set_clear", lambda dm: _clear(ctx, data_set_settings)) @@ -327,10 +335,13 @@ def data_set_clear(ctx, data_set_settings): @add_params(_search_params) @click.pass_context def data_set_search(ctx, type_code, space, project, experiment, registration_date, - modification_date, property_code, property_value, save): - if all(v is None for v in - [type_code, space, project, experiment, registration_date, modification_date, - property_code, property_value]): + modification_date, object_code, property_code, property_value, save, recursive): + """Standard Data Store: Search data sets given the filtering criteria or object identifier. + Results of this command can be used in `obis download`.""" + filtering_arguments = [type_code, space, project, experiment, registration_date, + modification_date, + property_code, property_value] + if all(v is None for v in filtering_arguments + [object_code]): click_echo("You must provide at least one filtering criteria!") return -1 if (property_code is None and property_value is not None) or ( @@ -338,12 +349,17 @@ def data_set_search(ctx, type_code, space, project, experiment, registration_dat click_echo("Property code and property value need to be specified!") return -1 ctx.obj['runner'] = DataMgmtRunner(ctx.obj, halt_on_error_log=False) - filters = dict(type_code=type_code, space=space, - project=project, experiment=experiment, property_code=property_code, - registration_date=registration_date, modification_date=modification_date, - property_value=property_value) + if object_code is not None: + if any(v is not None for v in filtering_arguments): + click_echo("Object parameter detected! Other filtering arguments will be omitted!") + filters = dict(object_code=object_code) + else: + filters = dict(type_code=type_code, space=space, + project=project, experiment=experiment, property_code=property_code, + registration_date=registration_date, modification_date=modification_date, + property_value=property_value) return ctx.obj['runner'].run("data_set_search", - lambda dm: dm.search_data_set(filters, save)), + lambda dm: dm.search_data_set(filters, recursive, save)), # # object: object_id @@ -353,7 +369,9 @@ def data_set_search(ctx, type_code, space, project, experiment, registration_dat @click.option('-g', '--is_global', default=False, is_flag=True, help='Set/get global or local.') @click.pass_context def object(ctx, is_global): - """ Get/set settings related to the object. + """ External Data Store: Get/set properties related to the object. + + Standard Data Store: Get/set properties of objects connected to downloaded datasets. """ runner = DataMgmtRunner(ctx.obj, halt_on_error_log=False) ctx.obj['is_global'] = is_global @@ -365,6 +383,10 @@ def object(ctx, is_global): @click.argument('object_settings', type=SettingsSet(), nargs=-1) @click.pass_context def object_set(ctx, object_settings): + """ External Data Store: Set properties related to the object. + + Standard Data Store: Set property to all objects connected to downloaded datasets. + """ return ctx.obj['runner'].run("object_set", lambda dm: _set(ctx, object_settings)) @@ -372,6 +394,10 @@ def object_set(ctx, object_settings): @click.argument('object_settings', type=SettingsGet(), nargs=-1) @click.pass_context def object_get(ctx, object_settings): + """ External Data Store: Set properties related to the object. + + Standard Data Store: Get given properties of all objects connected to downloaded datasets. + """ return ctx.obj['runner'].run("object_get", lambda dm: _get(ctx, object_settings)) @@ -379,6 +405,7 @@ def object_get(ctx, object_settings): @click.argument('object_settings', type=SettingsClear(), nargs=-1) @click.pass_context def object_clear(ctx, object_settings): + """ External Data Store: Clear properties related to the object. """ return ctx.obj['runner'].run("object_clear", lambda dm: _clear(ctx, object_settings)) @@ -386,10 +413,11 @@ def object_clear(ctx, object_settings): @add_params(_search_params) @click.pass_context def object_search(ctx, type_code, space, project, experiment, registration_date, - modification_date, property_code, property_value, save): - if all(v is None for v in - [type_code, space, project, experiment, registration_date, modification_date, - property_code, property_value]): + modification_date, object_code, property_code, property_value, save, recursive): + """Standard Data Store: Search for objects using a filtering criteria or object identifier.""" + filtering_arguments = [type_code, space, project, experiment, registration_date, + modification_date, property_code, property_value] + if all(v is None for v in filtering_arguments + [object_code]): click_echo("You must provide at least one filtering criteria!") return -1 if (property_code is None and property_value is not None) or ( @@ -397,12 +425,17 @@ def object_search(ctx, type_code, space, project, experiment, registration_date, click_echo("Property code and property value need to be specified!") return -1 ctx.obj['runner'] = DataMgmtRunner(ctx.obj, halt_on_error_log=False) - filters = dict(type_code=type_code, space=space, - project=project, experiment=experiment, property_code=property_code, - registration_date=registration_date, modification_date=modification_date, - property_value=property_value) + if object_code is not None: + if any(v is not None for v in filtering_arguments): + click_echo("Object parameter detected! Other filtering arguments will be omitted!") + filters = dict(object_code=object_code) + else: + filters = dict(type_code=type_code, space=space, + project=project, experiment=experiment, property_code=property_code, + registration_date=registration_date, modification_date=modification_date, + property_value=property_value) return ctx.obj['runner'].run("object_search", - lambda dm: dm.search_object(filters, save)) + lambda dm: dm.search_object(filters, recursive, save)) # # collection: collection_id @@ -412,7 +445,9 @@ def object_search(ctx, type_code, space, project, experiment, registration_date, @click.option('-g', '--is_global', default=False, is_flag=True, help='Set/get global or local.') @click.pass_context def collection(ctx, is_global): - """ Get/set settings related to the collection. + """ External Data Store: Get/set settings related to the collection. + + Standard Data Store: Get/set properties of all collections connected to downloaded datasets. """ runner = DataMgmtRunner(ctx.obj, halt_on_error_log=False) ctx.obj['is_global'] = is_global @@ -424,6 +459,10 @@ def collection(ctx, is_global): @click.argument('settings', type=SettingsSet(), nargs=-1) @click.pass_context def collection_set(ctx, settings): + """ External Data Store: Set settings related to the collection. + + Standard Data Store: Set given properties of all collections connected to downloaded datasets. + """ return ctx.obj['runner'].run("collection_set", lambda dm: _set(ctx, settings)) @@ -431,6 +470,10 @@ def collection_set(ctx, settings): @click.argument('settings', type=SettingsGet(), nargs=-1) @click.pass_context def collection_get(ctx, settings): + """ External Data Store: Get settings related to the collection. + + Standard Data Store: Get given properties of all collections connected to downloaded datasets. + """ return ctx.obj['runner'].run("collection_get", lambda dm: _get(ctx, settings)) @@ -438,6 +481,7 @@ def collection_get(ctx, settings): @click.argument('settings', type=SettingsClear(), nargs=-1) @click.pass_context def collection_clear(ctx, settings): + """External Data Store: Clear settings related to the collection.""" return ctx.obj['runner'].run("collection_clear", lambda dm: _clear(ctx, settings)) @@ -448,7 +492,9 @@ def collection_clear(ctx, settings): @click.option('-g', '--is_global', default=False, is_flag=True, help='Set/get global or local.') @click.pass_context def config(ctx, is_global): - """ Get/set configurations. + """External Data Store: Get/set configurations. + + Standard Data Store: Get/set configurations. """ if is_global is True: runner = DataMgmtRunner(ctx.obj, halt_on_error_log=False, is_physical=True) @@ -463,6 +509,10 @@ def config(ctx, is_global): @click.argument('settings', type=SettingsSet(), nargs=-1) @click.pass_context def config_set(ctx, settings): + """External Data Store: Set configurations. + + Standard Data Store: Set configurations. + """ return ctx.obj['runner'].run("config_set", lambda dm: _set(ctx, settings)) @@ -470,6 +520,10 @@ def config_set(ctx, settings): @click.argument('settings', type=SettingsGet(), nargs=-1) @click.pass_context def config_get(ctx, settings): + """External Data Store: Get configurations. + + Standard Data Store: Get configurations. + """ return ctx.obj['runner'].run("config_get", lambda dm: _get(ctx, settings)) @@ -477,6 +531,8 @@ def config_get(ctx, settings): @click.argument('settings', type=SettingsClear(), nargs=-1) @click.pass_context def config_clear(ctx, settings): + """External Data Store: Clear configurations. + """ return ctx.obj['runner'].run("config_clear", lambda dm: _clear(ctx, settings)) @@ -500,6 +556,8 @@ _commit_params = [ @click.pass_context @add_params(_commit_params) def repository_commit(ctx, msg, auto_add, ignore_missing_parent, repository): + """External Data Store: Commit the repository to git and inform openBIS. + """ return ctx.obj['runner'].run("commit", lambda dm: dm.commit(msg, auto_add, ignore_missing_parent), repository) @@ -509,6 +567,8 @@ def repository_commit(ctx, msg, auto_add, ignore_missing_parent, repository): @click.pass_context @add_params(_commit_params) def commit(ctx, msg, auto_add, ignore_missing_parent, repository): + """External Data Store: Commit the repository to git and inform openBIS. + """ ctx.obj['runner'] = DataMgmtRunner(ctx.obj, halt_on_error_log=False) ctx.invoke(repository_commit, msg=msg, auto_add=auto_add, ignore_missing_parent=ignore_missing_parent, repository=repository) @@ -529,19 +589,27 @@ _init_params = [ @click.pass_context @add_params(_init_params) def repository_init(ctx, repository_path, description): + """External Data Store: Initialize the folder as a data repository. + """ return init_data_impl(ctx, repository_path, description) _init_params_physical = \ _init_params + \ [click.option('-p', '--physical', 'is_physical', default=False, is_flag=True, - help='If parent data set is missing, ignore it.')] + help='Initialize folder for Standard Data Store data handling.')] @cli.command(short_help="Initialize the folder as a data repository.") @click.pass_context @add_params(_init_params_physical) def init(ctx, repository_path, description, is_physical): + """External Data Store: Initialize the folder as a data repository for External Data Store + data handling. + + Standard Data Store: Initialize the folder as a data repository for Standard Data Store + data handling. + """ ctx.obj['runner'] = DataMgmtRunner(ctx.obj, halt_on_error_log=False, is_physical=is_physical) ctx.invoke(repository_init, repository_path=repository_path, description=description) @@ -560,6 +628,7 @@ _init_analysis_params += _init_params @click.pass_context @add_params(_init_analysis_params) def repository_init_analysis(ctx, parent, repository_path, description): + """External Data Store: Initialize the folder as an analysis folder.""" return init_analysis_impl(ctx, parent, repository_path, description) @@ -567,6 +636,7 @@ def repository_init_analysis(ctx, parent, repository_path, description): @click.pass_context @add_params(_init_analysis_params) def init_analysis(ctx, parent, repository_path, description): + """External Data Store: Initialize the folder as an analysis folder.""" ctx.obj['runner'] = DataMgmtRunner(ctx.obj, halt_on_error_log=False) ctx.invoke(repository_init_analysis, parent=parent, repository_path=repository_path, description=description) @@ -585,6 +655,7 @@ _status_params = [ @click.pass_context @add_params(_status_params) def repository_status(ctx, repository): + """External Data Store: Show the state of the obis repository.""" return ctx.obj['runner'].run("repository_status", lambda dm: dm.status(), repository) @@ -592,6 +663,7 @@ def repository_status(ctx, repository): @click.pass_context @add_params(_status_params) def status(ctx, repository): + """External Data Store: Show the state of the obis repository.""" ctx.obj['runner'] = DataMgmtRunner(ctx.obj, halt_on_error_log=False) ctx.invoke(repository_status, repository=repository) @@ -616,6 +688,7 @@ def _repository_sync(dm, ignore_missing_parent): @click.pass_context @add_params(_sync_params) def repository_sync(ctx, ignore_missing_parent, repository): + """External Data Store: Sync the repository with openBIS.""" return ctx.obj['runner'].run("sync", lambda dm: _repository_sync(dm, ignore_missing_parent), repository) @@ -624,6 +697,7 @@ def repository_sync(ctx, ignore_missing_parent, repository): @click.pass_context @add_params(_sync_params) def sync(ctx, ignore_missing_parent, repository): + """External Data Store: Sync the repository with openBIS.""" ctx.obj['runner'] = DataMgmtRunner(ctx.obj, halt_on_error_log=False) ctx.invoke(repository_sync, ignore_missing_parent=ignore_missing_parent, repository=repository) @@ -706,6 +780,7 @@ _addref_params = [ @click.pass_context @add_params(_addref_params) def repository_addref(ctx, repository): + """Used for External Data Store only.""" return ctx.obj['runner'].run("addref", lambda dm: dm.addref(), repository) @@ -713,6 +788,7 @@ def repository_addref(ctx, repository): @click.pass_context @add_params(_addref_params) def addref(ctx, repository): + """Used for External Data Store only.""" ctx.obj['runner'] = DataMgmtRunner(ctx.obj, halt_on_error_log=False) ctx.invoke(repository_addref, repository=repository) @@ -733,6 +809,7 @@ _removeref_params = [ @click.pass_context @add_params(_removeref_params) def repository_removeref(ctx, data_set_id, repository): + """Used for External Data Store only.""" if data_set_id is not None and repository is not None: click_echo("Only provide the data_set id OR the repository.") return -1 @@ -744,6 +821,7 @@ def repository_removeref(ctx, data_set_id, repository): @click.pass_context @add_params(_removeref_params) def removeref(ctx, data_set_id, repository): + """Used for External Data Store only.""" ctx.obj['runner'] = DataMgmtRunner(ctx.obj, halt_on_error_log=False) ctx.invoke(repository_removeref, data_set_id=data_set_id, repository=repository) diff --git a/app-openbis-command-line/src/python/setup.py b/app-openbis-command-line/src/python/setup.py index 8d250d6155d9937e64199657771f4bbb77c61abb..3b6db830cb153ea6adb36cafac6255f5c34ab7df 100644 --- a/app-openbis-command-line/src/python/setup.py +++ b/app-openbis-command-line/src/python/setup.py @@ -31,7 +31,7 @@ data_files = [ setup( name="obis", - version="0.4.0.1", + version="0.4.2rc1", description="Local data management with assistance from OpenBIS.", long_description=long_description, long_description_content_type="text/markdown", diff --git a/docs/app-openbis-command-line/README.md b/docs/app-openbis-command-line/README.md index 5f6b6cd587e799108fb3f5a242ac78961276c29a..4505c3ef8b2989e313248987b091250d3c39f815 100644 --- a/docs/app-openbis-command-line/README.md +++ b/docs/app-openbis-command-line/README.md @@ -22,9 +22,12 @@ case, OpenBIS is aware of its existence and the data can be used for provenance 1. [Settings](#521-settings) 2. [Commands](#522-commands) 3. [Examples](#523-examples) -6. [Big Data Link Services](#6-big-data-link-services) -7. [Rationale for obis](#7-rationale-for-obis) -8. [Literature](#8-literature) +6. [Authentication](#6-authentication) + 1. [Login](#61-login) + 2. [Personal Access Token](#62-personal-access-token) +7. [Big Data Link Services](#7-big-data-link-services) +8. [Rationale for obis](#8-rationale-for-obis) +9. [Literature](#9-literature) ## 1. Prerequisites @@ -166,7 +169,7 @@ Here is a short summary of which commands are available in given modes: | settings clear | ⌠| ✅ | | status | ⌠| ✅ | | sync | ⌠| ✅ | -| token | ⌠| ✅ | +| token | ✅ | ✅ | | upload | ✅ | ⌠| **Login** @@ -234,6 +237,7 @@ Options: -space, --space TEXT Space code -project, --project TEXT Full project identification code -experiment, --experiment TEXT Full experiment code + -object, --object TEXT Object identification information, it can be permId or identifier -type, --type TEXT Type code -registration-date, --registration-date TEXT Registration date, it can be in the format @@ -244,12 +248,16 @@ Options: -property TEXT Property code -property-value TEXT Property value -save, --save TEXT Directory name to save results + -r, --recursive Search data recursively ``` With `data_set search` command, obis connects to a configured OpenBIS instance and searches for all -data sets that fulfill given filtering criteria. -At least one filtering criteria must be specified. Search results can be downloaded by -using `save` option. +data sets that fulfill given filtering criteria or by using object identification string. +At least one search option must be specified. + +Search results can be downloaded into a file by using `save` option. + +Recursive option enables searching for datasets of children samples or datasets *Note: Filtering by `-project` may not work when `Project Samples` are disabled in OpenBIS configuration.* @@ -306,6 +314,7 @@ Options: -space, --space TEXT Space code -project, --project TEXT Full project identification code -experiment, --experiment TEXT Full experiment + -object, --object TEXT Object identification information, it can be permId or identifier -registration-date, --registration-date TEXT Registration date, it can be in the format "oYYYY-MM-DD" (e.g. ">2023-01-31", "=2023-01-31", "<2023-01-31") @@ -315,12 +324,16 @@ Options: -property TEXT Property code -property-value TEXT Property value -save, --save TEXT File name to save results in csv format + -r, --recursive Search data recursively ``` With `object search` command, obis connects to a configured OpenBIS instance and searches for all -objects/samples that fulfill given filtering criteria. -At least one filtering criteria must be specified. Search results can be downloaded int a file by -using `-save` option. +objects/samples that fulfill given filtering criteria or by using object identification string. +At least one search option must be specified. + +Search results can be downloaded into a file by using `save` option. + +Recursive option enables searching for datasets of children samples or datasets *Note: Filtering by `-project` may not work when `Project Samples` are disabled in OpenBIS configuration.* @@ -550,6 +563,7 @@ was moved or copied without using the `move` or `copy` commands. **token** + ``` obis token get <session_name> [--validity-days] [--validity-weeks] [--validity-months] ``` @@ -602,7 +616,24 @@ echo content >> example_file obis commit -m 'message' ``` -## 6. Big Data Link Services +## 6. Authentication + +There are 2 ways to perform user authentication against OpenBIS. + +### 6.1. Login +Obis, internally, stores a session token which is used to connect with OpenBIS. Whenever this token +is invalidated, obis will ask user to provide credentials to log into OpenBIS again. + + +### 6.2. Personal Access Token +Session token is short-lived and its interactive generation makes it unfeasible for usage in automatic +scripts. An alternative way to authorize is to generate personal access token (PAT), which can be +configured to last for a long periods of time. + +PAT generation is explained in depth in `token` command section. + + +## 7. Big Data Link Services The Big Data Link Services can be used to download files which are contained in an obis repository. The services are included in the installation folder of openBIS, @@ -610,7 +641,7 @@ under `servers/big_data_link_services`. For how to configure and run them, consu the [README.md](https://sissource.ethz.ch/sispub/openbis/blob/master/big_data_link_server/README.md) file. -## 7. Rationale for obis +## 8. Rationale for obis Data-provenance tracking tools like openBIS make it possible to understand and follow the research process. What was studied, what data was acquired and how, how was data analyzed to arrive at final @@ -639,7 +670,7 @@ Using `git-annex`, even large binary artifacts can be tracked efficiently. For c openBIS, `obis` uses the openBIS API, which offers the power to register and track all metadata supported by openBIS. -## 8. Literature +## 9. Literature V. Korolev, A. Joshi, V. Korolev, M.A. Grasso, A. Joshi, M.A. Grasso, et al., "PROB: A tool for tracking provenance and reproducibility of big data experiments", Reproduce '14. HPCA 2014, vol. 11, diff --git a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/SingleSignOnServlet.java b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/SingleSignOnServlet.java index 838e4257d3b8ac3c45cc6618a0eeaa4ca6bc0b33..25aee1242c4216e0ec0f17209862b7dcc03e1e2c 100644 --- a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/SingleSignOnServlet.java +++ b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/SingleSignOnServlet.java @@ -84,6 +84,8 @@ public class SingleSignOnServlet extends AbstractServlet public static final String DEFAULT_REDIRECT_URL = "webapp/eln-lims"; + private static final String SINGLE_SIGN_ON_ENABLED_PROPERTY = "single-sign-on.enabled"; + private static final String SINGLE_SIGN_ON_REDIRECT_URL_TEMPLATE_PROPERTY = "single-sign-on.redirect-url-template"; private static final String DEFAULT_SINGLE_SIGN_ON_REDIRECT_URL_TEMPLATE = "https://${host}/openbis/webapp/eln-lims"; @@ -103,9 +105,12 @@ public class SingleSignOnServlet extends AbstractServlet private Template template; + private boolean enabled; + @Override protected void initServletContext(ServletContext servletContext) { + enabled = Boolean.parseBoolean(configurer.getResolvedProps().getProperty(SINGLE_SIGN_ON_ENABLED_PROPERTY, Boolean.toString(Boolean.FALSE))); template = new Template(configurer.getResolvedProps().getProperty(SINGLE_SIGN_ON_REDIRECT_URL_TEMPLATE_PROPERTY, DEFAULT_SINGLE_SIGN_ON_REDIRECT_URL_TEMPLATE)); template.createFreshCopy().bind("host", ""); // Check that template contains '${host}' @@ -116,6 +121,10 @@ public class SingleSignOnServlet extends AbstractServlet protected void respondToRequest(HttpServletRequest request, HttpServletResponse response) throws Exception, IOException { operationLog.info("handle sso event"); + if (!enabled) { + response.setStatus(HttpServletResponse.SC_FORBIDDEN); + return; + } removeStaleSessions(); String sessionId = getHeader(request, SESSION_ID_KEY, DEFAULT_SESSION_ID_KEY); synchronized (this) diff --git a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/search/planner/AbstractCompositeEntitySearchManager.java b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/search/planner/AbstractCompositeEntitySearchManager.java index 4be327730930971304a16a20ab05ab3d2f99f395..91e87474e7723169da7067366fcbf71bdceebbb3 100644 --- a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/search/planner/AbstractCompositeEntitySearchManager.java +++ b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/search/planner/AbstractCompositeEntitySearchManager.java @@ -175,7 +175,7 @@ public abstract class AbstractCompositeEntitySearchManager<CRITERIA extends Abst ? Collections.singleton(containerCriteriaIntermediateResults) : Collections.emptySet(), nestedCriteriaIntermediateResults); } else if (mainCriteria.isEmpty() && parentRelationshipsCriteria.isEmpty() - && childRelationshipsCriteria.isEmpty() && nestedCriteria.isEmpty()) + && childRelationshipsCriteria.isEmpty() && nestedCriteria.isEmpty() && containerCriteria.isEmpty()) { // If we don't have results and criteria are empty, return all. results = getAllIds(userId, authorisationInformation, idsColumnName, tableMapper, null); diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchDataSetTest.java b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchDataSetTest.java index 2edc688df814da911f868005890b9fc181440a3e..b261b28c18c3325f39b65b386e70d83b7b4f188f 100644 --- a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchDataSetTest.java +++ b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchDataSetTest.java @@ -21,9 +21,11 @@ import static org.testng.Assert.assertEquals; import java.util.Arrays; import java.util.Collections; import java.util.List; +import java.util.stream.Collectors; import org.testng.annotations.Test; +import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.id.ObjectPermId; import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.DatePropertySearchCriteria; import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.SearchResult; import ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.ArchivingStatus; @@ -153,6 +155,26 @@ public class SearchDataSetTest extends AbstractDataSetTest testSearch(TEST_USER, criteria, "20110509092359990-11", "COMPONENT_2A", "20110509092359990-12"); } + @Test + public void test() + { + final DataSetSearchCriteria criteria = new DataSetSearchCriteria(); + // criteria.withContainer(); + + String sessionToken = v3api.login(TEST_USER, PASSWORD); + final DataSetFetchOptions fetchOptions = new DataSetFetchOptions(); + fetchOptions.withContainers(); + List<DataSet> dataSets = searchDataSets(sessionToken, criteria, fetchOptions); + + dataSets.stream().filter(dataSet -> dataSet.getContainers() != null && !dataSet.getContainers().isEmpty()).forEach(dataSet -> + System.out.printf("Code: %s. PermId: %s. Containers permId: %s\n", dataSet.getCode(), dataSet.getPermId(), + dataSet.getContainers().stream().map(DataSet::getPermId).map(ObjectPermId::getPermId).collect(Collectors.joining(", "))) + ); + +// System.out.println(dataSets); + v3api.logout(sessionToken); + } + @Test public void testSearchWithContainer() { @@ -166,9 +188,27 @@ public class SearchDataSetTest extends AbstractDataSetTest @Test public void testSearchWithContainerWithPermId() { - DataSetSearchCriteria criteria = new DataSetSearchCriteria(); - criteria.withContainer().withPermId().thatEquals("20110509092359990-10"); - testSearch(TEST_USER, criteria, "20110509092359990-11", "20110509092359990-12"); + final DataSetSearchCriteria criteria1 = new DataSetSearchCriteria(); + criteria1.withContainer().withPermId().thatEquals("20110509092359990-10"); + testSearch(TEST_USER, criteria1, "20110509092359990-11", "20110509092359990-12"); + + final DataSetSearchCriteria criteria2 = new DataSetSearchCriteria(); + criteria2.withContainer().withPermId().thatEquals("CONTAINER_3A"); + testSearch(TEST_USER, criteria2, "COMPONENT_3A", "COMPONENT_3AB"); + + final DataSetSearchCriteria criteria3 = new DataSetSearchCriteria(); + criteria3.withContainer().withPermId().thatEquals("CONTAINER_3B"); + testSearch(TEST_USER, criteria3, "COMPONENT_3AX", "COMPONENT_3AB"); + + // Not existing data set permID as a container. + final DataSetSearchCriteria criteria4 = new DataSetSearchCriteria(); + criteria4.withContainer().withPermId().thatEquals("20110509092359990-000"); + testSearch(TEST_USER, criteria4); + + // Existing data set permID which is not as a container. + final DataSetSearchCriteria criteria5 = new DataSetSearchCriteria(); + criteria5.withContainer().withPermId().thatEquals("COMPONENT_3AB"); + testSearch(TEST_USER, criteria5); } @Test diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchSampleTest.java b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchSampleTest.java index 8a32260b5b43e05391c51f31651eba726f05a9c3..b16165c880332af88b4f1c946e9cae42776db639 100644 --- a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchSampleTest.java +++ b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchSampleTest.java @@ -1110,9 +1110,19 @@ public class SearchSampleTest extends AbstractSampleTest @Test public void testSearchWithContainerWithPermId() { - SampleSearchCriteria criteria = new SampleSearchCriteria(); - criteria.withContainer().withPermId().thatEquals("200811050924274-994"); - testSearch(TEST_USER, criteria, "/CISD/B1B3:B01", "/CISD/B1B3:B03"); + final SampleSearchCriteria criteria1 = new SampleSearchCriteria(); + criteria1.withContainer().withPermId().thatEquals("200811050924274-994"); + testSearch(TEST_USER, criteria1, "/CISD/B1B3:B01", "/CISD/B1B3:B03"); + + // Not existing sample permID as a container. + final SampleSearchCriteria criteria2 = new SampleSearchCriteria(); + criteria2.withContainer().withPermId().thatEquals("200811050924274-000"); + testSearch(TEST_USER, criteria2); + + // Existing sample permID which is not a container. + final SampleSearchCriteria criteria3 = new SampleSearchCriteria(); + criteria3.withContainer().withPermId().thatEquals("200811050925507-1000"); + testSearch(TEST_USER, criteria3); } @Test diff --git a/server-data-store/src/main/resources/server-data-store-config.properties b/server-data-store/src/main/resources/server-data-store-config.properties index 461e66d29a04fbb952632e9d80c72fa9c8adc0a3..850f4ccd20ba0a4e0b757b8b9d41bb324ed2a2dc 100755 --- a/server-data-store/src/main/resources/server-data-store-config.properties +++ b/server-data-store/src/main/resources/server-data-store-config.properties @@ -9,7 +9,7 @@ storageRoot=./target/tests/storage httpServerClass=ch.ethz.sis.afsserver.http.impl.NettyHttpServer httpServerUri=/fileserver -httpServerPort=1010 +httpServerPort=8085 httpMaxContentLength=1024 maxReadSizeInBytes=1024 diff --git a/server-data-store/src/test/javascript/README.md b/server-data-store/src/test/javascript/README.md new file mode 100644 index 0000000000000000000000000000000000000000..555f2944cabc14fdb8378ce1c636bfd082481c47 --- /dev/null +++ b/server-data-store/src/test/javascript/README.md @@ -0,0 +1,13 @@ +## Simple Javascript client for new DSS API + +This client allows to perform simple operations on a server-data-store using the new api. + +In order to use it: + +1. Acquire datastore address - you can check .properties file for httpServerPort and httpServerUri + Note: make sure address/port/uri match! + (you may deploy dev instance by running AFSServerDevelopmentEnvironmentStart gradle task) + +2. Open server-data-store-client.html in your browser + Note: You mey need to disable security flags in your browser in case of self-signed certificates. + diff --git a/server-data-store/src/test/javascript/body-style.css b/server-data-store/src/test/javascript/body-style.css new file mode 100644 index 0000000000000000000000000000000000000000..a85e7f0665d88374bbd67315f317e2e8e81b90e9 --- /dev/null +++ b/server-data-store/src/test/javascript/body-style.css @@ -0,0 +1,7 @@ +body { font: 14px "Trebuchet MS", sans-serif; } + +h1 { font: 16px; } +h3 { font: 12px; } + +div#vis { padding-top: 10px;} +div#vis div { padding-top: 2px;} diff --git a/server-data-store/src/test/javascript/button.css b/server-data-store/src/test/javascript/button.css new file mode 100644 index 0000000000000000000000000000000000000000..4f11c2eff594e3a0ec575fc83c205445d192a574 --- /dev/null +++ b/server-data-store/src/test/javascript/button.css @@ -0,0 +1,107 @@ +button { + font: 14px "Trebuchet MS"; + background-color: #222; + background-image: -moz-linear-gradient(top, rgba(255,255,255,.25), rgba(255,255,255,.11)); + background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0, rgba(255,255,255,.25)),color-stop(1, rgba(255,255,255,.11))); + background-image: -webkit-linear-gradient(rgba(255,255,255,.25), rgba(255,255,255,.11)); + color: #fff; + text-rendering: optimizeLegibility; + text-shadow: 0 -1px 1px #222; + padding: 3px 5px 3px 5px; + border: 0; + border-radius: 0; + border-bottom: 1px solid #222; + margin: 0; + -moz-box-shadow: 0 1px 3px #999; + -webkit-box-shadow: 0 1px 3px #999; + box-shadow: 0 1px 3px #999; +} + +button.first { + border-top-left-radius: 5px; + border-bottom-left-radius: 5px; +} + +button.last { + border-top-right-radius: 5px; + border-bottom-right-radius: 5px; +} + +button.active { + background-color: rgb(65,102,133); +} + +button:hover { + background-color: steelblue; +} + +input { + font: 14px "Trebuchet MS"; + background-image: -moz-linear-gradient(top, rgba(255,255,255,.25), rgba(255,255,255,.11)); + background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0, rgba(255,255,255,.25)),color-stop(1, rgba(255,255,255,.11))); + background-image: -webkit-linear-gradient(rgba(255,255,255,.5), rgba(255,255,255,.1)); + color: #000; + text-rendering: optimizeLegibility; + padding: 3px 5px 3px 5px; + border: 0; + border-radius: 0; + margin: 0; + -moz-box-shadow: 0 1px 3px #999; + -webkit-box-shadow: 0 1px 3px #999; + box-shadow: 0 1px 3px #999; +} + +textarea { + font: 14px "Trebuchet MS"; + background-image: -moz-linear-gradient(top, rgba(255,255,255,.25), rgba(255,255,255,.11)); + background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0, rgba(255,255,255,.25)),color-stop(1, rgba(255,255,255,.11))); + background-image: -webkit-linear-gradient(rgba(255,255,255,.5), rgba(255,255,255,.1)); + color: #000; + text-rendering: optimizeLegibility; + padding: 3px 5px 3px 5px; + border: 0; + border-radius: 0; + margin: 0; + -moz-box-shadow: 0 1px 3px #999; + -webkit-box-shadow: 0 1px 3px #999; + box-shadow: 0 1px 3px #999; +} + + +input[type=submit] { + font: 14px "Trebuchet MS"; + background-color: #222; + background-image: -moz-linear-gradient(top, rgba(255,255,255,.25), rgba(255,255,255,.11)); + background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0, rgba(255,255,255,.25)),color-stop(1, rgba(255,255,255,.11))); + background-image: -webkit-linear-gradient(rgba(255,255,255,.25), rgba(255,255,255,.11)); + color: #fff; + text-rendering: optimizeLegibility; + text-shadow: 0 -1px 1px #222; + padding: 3px 5px 3px 5px; + border: 0; + border-radius: 0; + border-bottom: 1px solid #222; + margin: 0; + -moz-box-shadow: 0 1px 3px #999; + -webkit-box-shadow: 0 1px 3px #999; + box-shadow: 0 1px 3px #999; +} + +input[type=submit].first { + border-top-left-radius: 5px; + border-bottom-left-radius: 5px; +} + +input[type=submit].last { + border-top-right-radius: 5px; + border-bottom-right-radius: 5px; +} + +input[type=submit].active { + background-color: rgb(65,102,133); +} + +input[type=submit]:hover { + background-color: steelblue; +} + diff --git a/server-data-store/src/test/javascript/images/openBIS_Logo.png b/server-data-store/src/test/javascript/images/openBIS_Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..87ae5e81899908f3968ea230205322dc19ff4ee5 Binary files /dev/null and b/server-data-store/src/test/javascript/images/openBIS_Logo.png differ diff --git a/server-data-store/src/test/javascript/images/openBIS_Logo.svg b/server-data-store/src/test/javascript/images/openBIS_Logo.svg new file mode 100644 index 0000000000000000000000000000000000000000..9cbcada98d6b32642ce65d468cc98e1ef7716fd0 --- /dev/null +++ b/server-data-store/src/test/javascript/images/openBIS_Logo.svg @@ -0,0 +1,85 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + - Copyright ETH 2023 Zürich, Scientific IT Services + - + - Licensed under the Apache License, Version 2.0 (the "License"); + - you may not use this file except in compliance with the License. + - You may obtain a copy of the License at + - + - http://www.apache.org/licenses/LICENSE-2.0 + - + - Unless required by applicable law or agreed to in writing, software + - distributed under the License is distributed on an "AS IS" BASIS, + - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + - See the License for the specific language governing permissions and + - limitations under the License. + - + --> + +<!-- Generator: Adobe Illustrator 15.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + width="400.023px" height="174.566px" viewBox="0 0 400.023 174.566" enable-background="new 0 0 400.023 174.566" + xml:space="preserve"> +<g id="Layer_1"> + <g> + <text transform="matrix(1 0 0 1 46.4854 154.2764)"><tspan x="0" y="0" fill="#010101" font-family="'HelveticaNeue-Bold'" font-size="93.505" letter-spacing="-4">open</tspan><tspan x="204.679" y="0" fill="#231F20" font-family="'HelveticaNeue'" font-size="93.505">BIS</tspan></text> + <rect x="204.234" y="158.748" fill="none" width="192.64" height="14.936"/> + <text transform="matrix(1 0 0 1 204.2329 169.876)" fill="#010101" font-family="'HelveticaNeue'" font-size="15.5842">Biology Information System</text> + <g> + <g> + <g> + <g> + <polygon fill="#068172" points="125.213,81.967 141.416,98.167 147.252,92.333 131.053,76.132 125.213,76.132 "/> + </g> + <g> + <g> + <polygon fill="#068172" points="120.206,81.967 104.005,98.167 98.168,92.333 114.368,76.132 120.206,76.132 "/> + </g> + <g> + <polygon fill="#068172" points="120.206,65.286 104.005,49.084 98.168,54.92 114.368,71.12 120.206,71.12 "/> + </g> + </g> + </g> + <g> + <polygon fill="#068172" points="125.213,65.286 141.416,49.084 147.252,54.92 131.053,71.12 125.213,71.12 "/> + </g> + </g> + <g> + <g> + <polygon fill="#A4A4A4" points="76.131,16.201 92.331,0 98.168,5.836 81.969,22.036 76.13,22.036 "/> + </g> + <g> + <g> + <polygon fill="#ADACAF" points="76.131,32.882 92.331,49.084 98.168,43.247 81.969,27.048 76.13,27.048 "/> + </g> + <g> + <g> + <polygon fill="#ADACAF" points="71.122,32.882 54.921,49.084 49.084,43.247 65.283,27.048 71.123,27.048 "/> + </g> + <g> + <polygon fill="#ADACAF" points="71.122,16.201 54.921,0 49.084,5.836 65.283,22.036 71.123,22.036 "/> + </g> + </g> + </g> + </g> + <g> + <g> + <polygon fill="#ADACAF" points="27.046,65.286 43.247,49.084 49.083,54.92 32.884,71.12 27.045,71.12 "/> + </g> + <g> + <polygon fill="#ADACAF" points="27.046,81.967 43.247,98.167 49.083,92.333 32.884,76.132 27.045,76.132 "/> + </g> + <g> + <polygon fill="#ADACAF" points="22.038,81.967 5.837,98.167 0,92.333 16.199,76.132 22.038,76.132 "/> + </g> + <g> + <polygon fill="#ADACAF" points="22.038,65.286 5.837,49.084 0,54.92 16.199,71.12 22.038,71.12 "/> + </g> + </g> + </g> + </g> +</g> +<g id="Layer_2"> +</g> +</svg> diff --git a/server-data-store/src/test/javascript/md5.js b/server-data-store/src/test/javascript/md5.js new file mode 100644 index 0000000000000000000000000000000000000000..2a5e0fe392b9f14726b38dcb62a632d4650ed942 --- /dev/null +++ b/server-data-store/src/test/javascript/md5.js @@ -0,0 +1,402 @@ +/* + * JavaScript MD5 + * https://github.com/blueimp/JavaScript-MD5 + * + * Copyright 2011, Sebastian Tschan + * https://blueimp.net + * + * Licensed under the MIT license: + * https://opensource.org/licenses/MIT + * + * Based on + * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message + * Digest Algorithm, as defined in RFC 1321. + * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009 + * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet + * Distributed under the BSD License + * See http://pajhome.org.uk/crypt/md5 for more info. + */ + +/* global define */ + +/* eslint-disable strict */ + +;(function ($) { + 'use strict' + + /** + * Add integers, wrapping at 2^32. + * This uses 16-bit operations internally to work around bugs in interpreters. + * + * @param {number} x First integer + * @param {number} y Second integer + * @returns {number} Sum + */ + function safeAdd(x, y) { + var lsw = (x & 0xffff) + (y & 0xffff) + var msw = (x >> 16) + (y >> 16) + (lsw >> 16) + return (msw << 16) | (lsw & 0xffff) + } + + /** + * Bitwise rotate a 32-bit number to the left. + * + * @param {number} num 32-bit number + * @param {number} cnt Rotation count + * @returns {number} Rotated number + */ + function bitRotateLeft(num, cnt) { + return (num << cnt) | (num >>> (32 - cnt)) + } + + /** + * Basic operation the algorithm uses. + * + * @param {number} q q + * @param {number} a a + * @param {number} b b + * @param {number} x x + * @param {number} s s + * @param {number} t t + * @returns {number} Result + */ + function md5cmn(q, a, b, x, s, t) { + return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b) + } + /** + * Basic operation the algorithm uses. + * + * @param {number} a a + * @param {number} b b + * @param {number} c c + * @param {number} d d + * @param {number} x x + * @param {number} s s + * @param {number} t t + * @returns {number} Result + */ + function md5ff(a, b, c, d, x, s, t) { + return md5cmn((b & c) | (~b & d), a, b, x, s, t) + } + /** + * Basic operation the algorithm uses. + * + * @param {number} a a + * @param {number} b b + * @param {number} c c + * @param {number} d d + * @param {number} x x + * @param {number} s s + * @param {number} t t + * @returns {number} Result + */ + function md5gg(a, b, c, d, x, s, t) { + return md5cmn((b & d) | (c & ~d), a, b, x, s, t) + } + /** + * Basic operation the algorithm uses. + * + * @param {number} a a + * @param {number} b b + * @param {number} c c + * @param {number} d d + * @param {number} x x + * @param {number} s s + * @param {number} t t + * @returns {number} Result + */ + function md5hh(a, b, c, d, x, s, t) { + return md5cmn(b ^ c ^ d, a, b, x, s, t) + } + /** + * Basic operation the algorithm uses. + * + * @param {number} a a + * @param {number} b b + * @param {number} c c + * @param {number} d d + * @param {number} x x + * @param {number} s s + * @param {number} t t + * @returns {number} Result + */ + function md5ii(a, b, c, d, x, s, t) { + return md5cmn(c ^ (b | ~d), a, b, x, s, t) + } + + /** + * Calculate the MD5 of an array of little-endian words, and a bit length. + * + * @param {Array} x Array of little-endian words + * @param {number} len Bit length + * @returns {Array<number>} MD5 Array + */ + function binlMD5(x, len) { + /* append padding */ + x[len >> 5] |= 0x80 << len % 32 + x[(((len + 64) >>> 9) << 4) + 14] = len + + var i + var olda + var oldb + var oldc + var oldd + var a = 1732584193 + var b = -271733879 + var c = -1732584194 + var d = 271733878 + + for (i = 0; i < x.length; i += 16) { + olda = a + oldb = b + oldc = c + oldd = d + + a = md5ff(a, b, c, d, x[i], 7, -680876936) + d = md5ff(d, a, b, c, x[i + 1], 12, -389564586) + c = md5ff(c, d, a, b, x[i + 2], 17, 606105819) + b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330) + a = md5ff(a, b, c, d, x[i + 4], 7, -176418897) + d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426) + c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341) + b = md5ff(b, c, d, a, x[i + 7], 22, -45705983) + a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416) + d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417) + c = md5ff(c, d, a, b, x[i + 10], 17, -42063) + b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162) + a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682) + d = md5ff(d, a, b, c, x[i + 13], 12, -40341101) + c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290) + b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329) + + a = md5gg(a, b, c, d, x[i + 1], 5, -165796510) + d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632) + c = md5gg(c, d, a, b, x[i + 11], 14, 643717713) + b = md5gg(b, c, d, a, x[i], 20, -373897302) + a = md5gg(a, b, c, d, x[i + 5], 5, -701558691) + d = md5gg(d, a, b, c, x[i + 10], 9, 38016083) + c = md5gg(c, d, a, b, x[i + 15], 14, -660478335) + b = md5gg(b, c, d, a, x[i + 4], 20, -405537848) + a = md5gg(a, b, c, d, x[i + 9], 5, 568446438) + d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690) + c = md5gg(c, d, a, b, x[i + 3], 14, -187363961) + b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501) + a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467) + d = md5gg(d, a, b, c, x[i + 2], 9, -51403784) + c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473) + b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734) + + a = md5hh(a, b, c, d, x[i + 5], 4, -378558) + d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463) + c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562) + b = md5hh(b, c, d, a, x[i + 14], 23, -35309556) + a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060) + d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353) + c = md5hh(c, d, a, b, x[i + 7], 16, -155497632) + b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640) + a = md5hh(a, b, c, d, x[i + 13], 4, 681279174) + d = md5hh(d, a, b, c, x[i], 11, -358537222) + c = md5hh(c, d, a, b, x[i + 3], 16, -722521979) + b = md5hh(b, c, d, a, x[i + 6], 23, 76029189) + a = md5hh(a, b, c, d, x[i + 9], 4, -640364487) + d = md5hh(d, a, b, c, x[i + 12], 11, -421815835) + c = md5hh(c, d, a, b, x[i + 15], 16, 530742520) + b = md5hh(b, c, d, a, x[i + 2], 23, -995338651) + + a = md5ii(a, b, c, d, x[i], 6, -198630844) + d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415) + c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905) + b = md5ii(b, c, d, a, x[i + 5], 21, -57434055) + a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571) + d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606) + c = md5ii(c, d, a, b, x[i + 10], 15, -1051523) + b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799) + a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359) + d = md5ii(d, a, b, c, x[i + 15], 10, -30611744) + c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380) + b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649) + a = md5ii(a, b, c, d, x[i + 4], 6, -145523070) + d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379) + c = md5ii(c, d, a, b, x[i + 2], 15, 718787259) + b = md5ii(b, c, d, a, x[i + 9], 21, -343485551) + + a = safeAdd(a, olda) + b = safeAdd(b, oldb) + c = safeAdd(c, oldc) + d = safeAdd(d, oldd) + } + return [a, b, c, d] + } + + /** + * Convert an array of little-endian words to a string + * + * @param {Array<number>} input MD5 Array + * @returns {string} MD5 string + */ + function binl2rstr(input) { + var i + var output = '' + var length32 = input.length * 32 + for (i = 0; i < length32; i += 8) { + output += String.fromCharCode((input[i >> 5] >>> i % 32) & 0xff) + } + return output + } + + /** + * Convert a raw string to an array of little-endian words + * Characters >255 have their high-byte silently ignored. + * + * @param {string} input Raw input string + * @returns {Array<number>} Array of little-endian words + */ + function rstr2binl(input) { + var i + var output = [] + output[(input.length >> 2) - 1] = undefined + for (i = 0; i < output.length; i += 1) { + output[i] = 0 + } + var length8 = input.length * 8 + for (i = 0; i < length8; i += 8) { + output[i >> 5] |= (input.charCodeAt(i / 8) & 0xff) << i % 32 + } + return output + } + + /** + * Calculate the MD5 of a raw string + * + * @param {string} s Input string + * @returns {string} Raw MD5 string + */ + function rstrMD5(s) { + return binl2rstr(binlMD5(rstr2binl(s), s.length * 8)) + } + + /** + * Calculates the HMAC-MD5 of a key and some data (raw strings) + * + * @param {string} key HMAC key + * @param {string} data Raw input string + * @returns {string} Raw MD5 string + */ + function rstrHMACMD5(key, data) { + var i + var bkey = rstr2binl(key) + var ipad = [] + var opad = [] + var hash + ipad[15] = opad[15] = undefined + if (bkey.length > 16) { + bkey = binlMD5(bkey, key.length * 8) + } + for (i = 0; i < 16; i += 1) { + ipad[i] = bkey[i] ^ 0x36363636 + opad[i] = bkey[i] ^ 0x5c5c5c5c + } + hash = binlMD5(ipad.concat(rstr2binl(data)), 512 + data.length * 8) + return binl2rstr(binlMD5(opad.concat(hash), 512 + 128)) + } + + /** + * Convert a raw string to a hex string + * + * @param {string} input Raw input string + * @returns {string} Hex encoded string + */ + function rstr2hex(input) { + var hexTab = '0123456789abcdef' + var output = '' + var x + var i + for (i = 0; i < input.length; i += 1) { + x = input.charCodeAt(i) + output += hexTab.charAt((x >>> 4) & 0x0f) + hexTab.charAt(x & 0x0f) + } + return output + } + + /** + * Encode a string as UTF-8 + * + * @param {string} input Input string + * @returns {string} UTF8 string + */ + function str2rstrUTF8(input) { + return unescape(encodeURIComponent(input)) + } + + /** + * Encodes input string as raw MD5 string + * + * @param {string} s Input string + * @returns {string} Raw MD5 string + */ + function rawMD5(s) { + return rstrMD5(str2rstrUTF8(s)) + } + /** + * Encodes input string as Hex encoded string + * + * @param {string} s Input string + * @returns {string} Hex encoded string + */ + function hexMD5(s) { + return rstr2hex(rawMD5(s)) + } + /** + * Calculates the raw HMAC-MD5 for the given key and data + * + * @param {string} k HMAC key + * @param {string} d Input string + * @returns {string} Raw MD5 string + */ + function rawHMACMD5(k, d) { + return rstrHMACMD5(str2rstrUTF8(k), str2rstrUTF8(d)) + } + /** + * Calculates the Hex encoded HMAC-MD5 for the given key and data + * + * @param {string} k HMAC key + * @param {string} d Input string + * @returns {string} Raw MD5 string + */ + function hexHMACMD5(k, d) { + return rstr2hex(rawHMACMD5(k, d)) + } + + /** + * Calculates MD5 value for a given string. + * If a key is provided, calculates the HMAC-MD5 value. + * Returns a Hex encoded string unless the raw argument is given. + * + * @param {string} string Input string + * @param {string} [key] HMAC key + * @param {boolean} [raw] Raw output switch + * @returns {string} MD5 output + */ + function md5(string, key, raw) { + if (!key) { + if (!raw) { + return hexMD5(string) + } + return rawMD5(string) + } + if (!raw) { + return hexHMACMD5(key, string) + } + return rawHMACMD5(key, string) + } + + if (typeof define === 'function' && define.amd) { + define(function () { + return md5 + }) + } else if (typeof module === 'object' && module.exports) { + module.exports = md5 + } else { + $.md5 = md5 + } + })(this) \ No newline at end of file diff --git a/server-data-store/src/test/javascript/server-data-store-client.html b/server-data-store/src/test/javascript/server-data-store-client.html new file mode 100644 index 0000000000000000000000000000000000000000..d6e3b4ef947fdae51c3c79ec9e52bcd60929462b --- /dev/null +++ b/server-data-store/src/test/javascript/server-data-store-client.html @@ -0,0 +1,106 @@ +<!-- + ~ Copyright ETH 2023 Zürich, Scientific IT Services + ~ + ~ Licensed under the Apache License, Version 2.0 (the "License"); + ~ you may not use this file except in compliance with the License. + ~ You may obtain a copy of the License at + ~ + ~ http://www.apache.org/licenses/LICENSE-2.0 + ~ + ~ Unless required by applicable law or agreed to in writing, software + ~ distributed under the License is distributed on an "AS IS" BASIS, + ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + ~ See the License for the specific language governing permissions and + ~ limitations under the License. + ~ + --> + +<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"> +<html> +<head> + <!-- + This is a simple Test app for new DSS. It strives to be the simplest non-trivial app. + It logs into the server and allows users to perform the simplest operations. + --> + <title>OpenBIS Simple Test</title> + <link type="text/css" rel="stylesheet" href="body-style.css"/> + <link type="text/css" rel="stylesheet" href="button.css"/> + <script type="text/javascript" src="md5.js"></script> + <script type="text/javascript" src="server-data-store-facade.js"></script> + <script type="text/javascript" src="server-data-store-login.js"></script> + <script type="text/javascript" src="server-data-store-client.js"></script> + +</head> +<body> +<img id="openbis-logo" src="images/openBIS_Logo.png" alt="openBIS" + style="position: absolute; right: 10px; height: 100px;"/> +<div id="login-form-div"> + <h1>DSS Client</h1> + <form id="login-form" action="javascript:"> + <input id="username" type="text" required="required"> + <input id="password" type="password" required="required"> + <button class="login-button" id="login-button" type="submit">Login</button> + </form> +</div> + +<div id="main"> + <div id="button-group"> + <button id="logout-button">Logout</button> + <button id="list-button">Refresh</button> + </div> + <h2>List</h2> + <div id="data-table"> + <table id="html-data-table" border="1"> + </table> + </div> + <br> + <h2>Write</h2> + <form onsubmit="return false;"> + <div id="write-area"> + <label>File path:</label><input type="text" id="fpath" required> + <label>Offset:</label><input type="text" id="foffset" value="0" required><br> + <label>Text:</label><br> + <textarea id="write-text" name="write" rows="5" cols="57"></textarea> <br> + <button id="write-submit">Write</button> + </div> + </form> + + <h2>Copy</h2> + <form onsubmit="return false;"> + <div id="copy-area"> + <table> + <tr> + <td><label>Copy from path:</label></td> + <td><input type="text" id="copy-from-path" required></td> + </tr> + <tr> + <td><label>Copy to path:</label></td> + <td><input type="text" id="copy-to-path" required></td> + </tr> + </table> + <button id="copy-submit">Copy</button> + </div> + </form> + + <h2>Move</h2> + <form onsubmit="return false;"> + <div id="move-area"> + <table> + <tr> + <td><label>Move from path:</label></td> + <td><input type="text" id="move-from-path" required></td> + </tr> + <tr> + <td><label>Move to path:</label></td> + <td><input type="text" id="move-to-path" required></td> + </tr> + </table> + <button id="move-submit">Move</button> + + </div> + </form> + + +</div> +</body> +</html> \ No newline at end of file diff --git a/server-data-store/src/test/javascript/server-data-store-client.js b/server-data-store/src/test/javascript/server-data-store-client.js new file mode 100644 index 0000000000000000000000000000000000000000..fcb5d309b2578dd50dd92ea16d5bbc6e01b36d18 --- /dev/null +++ b/server-data-store/src/test/javascript/server-data-store-client.js @@ -0,0 +1,227 @@ +/** Default owner/source */ +const owner = "demo-sample"; +const source = ""; +const HTTP_SERVER_URI = "/fileserver"; + +/// The datastoreServer we use for our data +// datastoreServer = new datastore('https://localhost:8443/openbis', 'https://localhost:8444/datastore_server'); +datastoreServer = new datastore('http://localhost:8085', HTTP_SERVER_URI); + + + +/** Creates open button for reading the file from dss */ +function createOpenButton(row, filePath, fileSize) { + readButton = document.createElement("button"); + readButton.innerText = "open"; + readButton.dataset.filepath = filePath; + readButton.dataset.filesize = fileSize; + readButton.onclick = (function() { + datastoreServer.read(owner, this.dataset.filepath, 0, this.dataset.filesize, (responseData => { + var win = window.open("", "_blank"); + var doc = win.document; + doc.open("text/html"); + doc.write(responseData); + doc.close(); + })); + }); + row.appendChild(readButton); +} + +/** creates button for deleteing a file from the dss */ +function createDeleteButton(row, filePath) { + deleteButton = document.createElement("button"); + deleteButton.innerText = "delete"; + deleteButton.dataset.filepath = filePath; + deleteButton.onclick = (function() { + if (confirm("Do you want to delete "+filePath+" ?") == true) { + datastoreServer.delete(owner, this.dataset.filepath, (responseData => { + showEntries(); + })); + } + }); + row.appendChild(deleteButton); +} + +/** recursive implementation of DFS algorithm to traverse the tree and accumulate results in order of traversal */ +function dfs(tree, map, path, acc) { + for(const [key, val] of Object.entries(tree).sort(([a1,a2],[b1,b2]) => a1>b1 ? 1:-1)) { + var newPath = path + '/' + key; + if(newPath in map) { + acc.push(map[newPath]); + } + dfs(val, map, newPath, acc); + } + return acc; +} + +/** function to generate the table of file information */ +function generateTable(files) { + + /** converts array into tree object for sorting files by path */ + const toTree = (paths) => { + const tree = {}; + for (const path of paths) { + if (path) { + let node = tree; + const parts = path[1]['path'].split("/"); + for (const part of parts) { + if (part) { + node = node[part] ?? (node[part] = {}); + } + } + } + } + return tree; + }; + + var tree = toTree(files); + map = {}; + files.forEach(file => map[file[1]['path']] = file[1]); + files = dfs(tree, map, '', []); + files.forEach(file => { + file.owner = owner; + file.path = file.path.slice(owner.length + 1); + }); + + + // column names for the list of files + const columns = ["name", "owner", "path", "directory", "size", "creationTime", "lastAccessTime", "lastModifiedTime"]; + const mytable = document.getElementById("html-data-table"); + + let headRow = document.createElement("tr"); + columns.forEach(header => { + let cell = document.createElement("th"); + cell.innerText = header; + headRow.appendChild(cell); + }); + cell = document.createElement("th"); + cell.innerText = "actions"; + headRow.appendChild(cell); + mytable.appendChild(headRow); + + // create rows in table together with open and delete buttons + for (let i in files) { + let file = files[i]; + + let newRow = document.createElement("tr"); + columns.forEach(column => { + let cell = document.createElement("th"); + cell.innerText = file[column]; + newRow.appendChild(cell); + }); + if (file['directory'] !== true) { + createOpenButton(newRow, file['path'], file['size']); + } + createDeleteButton(newRow, file['path']); + mytable.appendChild(newRow); + } + + } + + +/** + * Display the files returned by the server + */ +function displayReturnedFiles(data) +{ + if (data.error) { + console.log(data.error); + alert("Could not retrieve data."); + return; + } + + var results = data.result[1]; + + // Restrict the display to 50 samples + // results = results.splice(0, 50); + + generateTable(results); +} + +/** + * Request file list from the server and show them in the Page. + */ +function showEntries() +{ + let table = document.getElementById("html-data-table"); + while (table.firstChild) { + table.firstChild.remove() + } + datastoreServer.list(owner, source, "true", displayReturnedFiles); +} + + +/** validation for write */ +function isWriteValid() { + return document.getElementById("fpath").value != '' && document.getElementById("foffset").value != ''; +} + +/** validation for copy */ +function isCopyValid() { + return document.getElementById("copy-from-path").value != '' && document.getElementById("copy-to-path").value != ''; +} + +/** validation for move */ +function isMoveValid() { + return document.getElementById("move-from-path").value != '' && document.getElementById('move-to-path').value != ''; +} + + +function enterApp(data) +{ + if(data.result == null){ + alert("Login or password incorrect"); + document.getElementById("username").focus(); + return; + } + + document.getElementById("login-form-div").style.display = "none"; + document.getElementById("main").style.display = "block"; + document.getElementById("openbis-logo").style.height = "30px"; + + showEntries(); +} + + +window.onload = function() { + new dssClientLoginPage(datastoreServer, enterApp).configure(); + + document.getElementById("list-button").onclick = function() { + showEntries(); + } + + document.getElementById("write-submit").onclick = function() { + if(isWriteValid()) { + datastoreServer.write(owner, + document.getElementById("fpath").value.trim(), + parseInt(document.getElementById("foffset").value.trim()), + document.getElementById("write-text").value.trim(), + (_ => { + showEntries(); + })); + } + }; + + document.getElementById("copy-submit").onclick = function() { + if(isCopyValid()) { + datastoreServer.copy(owner, document.getElementById("copy-from-path").value.trim(), owner, document.getElementById("copy-to-path").value.trim(), + (_ => { + showEntries(); + })); + } + + }; + + document.getElementById("move-submit").onclick = function() { + if(isMoveValid()) { + datastoreServer.move(owner, + document.getElementById("move-from-path").value.trim(), + owner, + document.getElementById("move-to-path").value.trim(), + (_ => { + showEntries(); + })); + } + }; +} + diff --git a/server-data-store/src/test/javascript/server-data-store-facade.js b/server-data-store/src/test/javascript/server-data-store-facade.js new file mode 100644 index 0000000000000000000000000000000000000000..e486da9d9b3ce4b31eae31e407cd0a82a3592b17 --- /dev/null +++ b/server-data-store/src/test/javascript/server-data-store-facade.js @@ -0,0 +1,452 @@ +/** + * ====================================================== + * OpenBIS Datastore facade internal code (DO NOT USE!!!) + * ====================================================== + */ + +function _datastoreInternal(datastoreUrlOrNull, httpServerUri){ + this.init(datastoreUrlOrNull, httpServerUri); +} + +_datastoreInternal.prototype.init = function(datastoreUrlOrNull, httpServerUri){ + this.datastoreUrl = this.normalizeUrl(datastoreUrlOrNull, httpServerUri); + this.httpServerUri = httpServerUri; +} + +_datastoreInternal.prototype.log = function(msg){ + if(console){ + console.log(msg); + } +} + +_datastoreInternal.prototype.normalizeUrl = function(openbisUrlOrNull, httpServerUri){ + var parts = this.parseUri(window.location); + + if(openbisUrlOrNull){ + var openbisParts = this.parseUri(openbisUrlOrNull); + + for(openbisPartName in openbisParts){ + var openbisPartValue = openbisParts[openbisPartName]; + + if(openbisPartValue){ + parts[openbisPartName] = openbisPartValue; + } + } + } + + return parts.protocol + "://" + parts.authority + httpServerUri; +} + +_datastoreInternal.prototype.getUrlForMethod = function(method) { + return this.datastoreUrl + "?method=" + method; +} + +_datastoreInternal.prototype.jsonRequestData = function(params) { + return JSON.stringify(params); +} + +_datastoreInternal.prototype.sendHttpRequest = function(httpMethod, contentType, url, data, callback) { + const xhr = new XMLHttpRequest(); + xhr.open(httpMethod, url); + xhr.setRequestHeader("Content-Type", contentType); + xhr.onreadystatechange = function() { + if (xhr.readyState === XMLHttpRequest.DONE) { + callback(xhr.responseText); + } + }; + xhr.send(JSON.stringify(data)); + } + + _datastoreInternal.prototype.buildGetUrl = function(queryParams) { + const queryString = Object.keys(queryParams) + .map(key => `${encodeURIComponent(key)}=${encodeURIComponent(queryParams[key])}`) + .join('&'); + return `${this.datastoreUrl}?${queryString}`; + } + + + +// Functions for working with cookies (see http://www.quirksmode.org/js/cookies.html) + +_datastoreInternal.prototype.createCookie = function(name,value,days) { + if (days) { + var date = new Date(); + date.setTime(date.getTime()+(days*24*60*60*1000)); + var expires = "; expires="+date.toGMTString(); + } + else var expires = ""; + document.cookie = name+"="+value+expires+"; path=/"; +} + +_datastoreInternal.prototype.readCookie = function(name) { + var nameEQ = name + "="; + var ca = document.cookie.split(';'); + for(var i=0;i < ca.length;i++) { + var c = ca[i]; + while (c.charAt(0)==' ') c = c.substring(1,c.length); + if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length); + } + return null; +} + +_datastoreInternal.prototype.eraseCookie = function(name) { + this.createCookie(name,"",-1); +} + +// parseUri 1.2.2 (c) Steven Levithan <stevenlevithan.com> MIT License (see http://blog.stevenlevithan.com/archives/parseuri) + +_datastoreInternal.prototype.parseUri = function(str) { + var options = { + strictMode: false, + key: ["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"], + q: { + name: "queryKey", + parser: /(?:^|&)([^&=]*)=?([^&]*)/g + }, + parser: { + strict: /^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/, + loose: /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/ + } + }; + + var o = options, + m = o.parser[o.strictMode ? "strict" : "loose"].exec(str), + uri = {}, + i = 14; + + while (i--) uri[o.key[i]] = m[i] || ""; + + uri[o.q.name] = {}; + uri[o.key[12]].replace(o.q.parser, function ($0, $1, $2) { + if ($1) uri[o.q.name][$1] = $2; + }); + + return uri; +} + + +/** Helper method for checking response from DSS server */ +function parseJsonResponse(rawResponse, action) { + let response = JSON.parse(rawResponse); + if(response.error){ + alert(response.error[1].message); + }else{ + action(response); + } +} + + + +/** + * =============== + * DSS facade + * =============== + * + * The facade provides access to the DSS methods + * + */ +function datastore(datastoreUrlOrNull, httpServerUri) { + this._internal = new _datastoreInternal(datastoreUrlOrNull, httpServerUri); +} + + +/** + * ================================================================================== + * ch.ethz.sis.afsapi.api.AuthenticationAPI methods + * ================================================================================== + */ + +/** + * Log into DSS. + * + * @method + */ +datastore.prototype.login = function(userId, userPassword, action) { + var datastoreObj = this + const data = { + "userId": userId, + "password": userPassword + }; + this._internal.sendHttpRequest( + "POST", + "application/json", + this._internal.getUrlForMethod("login"), + data, + function(loginResponse) { + let response = JSON.parse(loginResponse); + if(response.error){ + alert("Login failed: " + response.error.message); + }else{ + datastoreObj._internal.sessionToken = response.result; + datastoreObj.rememberSession(); + action(response); + } + } + ); + +} + +/** + * Stores the current session in a cookie. + * + * @method + */ +datastore.prototype.rememberSession = function() { + this._internal.createCookie('datastore', this.getSession(), 1); +} + +/** + * Removes the current session from a cookie. + * + * @method + */ +datastore.prototype.forgetSession = function() { + this._internal.eraseCookie('datastore'); +} + +/** + * Restores the current session from a cookie. + * + * @method + */ +datastore.prototype.restoreSession = function() { + this._internal.sessionToken = this._internal.readCookie('datastore'); +} + +/** + * Sets the current session. + * + * @method + */ +datastore.prototype.useSession = function(sessionToken){ + this._internal.sessionToken = sessionToken; +} + +/** + * Returns the current session. + * + * @method + */ +datastore.prototype.getSession = function(){ + return this._internal.sessionToken; +} + +/** + * Checks whether the current session is still active. + * + */ +datastore.prototype.isSessionValid = function(action) { + if(this.getSession()){ + const data = { "sessionToken" : this.getSession() } + this._internal.sendHttpRequest( + "GET", + "application/json", + this._internal.getUrlForMethod("isSessionValid"), + data, + (response) => parseJsonResponse(response, action) + ); + }else{ + action({ result : false }) + } +} + +/** + * Restores the current session from a cookie and executes + * the specified action if the session is still active. + * + * @see restoreSession() + * @see isSessionActive() + * @method + */ +datastore.prototype.ifRestoredSessionActive = function(action) { + this.restoreSession(); + this.isSessionValid(function(data) { if (data.result) action(data) }); +} + +/** + * Log out of DSS. + * + * @method + */ +datastore.prototype.logout = function(action) { + this.forgetSession(); + + if(this.getSession()){ + const data ={ "sessionToken" : this.getSession() }; + this._internal.sendHttpRequest( + "POST", + "application/json", + this._internal.getUrlForMethod("logout"), + data, + (response) => parseJsonResponse(response, action) + ); + }else if(action){ + action({ result : null }); + } +} + + +/** + * ================================================================================== + * ch.ethz.sis.afsapi.api.OperationsAPI methods + * ================================================================================== + */ + +/** + * List files in the DSS for given owner and source + */ +datastore.prototype.list = function(owner, source, recursively, action){ + const data = { + "method": "list", + "owner" : owner, + "source": source, + "recursively": recursively, + "sessionToken" : this.getSession() + }; + this._internal.sendHttpRequest( + "GET", + "application/json", + this._internal.buildGetUrl(data), + {}, + (response) => parseJsonResponse(response, action) + ); +} + +/** + * Read the contents of selected file + * @param {str} owner owner of the file + * @param {str} source path to file + * @param {int} offset offset from whoch to start reading + * @param {int} limit how many characters to read + * @param {*} action post-processing action + */ +datastore.prototype.read = function(owner, source, offset, limit, action){ + const data = { + "method": "read", + "owner" : owner, + "source": source, + "offset": offset, + "limit": limit, + "sessionToken" : this.getSession() + }; + this._internal.sendHttpRequest( + "GET", + "text", + this._internal.buildGetUrl(data), + {}, + (response) => action(response) + ); +} + +/** Helper function to encode string into byte array */ +String.prototype.encodeHex = function () { + return this.split('').map(e => e.charCodeAt()) +}; + +/** Helper function to convert string md5Hash into byte array that Java MessageDigest uses. */ +function convertToBin(md5hash) { + var res = [] + for(var i=0;i<md5hash.length;i+=2){ + var val = parseInt(md5hash.substring(i, i+2), 16); + res.push(val >= 128 ? -256+val : val); + } + return res; +} + +/** + * Write data to file (or create it) + * @param {str} owner owner of the file + * @param {str} source path to file + * @param {int} offset offset from which to start writing + * @param {str} data data to write + * @param {*} action post-processing action + */ +datastore.prototype.write = function(owner, source, offset, data, action){ + let md5Hash = md5(data).toUpperCase(); + const body = { + "owner" : ["java.lang.String", owner], + "source": ["java.lang.String", source], + "offset": [ "java.lang.Long", offset ], + "data": [ "[B", data.encodeHex() ], + "md5Hash": [ "[B", convertToBin(md5Hash)], + "sessionToken" : ["java.lang.String", this.getSession()] + }; + this._internal.sendHttpRequest( + "POST", + "application/json", + this._internal.getUrlForMethod("write"), + body, + (response) => parseJsonResponse(response, action) + ); +} + +/** + * Delete file from the DSS + * @param {str} owner owner of the file + * @param {str} source path to file + * @param {*} action post-processing action + */ +datastore.prototype.delete = function(owner, source, action){ + const body = { + "owner" : ["java.lang.String", owner], + "source": ["java.lang.String", source], + "sessionToken" : ["java.lang.String", this.getSession()] + }; + this._internal.sendHttpRequest( + "DELETE", + "application/json", + this._internal.getUrlForMethod("delete"), + body, + (response) => parseJsonResponse(response, action) + ); +} + +/** + * Copy file within DSS + */ +datastore.prototype.copy = function(sourceOwner, source, targetOwner, target, action){ + const body = { + "sourceOwner" : ["java.lang.String", sourceOwner], + "source": ["java.lang.String", source], + "targetOwner": ["java.lang.String", targetOwner], + "target": ["java.lang.String", target], + "sessionToken" : ["java.lang.String", this.getSession()] + }; + this._internal.sendHttpRequest( + "POST", + "application/json", + this._internal.getUrlForMethod("copy"), + body, + (response) => parseJsonResponse(response, action) + ); +} + +/** + * Move file within DSS + */ +datastore.prototype.move = function(sourceOwner, source, targetOwner, target, action){ + const body = { + "sourceOwner" : ["java.lang.String", sourceOwner], + "source": ["java.lang.String", source], + "targetOwner": ["java.lang.String", targetOwner], + "target": ["java.lang.String", target], + "sessionToken" : ["java.lang.String", this.getSession()] + }; + this._internal.sendHttpRequest( + "POST", + "application/json", + this._internal.getUrlForMethod("move"), + body, + (response) => parseJsonResponse(response, action) + ); + +} + + + + + + + + + diff --git a/server-data-store/src/test/javascript/server-data-store-login.js b/server-data-store/src/test/javascript/server-data-store-login.js new file mode 100644 index 0000000000000000000000000000000000000000..ee6039ac7bb63447be43f3c207e870da528fe684 --- /dev/null +++ b/server-data-store/src/test/javascript/server-data-store-login.js @@ -0,0 +1,85 @@ +/** + * A module for configuring the login page to openBIS. It hides and shows + * the login form and main content as necessary. It invokes a specified + * function on successful login. + * + * This module assumes that the page follows the structure of our standard + * login page. This means that the Following elements are defined : + * + * div#login-form-div + * form#login-form + * input#username + * input#password + * button#login-button + * div#main + * button#logout-button + * + * Assuming these elements are defined, this module configures their appeareance + * and behavior.The div#main element is initially hidden until the user logs in. + * Once logged in, the div#login-form-div element is hidden and the div#main + * element is made visible. + * + * @module datastore-login + */ + + +/** + * Configure the login page to hide and show the login form and main content + * as appropriate + * + * @param datastore The datastore facade object + * @param onLogin The function to be called when login succeeds. + * @function + */ + +function dssClientLoginPage(datastore, onLogin) +{ + this.datastore = datastore; + this.onLogin = onLogin; +} + +dssClientLoginPage.prototype.configure = function(){ + var loginPage = this; + + document.getElementById("main").style.display = "none"; + + var username = document.getElementById("username").value; + if(username == null || username.length==0) { + document.getElementById("username").focus(); + } else { + document.getElementById("login-button").focus(); + } + + document.getElementById("logout-button").onclick = function() { + loginPage.datastore.logout(function(data) { + document.getElementById("login-form-div").style.display = "block"; + document.getElementById("main").style.display = "none"; + document.getElementById("openbis-logo").style.height = "100px"; + document.getElementById("username").focus(); + }); + + }; + + + document.getElementById("login-form").onsubmit = function() { + loginPage.datastore.login(document.getElementById("username").value.trim(), + document.getElementById("password").value.trim(), + function(data) { + document.getElementById("username").value = ''; + document.getElementById("password").value = ''; + loginPage.onLogin(data); + }) + }; + + loginPage.datastore.ifRestoredSessionActive(function(data) { loginPage.onLogin(data) }); + + + document.onkeydown=function(evt){ + var keyCode = evt ? (evt.which ? evt.which : evt.keyCode) : event.keyCode; + if(keyCode == 13) + { + document.getElementById("login-form").submit(); + } + } + +} diff --git a/server-original-data-store/source/java/ch/systemsx/cisd/etlserver/registrator/v2/AbstractOmniscientTopLevelDataSetRegistrator.java b/server-original-data-store/source/java/ch/systemsx/cisd/etlserver/registrator/v2/AbstractOmniscientTopLevelDataSetRegistrator.java index 9de75518280ff1d8f5b9bb13c467c1c098a6c7aa..53bf0bec76ac501b2856afd4acbea3a8a44f8dda 100644 --- a/server-original-data-store/source/java/ch/systemsx/cisd/etlserver/registrator/v2/AbstractOmniscientTopLevelDataSetRegistrator.java +++ b/server-original-data-store/source/java/ch/systemsx/cisd/etlserver/registrator/v2/AbstractOmniscientTopLevelDataSetRegistrator.java @@ -383,8 +383,8 @@ public abstract class AbstractOmniscientTopLevelDataSetRegistrator<T extends Dat { return true; } - return state.getMarkerFileUtility().deleteAndLogIsFinishedMarkerFile( - incomingDataSetFileOrIsFinishedFile); + return didOperationSucceed ? state.getMarkerFileUtility().deleteAndLogIsFinishedMarkerFile( + incomingDataSetFileOrIsFinishedFile) : true; } }; } else diff --git a/server-original-data-store/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/JythonDropboxRecoveryTest.java b/server-original-data-store/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/JythonDropboxRecoveryTest.java index 50efda53e1f98260839acc279586bebe75ec0d1a..f6efd0c8fcc982d9d59364f836c7a3e866920f48 100644 --- a/server-original-data-store/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/JythonDropboxRecoveryTest.java +++ b/server-original-data-store/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/JythonDropboxRecoveryTest.java @@ -369,7 +369,7 @@ public class JythonDropboxRecoveryTest extends AbstractJythonDataSetHandlerTest { assertDataSetNotStoredProcess(DATA_SET_CODE); - assertNoOriginalMarkerFileExists(); + assertOriginalMarkerFileExists(); assertNoRecoveryMarkerFile(); JythonHookTestTool.assertMessagesInWorkingDirectory(workingDirectory, @@ -1005,8 +1005,7 @@ public class JythonDropboxRecoveryTest extends AbstractJythonDataSetHandlerTest assertDataSetNotStoredProcess(DATA_SET_CODE); - // no recovery is triggered - files are moved to the faulty paths/marker file is deleted - assertNoOriginalMarkerFileExists(); + assertOriginalMarkerFileExists(); assertNoRecoveryMarkerFile(); assertDirEmpty(precommitDirectory); diff --git a/ui-eln-lims/src/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/util/BarcodeUtil.js b/ui-eln-lims/src/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/util/BarcodeUtil.js index ebeaa9195abdff88e7d31a0772db4f706d9d2af5..8edb7e0404ec80281c46eb595d9d43713bc3a912 100644 --- a/ui-eln-lims/src/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/util/BarcodeUtil.js +++ b/ui-eln-lims/src/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/util/BarcodeUtil.js @@ -30,6 +30,11 @@ var BarcodeUtil = new function() { } } + this.readSample = function(barcodeReaderInput) { + barcodeReader = barcodeReaderInput; + readSample(); + } + var barcodeReaderEventListener = function(action) { return function(event) { if(!barcodeTimeout) { diff --git a/ui-eln-lims/src/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/SideMenu/SideMenuWidgetView.js b/ui-eln-lims/src/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/SideMenu/SideMenuWidgetView.js index b14f08862ad5c87e8728a30f1e902e7f651bc049..6a680ed09e01fe66a019fd9d7be4669c533d6634 100644 --- a/ui-eln-lims/src/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/SideMenu/SideMenuWidgetView.js +++ b/ui-eln-lims/src/core-plugins/eln-lims/1/as/webapps/eln-lims/html/js/views/SideMenu/SideMenuWidgetView.js @@ -149,10 +149,49 @@ function SideMenuWidgetView(sideMenuWidgetController, sideMenuWidgetModel) { "logoutBtn" ) + var barcodeReaderBtn = FormUtil.getButtonWithIcon( + "glyphicon-barcode", + function () { + var $input = $("<input>", { type : "file", accept : "image/*" }); + $input.click(); + $input.change(function(event) { +// const hints = new Map(); +// const formats = [ZXing.BarcodeFormat.QR_CODE /*, ...*/]; +// hints.set(ZXing.DecodeHintType.POSSIBLE_FORMATS, formats); +// const codeReader = new ZXing.BrowserMultiFormatReader(hints); + const codeReader = new ZXing.BrowserMultiFormatReader(); + const fileReader = new FileReader(); + fileReader.readAsArrayBuffer(event.target.files[0]); + fileReader.onloadend = (evt) => { + if (evt.target.readyState === FileReader.DONE) { + var img = null; + img = Images.decodeArrayBuffer(evt.target.result, function(event) { + img.videoWidth = 0; // Bugfix so ZXing decodes the image instead throwing an exception + var result = codeReader.decode(img); + if(result && result.text) { + BarcodeUtil.readSample(result.text); + } else { + Util.showError("Failed to read barcode"); + } + }); + } + } + }) + }, + null, + null, + "barcodeReaderBtn" + ) + var $searchForm = $("<form>", { onsubmit: "return false;" }) .append(logoutButton) .append(searchElement) - .append(dropDownSearch) + .append(dropDownSearch); + + if(profile.mainMenu.showBarcodes) { + $searchForm.append(barcodeReaderBtn); + } + $searchForm.css("width", "100%") $searchForm.css("display", "flex") @@ -244,3 +283,33 @@ function SideMenuWidgetView(sideMenuWidgetController, sideMenuWidgetModel) { ReactDOM.render(BrowserElement, this._sideMenuWidgetModel.menuDOMBody.get(0)) } } + +var Images = {}; +Images.decodeArrayBuffer = function(buffer, onLoad) { + var mime; + var a = new Uint8Array(buffer); + var nb = a.length; + if (nb < 4) + return null; + var b0 = a[0]; + var b1 = a[1]; + var b2 = a[2]; + var b3 = a[3]; + if (b0 == 0x89 && b1 == 0x50 && b2 == 0x4E && b3 == 0x47) + mime = 'image/png'; + else if (b0 == 0xff && b1 == 0xd8) + mime = 'image/jpeg'; + else if (b0 == 0x47 && b1 == 0x49 && b2 == 0x46) + mime = 'image/gif'; + else + return null; + var binary = ""; + for (var i = 0; i < nb; i++) + binary += String.fromCharCode(a[i]); + var base64 = window.btoa(binary); + var image = new Image(); + image.onload = onLoad; + image.src = 'data:' + mime + ';base64,' + base64; + image.Uint8Array = a; + return image; +} \ No newline at end of file diff --git a/ui-eln-lims/src/core-plugins/eln-lims/1/as/webapps/eln-lims/html/lib/zxing-js/LICENSE.TXT b/ui-eln-lims/src/core-plugins/eln-lims/1/as/webapps/eln-lims/html/lib/zxing-js/LICENSE.TXT new file mode 100644 index 0000000000000000000000000000000000000000..510991edab065c65cbbad6a78355f230542348dc --- /dev/null +++ b/ui-eln-lims/src/core-plugins/eln-lims/1/as/webapps/eln-lims/html/lib/zxing-js/LICENSE.TXT @@ -0,0 +1,245 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +======================================================================== +jai-imageio +======================================================================== + +Copyright (c) 2005 Sun Microsystems, Inc. +Copyright © 2010-2014 University of Manchester +Copyright © 2010-2015 Stian Soiland-Reyes +Copyright © 2015 Peter Hull +All Rights Reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions +are met: + +- Redistribution of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +- Redistribution in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + +Neither the name of Sun Microsystems, Inc. or the names of +contributors may be used to endorse or promote products derived +from this software without specific prior written permission. + +This software is provided "AS IS," without a warranty of any +kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND +WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY +EXCLUDED. SUN MIDROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL +NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF +USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS +DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR +ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, +CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND +REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR +INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + +You acknowledge that this software is not designed or intended for +use in the design, construction, operation or maintenance of any +nuclear facility. \ No newline at end of file diff --git a/ui-eln-lims/src/core-plugins/eln-lims/1/as/webapps/eln-lims/html/lib/zxing-js/VERSION.TXT b/ui-eln-lims/src/core-plugins/eln-lims/1/as/webapps/eln-lims/html/lib/zxing-js/VERSION.TXT new file mode 100644 index 0000000000000000000000000000000000000000..7f786826109e27dbb6ac4455afe4183bdc8f0d8d --- /dev/null +++ b/ui-eln-lims/src/core-plugins/eln-lims/1/as/webapps/eln-lims/html/lib/zxing-js/VERSION.TXT @@ -0,0 +1 @@ +0.19.2 \ No newline at end of file diff --git a/ui-eln-lims/src/core-plugins/eln-lims/1/as/webapps/eln-lims/html/lib/zxing-js/js/zxing-js-min.js b/ui-eln-lims/src/core-plugins/eln-lims/1/as/webapps/eln-lims/html/lib/zxing-js/js/zxing-js-min.js new file mode 100644 index 0000000000000000000000000000000000000000..daff5be72139f88bf1048fbc8f74e6efd26c49ab --- /dev/null +++ b/ui-eln-lims/src/core-plugins/eln-lims/1/as/webapps/eln-lims/html/lib/zxing-js/js/zxing-js-min.js @@ -0,0 +1,15 @@ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).ZXing={})}(this,(function(t){"use strict"; +/*! ***************************************************************************** + Copyright (c) Microsoft Corporation. All rights reserved. + Licensed under the Apache License, Version 2.0 (the "License"); you may not use + this file except in compliance with the License. You may obtain a copy of the + License at http://www.apache.org/licenses/LICENSE-2.0 + + THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED + WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, + MERCHANTABLITY OR NON-INFRINGEMENT. + + See the Apache Version 2.0 License for specific language governing permissions + and limitations under the License. + ***************************************************************************** */var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r])};var r,n=function(t){function r(e){var r,n,i,s=this.constructor,o=t.call(this,e)||this;return Object.defineProperty(o,"name",{value:s.name,enumerable:!1}),r=o,n=s.prototype,(i=Object.setPrototypeOf)?i(r,n):r.__proto__=n,function(t,e){void 0===e&&(e=t.constructor);var r=Error.captureStackTrace;r&&r(t,e)}(o),o}return function(t,r){function n(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}(r,t),r}(Error);class i extends n{constructor(t){super(t),this.message=t}getKind(){return this.constructor.kind}}i.kind="Exception";class s extends i{}s.kind="ArgumentException";class o extends i{}o.kind="IllegalArgumentException";class a{constructor(t){if(this.binarizer=t,null===t)throw new o("Binarizer must be non-null.")}getWidth(){return this.binarizer.getWidth()}getHeight(){return this.binarizer.getHeight()}getBlackRow(t,e){return this.binarizer.getBlackRow(t,e)}getBlackMatrix(){return null!==this.matrix&&void 0!==this.matrix||(this.matrix=this.binarizer.getBlackMatrix()),this.matrix}isCropSupported(){return this.binarizer.getLuminanceSource().isCropSupported()}crop(t,e,r,n){const i=this.binarizer.getLuminanceSource().crop(t,e,r,n);return new a(this.binarizer.createBinarizer(i))}isRotateSupported(){return this.binarizer.getLuminanceSource().isRotateSupported()}rotateCounterClockwise(){const t=this.binarizer.getLuminanceSource().rotateCounterClockwise();return new a(this.binarizer.createBinarizer(t))}rotateCounterClockwise45(){const t=this.binarizer.getLuminanceSource().rotateCounterClockwise45();return new a(this.binarizer.createBinarizer(t))}toString(){try{return this.getBlackMatrix().toString()}catch(t){return""}}}class l extends i{static getChecksumInstance(){return new l}}l.kind="ChecksumException";class h{constructor(t){this.source=t}getLuminanceSource(){return this.source}getWidth(){return this.source.getWidth()}getHeight(){return this.source.getHeight()}}class c{static arraycopy(t,e,r,n,i){for(;i--;)r[n++]=t[e++]}static currentTimeMillis(){return Date.now()}}class u extends i{}u.kind="IndexOutOfBoundsException";class d extends u{constructor(t,e){super(e),this.index=t,this.message=e}}d.kind="ArrayIndexOutOfBoundsException";class g{static fill(t,e){for(let r=0,n=t.length;r<n;r++)t[r]=e}static fillWithin(t,e,r,n){g.rangeCheck(t.length,e,r);for(let i=e;i<r;i++)t[i]=n}static rangeCheck(t,e,r){if(e>r)throw new o("fromIndex("+e+") > toIndex("+r+")");if(e<0)throw new d(e);if(r>t)throw new d(r)}static asList(...t){return t}static create(t,e,r){return Array.from({length:t}).map((t=>Array.from({length:e}).fill(r)))}static createInt32Array(t,e,r){return Array.from({length:t}).map((t=>Int32Array.from({length:e}).fill(r)))}static equals(t,e){if(!t)return!1;if(!e)return!1;if(!t.length)return!1;if(!e.length)return!1;if(t.length!==e.length)return!1;for(let r=0,n=t.length;r<n;r++)if(t[r]!==e[r])return!1;return!0}static hashCode(t){if(null===t)return 0;let e=1;for(const r of t)e=31*e+r;return e}static fillUint8Array(t,e){for(let r=0;r!==t.length;r++)t[r]=e}static copyOf(t,e){return t.slice(0,e)}static copyOfUint8Array(t,e){if(t.length<=e){const r=new Uint8Array(e);return r.set(t),r}return t.slice(0,e)}static copyOfRange(t,e,r){const n=r-e,i=new Int32Array(n);return c.arraycopy(t,e,i,0,n),i}static binarySearch(t,e,r){void 0===r&&(r=g.numberComparator);let n=0,i=t.length-1;for(;n<=i;){const s=i+n>>1,o=r(e,t[s]);if(o>0)n=s+1;else{if(!(o<0))return s;i=s-1}}return-n-1}static numberComparator(t,e){return t-e}}class f{static numberOfTrailingZeros(t){let e;if(0===t)return 32;let r=31;return e=t<<16,0!==e&&(r-=16,t=e),e=t<<8,0!==e&&(r-=8,t=e),e=t<<4,0!==e&&(r-=4,t=e),e=t<<2,0!==e&&(r-=2,t=e),r-(t<<1>>>31)}static numberOfLeadingZeros(t){if(0===t)return 32;let e=1;return t>>>16==0&&(e+=16,t<<=16),t>>>24==0&&(e+=8,t<<=8),t>>>28==0&&(e+=4,t<<=4),t>>>30==0&&(e+=2,t<<=2),e-=t>>>31,e}static toHexString(t){return t.toString(16)}static toBinaryString(t){return String(parseInt(String(t),2))}static bitCount(t){return t=(t=(858993459&(t-=t>>>1&1431655765))+(t>>>2&858993459))+(t>>>4)&252645135,t+=t>>>8,63&(t+=t>>>16)}static truncDivision(t,e){return Math.trunc(t/e)}static parseInt(t,e){return parseInt(t,e)}}f.MIN_VALUE_32_BITS=-2147483648,f.MAX_VALUE=Number.MAX_SAFE_INTEGER;class w{constructor(t,e){void 0===t?(this.size=0,this.bits=new Int32Array(1)):(this.size=t,this.bits=null==e?w.makeArray(t):e)}getSize(){return this.size}getSizeInBytes(){return Math.floor((this.size+7)/8)}ensureCapacity(t){if(t>32*this.bits.length){const e=w.makeArray(t);c.arraycopy(this.bits,0,e,0,this.bits.length),this.bits=e}}get(t){return 0!=(this.bits[Math.floor(t/32)]&1<<(31&t))}set(t){this.bits[Math.floor(t/32)]|=1<<(31&t)}flip(t){this.bits[Math.floor(t/32)]^=1<<(31&t)}getNextSet(t){const e=this.size;if(t>=e)return e;const r=this.bits;let n=Math.floor(t/32),i=r[n];i&=~((1<<(31&t))-1);const s=r.length;for(;0===i;){if(++n===s)return e;i=r[n]}const o=32*n+f.numberOfTrailingZeros(i);return o>e?e:o}getNextUnset(t){const e=this.size;if(t>=e)return e;const r=this.bits;let n=Math.floor(t/32),i=~r[n];i&=~((1<<(31&t))-1);const s=r.length;for(;0===i;){if(++n===s)return e;i=~r[n]}const o=32*n+f.numberOfTrailingZeros(i);return o>e?e:o}setBulk(t,e){this.bits[Math.floor(t/32)]=e}setRange(t,e){if(e<t||t<0||e>this.size)throw new o;if(e===t)return;e--;const r=Math.floor(t/32),n=Math.floor(e/32),i=this.bits;for(let s=r;s<=n;s++){const o=(2<<(s<n?31:31&e))-(1<<(s>r?0:31&t));i[s]|=o}}clear(){const t=this.bits.length,e=this.bits;for(let r=0;r<t;r++)e[r]=0}isRange(t,e,r){if(e<t||t<0||e>this.size)throw new o;if(e===t)return!0;e--;const n=Math.floor(t/32),i=Math.floor(e/32),s=this.bits;for(let o=n;o<=i;o++){const a=(2<<(o<i?31:31&e))-(1<<(o>n?0:31&t))&4294967295;if((s[o]&a)!==(r?a:0))return!1}return!0}appendBit(t){this.ensureCapacity(this.size+1),t&&(this.bits[Math.floor(this.size/32)]|=1<<(31&this.size)),this.size++}appendBits(t,e){if(e<0||e>32)throw new o("Num bits must be between 0 and 32");this.ensureCapacity(this.size+e);for(let r=e;r>0;r--)this.appendBit(1==(t>>r-1&1))}appendBitArray(t){const e=t.size;this.ensureCapacity(this.size+e);for(let r=0;r<e;r++)this.appendBit(t.get(r))}xor(t){if(this.size!==t.size)throw new o("Sizes don't match");const e=this.bits;for(let r=0,n=e.length;r<n;r++)e[r]^=t.bits[r]}toBytes(t,e,r,n){for(let i=0;i<n;i++){let n=0;for(let e=0;e<8;e++)this.get(t)&&(n|=1<<7-e),t++;e[r+i]=n}}getBitArray(){return this.bits}reverse(){const t=new Int32Array(this.bits.length),e=Math.floor((this.size-1)/32),r=e+1,n=this.bits;for(let i=0;i<r;i++){let r=n[i];r=r>>1&1431655765|(1431655765&r)<<1,r=r>>2&858993459|(858993459&r)<<2,r=r>>4&252645135|(252645135&r)<<4,r=r>>8&16711935|(16711935&r)<<8,r=r>>16&65535|(65535&r)<<16,t[e-i]=r}if(this.size!==32*r){const e=32*r-this.size;let n=t[0]>>>e;for(let i=1;i<r;i++){const r=t[i];n|=r<<32-e,t[i-1]=n,n=r>>>e}t[r-1]=n}this.bits=t}static makeArray(t){return new Int32Array(Math.floor((t+31)/32))}equals(t){if(!(t instanceof w))return!1;const e=t;return this.size===e.size&&g.equals(this.bits,e.bits)}hashCode(){return 31*this.size+g.hashCode(this.bits)}toString(){let t="";for(let e=0,r=this.size;e<r;e++)0==(7&e)&&(t+=" "),t+=this.get(e)?"X":".";return t}clone(){return new w(this.size,this.bits.slice())}}!function(t){t[t.OTHER=0]="OTHER",t[t.PURE_BARCODE=1]="PURE_BARCODE",t[t.POSSIBLE_FORMATS=2]="POSSIBLE_FORMATS",t[t.TRY_HARDER=3]="TRY_HARDER",t[t.CHARACTER_SET=4]="CHARACTER_SET",t[t.ALLOWED_LENGTHS=5]="ALLOWED_LENGTHS",t[t.ASSUME_CODE_39_CHECK_DIGIT=6]="ASSUME_CODE_39_CHECK_DIGIT",t[t.ASSUME_GS1=7]="ASSUME_GS1",t[t.RETURN_CODABAR_START_END=8]="RETURN_CODABAR_START_END",t[t.NEED_RESULT_POINT_CALLBACK=9]="NEED_RESULT_POINT_CALLBACK",t[t.ALLOWED_EAN_EXTENSIONS=10]="ALLOWED_EAN_EXTENSIONS"}(r||(r={}));var A,C=r;class E extends i{static getFormatInstance(){return new E}}E.kind="FormatException",function(t){t[t.Cp437=0]="Cp437",t[t.ISO8859_1=1]="ISO8859_1",t[t.ISO8859_2=2]="ISO8859_2",t[t.ISO8859_3=3]="ISO8859_3",t[t.ISO8859_4=4]="ISO8859_4",t[t.ISO8859_5=5]="ISO8859_5",t[t.ISO8859_6=6]="ISO8859_6",t[t.ISO8859_7=7]="ISO8859_7",t[t.ISO8859_8=8]="ISO8859_8",t[t.ISO8859_9=9]="ISO8859_9",t[t.ISO8859_10=10]="ISO8859_10",t[t.ISO8859_11=11]="ISO8859_11",t[t.ISO8859_13=12]="ISO8859_13",t[t.ISO8859_14=13]="ISO8859_14",t[t.ISO8859_15=14]="ISO8859_15",t[t.ISO8859_16=15]="ISO8859_16",t[t.SJIS=16]="SJIS",t[t.Cp1250=17]="Cp1250",t[t.Cp1251=18]="Cp1251",t[t.Cp1252=19]="Cp1252",t[t.Cp1256=20]="Cp1256",t[t.UnicodeBigUnmarked=21]="UnicodeBigUnmarked",t[t.UTF8=22]="UTF8",t[t.ASCII=23]="ASCII",t[t.Big5=24]="Big5",t[t.GB18030=25]="GB18030",t[t.EUC_KR=26]="EUC_KR"}(A||(A={}));class m{constructor(t,e,r,...n){this.valueIdentifier=t,this.name=r,this.values="number"==typeof e?Int32Array.from([e]):e,this.otherEncodingNames=n,m.VALUE_IDENTIFIER_TO_ECI.set(t,this),m.NAME_TO_ECI.set(r,this);const i=this.values;for(let t=0,e=i.length;t!==e;t++){const e=i[t];m.VALUES_TO_ECI.set(e,this)}for(const t of n)m.NAME_TO_ECI.set(t,this)}getValueIdentifier(){return this.valueIdentifier}getName(){return this.name}getValue(){return this.values[0]}static getCharacterSetECIByValue(t){if(t<0||t>=900)throw new E("incorect value");const e=m.VALUES_TO_ECI.get(t);if(void 0===e)throw new E("incorect value");return e}static getCharacterSetECIByName(t){const e=m.NAME_TO_ECI.get(t);if(void 0===e)throw new E("incorect value");return e}equals(t){if(!(t instanceof m))return!1;const e=t;return this.getName()===e.getName()}}m.VALUE_IDENTIFIER_TO_ECI=new Map,m.VALUES_TO_ECI=new Map,m.NAME_TO_ECI=new Map,m.Cp437=new m(A.Cp437,Int32Array.from([0,2]),"Cp437"),m.ISO8859_1=new m(A.ISO8859_1,Int32Array.from([1,3]),"ISO-8859-1","ISO88591","ISO8859_1"),m.ISO8859_2=new m(A.ISO8859_2,4,"ISO-8859-2","ISO88592","ISO8859_2"),m.ISO8859_3=new m(A.ISO8859_3,5,"ISO-8859-3","ISO88593","ISO8859_3"),m.ISO8859_4=new m(A.ISO8859_4,6,"ISO-8859-4","ISO88594","ISO8859_4"),m.ISO8859_5=new m(A.ISO8859_5,7,"ISO-8859-5","ISO88595","ISO8859_5"),m.ISO8859_6=new m(A.ISO8859_6,8,"ISO-8859-6","ISO88596","ISO8859_6"),m.ISO8859_7=new m(A.ISO8859_7,9,"ISO-8859-7","ISO88597","ISO8859_7"),m.ISO8859_8=new m(A.ISO8859_8,10,"ISO-8859-8","ISO88598","ISO8859_8"),m.ISO8859_9=new m(A.ISO8859_9,11,"ISO-8859-9","ISO88599","ISO8859_9"),m.ISO8859_10=new m(A.ISO8859_10,12,"ISO-8859-10","ISO885910","ISO8859_10"),m.ISO8859_11=new m(A.ISO8859_11,13,"ISO-8859-11","ISO885911","ISO8859_11"),m.ISO8859_13=new m(A.ISO8859_13,15,"ISO-8859-13","ISO885913","ISO8859_13"),m.ISO8859_14=new m(A.ISO8859_14,16,"ISO-8859-14","ISO885914","ISO8859_14"),m.ISO8859_15=new m(A.ISO8859_15,17,"ISO-8859-15","ISO885915","ISO8859_15"),m.ISO8859_16=new m(A.ISO8859_16,18,"ISO-8859-16","ISO885916","ISO8859_16"),m.SJIS=new m(A.SJIS,20,"SJIS","Shift_JIS"),m.Cp1250=new m(A.Cp1250,21,"Cp1250","windows-1250"),m.Cp1251=new m(A.Cp1251,22,"Cp1251","windows-1251"),m.Cp1252=new m(A.Cp1252,23,"Cp1252","windows-1252"),m.Cp1256=new m(A.Cp1256,24,"Cp1256","windows-1256"),m.UnicodeBigUnmarked=new m(A.UnicodeBigUnmarked,25,"UnicodeBigUnmarked","UTF-16BE","UnicodeBig"),m.UTF8=new m(A.UTF8,26,"UTF8","UTF-8"),m.ASCII=new m(A.ASCII,Int32Array.from([27,170]),"ASCII","US-ASCII"),m.Big5=new m(A.Big5,28,"Big5"),m.GB18030=new m(A.GB18030,29,"GB18030","GB2312","EUC_CN","GBK"),m.EUC_KR=new m(A.EUC_KR,30,"EUC_KR","EUC-KR");class _ extends i{}_.kind="UnsupportedOperationException";class I{static decode(t,e){const r=this.encodingName(e);return this.customDecoder?this.customDecoder(t,r):"undefined"==typeof TextDecoder||this.shouldDecodeOnFallback(r)?this.decodeFallback(t,r):new TextDecoder(r).decode(t)}static shouldDecodeOnFallback(t){return!I.isBrowser()&&"ISO-8859-1"===t}static encode(t,e){const r=this.encodingName(e);return this.customEncoder?this.customEncoder(t,r):"undefined"==typeof TextEncoder?this.encodeFallback(t):(new TextEncoder).encode(t)}static isBrowser(){return"undefined"!=typeof window&&"[object Window]"==={}.toString.call(window)}static encodingName(t){return"string"==typeof t?t:t.getName()}static encodingCharacterSet(t){return t instanceof m?t:m.getCharacterSetECIByName(t)}static decodeFallback(t,e){const r=this.encodingCharacterSet(e);if(I.isDecodeFallbackSupported(r)){let e="";for(let r=0,n=t.length;r<n;r++){let n=t[r].toString(16);n.length<2&&(n="0"+n),e+="%"+n}return decodeURIComponent(e)}if(r.equals(m.UnicodeBigUnmarked))return String.fromCharCode.apply(null,new Uint16Array(t.buffer));throw new _(`Encoding ${this.encodingName(e)} not supported by fallback.`)}static isDecodeFallbackSupported(t){return t.equals(m.UTF8)||t.equals(m.ISO8859_1)||t.equals(m.ASCII)}static encodeFallback(t){const e=btoa(unescape(encodeURIComponent(t))).split(""),r=[];for(let t=0;t<e.length;t++)r.push(e[t].charCodeAt(0));return new Uint8Array(r)}}class S{static castAsNonUtf8Char(t,e=null){const r=e?e.getName():this.ISO88591;return I.decode(new Uint8Array([t]),r)}static guessEncoding(t,e){if(null!=e&&void 0!==e.get(C.CHARACTER_SET))return e.get(C.CHARACTER_SET).toString();const r=t.length;let n=!0,i=!0,s=!0,o=0,a=0,l=0,h=0,c=0,u=0,d=0,g=0,f=0,w=0,A=0;const E=t.length>3&&239===t[0]&&187===t[1]&&191===t[2];for(let e=0;e<r&&(n||i||s);e++){const r=255&t[e];s&&(o>0?0==(128&r)?s=!1:o--:0!=(128&r)&&(0==(64&r)?s=!1:(o++,0==(32&r)?a++:(o++,0==(16&r)?l++:(o++,0==(8&r)?h++:s=!1))))),n&&(r>127&&r<160?n=!1:r>159&&(r<192||215===r||247===r)&&A++),i&&(c>0?r<64||127===r||r>252?i=!1:c--:128===r||160===r||r>239?i=!1:r>160&&r<224?(u++,g=0,d++,d>f&&(f=d)):r>127?(c++,d=0,g++,g>w&&(w=g)):(d=0,g=0))}return s&&o>0&&(s=!1),i&&c>0&&(i=!1),s&&(E||a+l+h>0)?S.UTF8:i&&(S.ASSUME_SHIFT_JIS||f>=3||w>=3)?S.SHIFT_JIS:n&&i?2===f&&2===u||10*A>=r?S.SHIFT_JIS:S.ISO88591:n?S.ISO88591:i?S.SHIFT_JIS:s?S.UTF8:S.PLATFORM_DEFAULT_ENCODING}static format(t,...e){let r=-1;return t.replace(/%(-)?(0?[0-9]+)?([.][0-9]+)?([#][0-9]+)?([scfpexd%])/g,(function(t,n,i,s,o,a){if("%%"===t)return"%";if(void 0===e[++r])return;t=s?parseInt(s.substr(1)):void 0;let l,h=o?parseInt(o.substr(1)):void 0;switch(a){case"s":l=e[r];break;case"c":l=e[r][0];break;case"f":l=parseFloat(e[r]).toFixed(t);break;case"p":l=parseFloat(e[r]).toPrecision(t);break;case"e":l=parseFloat(e[r]).toExponential(t);break;case"x":l=parseInt(e[r]).toString(h||16);break;case"d":l=parseFloat(parseInt(e[r],h||10).toPrecision(t)).toFixed(0)}l="object"==typeof l?JSON.stringify(l):(+l).toString(h);let c=parseInt(i),u=i&&i[0]+""=="0"?"0":" ";for(;l.length<c;)l=void 0!==n?l+u:u+l;return l}))}static getBytes(t,e){return I.encode(t,e)}static getCharCode(t,e=0){return t.charCodeAt(e)}static getCharAt(t){return String.fromCharCode(t)}}S.SHIFT_JIS=m.SJIS.getName(),S.GB2312="GB2312",S.ISO88591=m.ISO8859_1.getName(),S.EUC_JP="EUC_JP",S.UTF8=m.UTF8.getName(),S.PLATFORM_DEFAULT_ENCODING=S.UTF8,S.ASSUME_SHIFT_JIS=!1;class p{constructor(t=""){this.value=t}enableDecoding(t){return this.encoding=t,this}append(t){return"string"==typeof t?this.value+=t.toString():this.encoding?this.value+=S.castAsNonUtf8Char(t,this.encoding):this.value+=String.fromCharCode(t),this}appendChars(t,e,r){for(let n=e;e<e+r;n++)this.append(t[n]);return this}length(){return this.value.length}charAt(t){return this.value.charAt(t)}deleteCharAt(t){this.value=this.value.substr(0,t)+this.value.substring(t+1)}setCharAt(t,e){this.value=this.value.substr(0,t)+e+this.value.substr(t+1)}substring(t,e){return this.value.substring(t,e)}setLengthToZero(){this.value=""}toString(){return this.value}insert(t,e){this.value=this.value.substr(0,t)+e+this.value.substr(t+e.length)}}class T{constructor(t,e,r,n){if(this.width=t,this.height=e,this.rowSize=r,this.bits=n,null==e&&(e=t),this.height=e,t<1||e<1)throw new o("Both dimensions must be greater than 0");null==r&&(r=Math.floor((t+31)/32)),this.rowSize=r,null==n&&(this.bits=new Int32Array(this.rowSize*this.height))}static parseFromBooleanArray(t){const e=t.length,r=t[0].length,n=new T(r,e);for(let i=0;i<e;i++){const e=t[i];for(let t=0;t<r;t++)e[t]&&n.set(t,i)}return n}static parseFromString(t,e,r){if(null===t)throw new o("stringRepresentation cannot be null");const n=new Array(t.length);let i=0,s=0,a=-1,l=0,h=0;for(;h<t.length;)if("\n"===t.charAt(h)||"\r"===t.charAt(h)){if(i>s){if(-1===a)a=i-s;else if(i-s!==a)throw new o("row lengths do not match");s=i,l++}h++}else if(t.substring(h,h+e.length)===e)h+=e.length,n[i]=!0,i++;else{if(t.substring(h,h+r.length)!==r)throw new o("illegal character encountered: "+t.substring(h));h+=r.length,n[i]=!1,i++}if(i>s){if(-1===a)a=i-s;else if(i-s!==a)throw new o("row lengths do not match");l++}const c=new T(a,l);for(let t=0;t<i;t++)n[t]&&c.set(Math.floor(t%a),Math.floor(t/a));return c}get(t,e){const r=e*this.rowSize+Math.floor(t/32);return 0!=(this.bits[r]>>>(31&t)&1)}set(t,e){const r=e*this.rowSize+Math.floor(t/32);this.bits[r]|=1<<(31&t)&4294967295}unset(t,e){const r=e*this.rowSize+Math.floor(t/32);this.bits[r]&=~(1<<(31&t)&4294967295)}flip(t,e){const r=e*this.rowSize+Math.floor(t/32);this.bits[r]^=1<<(31&t)&4294967295}xor(t){if(this.width!==t.getWidth()||this.height!==t.getHeight()||this.rowSize!==t.getRowSize())throw new o("input matrix dimensions do not match");const e=new w(Math.floor(this.width/32)+1),r=this.rowSize,n=this.bits;for(let i=0,s=this.height;i<s;i++){const s=i*r,o=t.getRow(i,e).getBitArray();for(let t=0;t<r;t++)n[s+t]^=o[t]}}clear(){const t=this.bits,e=t.length;for(let r=0;r<e;r++)t[r]=0}setRegion(t,e,r,n){if(e<0||t<0)throw new o("Left and top must be nonnegative");if(n<1||r<1)throw new o("Height and width must be at least 1");const i=t+r,s=e+n;if(s>this.height||i>this.width)throw new o("The region must fit inside the matrix");const a=this.rowSize,l=this.bits;for(let r=e;r<s;r++){const e=r*a;for(let r=t;r<i;r++)l[e+Math.floor(r/32)]|=1<<(31&r)&4294967295}}getRow(t,e){null==e||e.getSize()<this.width?e=new w(this.width):e.clear();const r=this.rowSize,n=this.bits,i=t*r;for(let t=0;t<r;t++)e.setBulk(32*t,n[i+t]);return e}setRow(t,e){c.arraycopy(e.getBitArray(),0,this.bits,t*this.rowSize,this.rowSize)}rotate180(){const t=this.getWidth(),e=this.getHeight();let r=new w(t),n=new w(t);for(let t=0,i=Math.floor((e+1)/2);t<i;t++)r=this.getRow(t,r),n=this.getRow(e-1-t,n),r.reverse(),n.reverse(),this.setRow(t,n),this.setRow(e-1-t,r)}getEnclosingRectangle(){const t=this.width,e=this.height,r=this.rowSize,n=this.bits;let i=t,s=e,o=-1,a=-1;for(let t=0;t<e;t++)for(let e=0;e<r;e++){const l=n[t*r+e];if(0!==l){if(t<s&&(s=t),t>a&&(a=t),32*e<i){let t=0;for(;0==(l<<31-t&4294967295);)t++;32*e+t<i&&(i=32*e+t)}if(32*e+31>o){let t=31;for(;l>>>t==0;)t--;32*e+t>o&&(o=32*e+t)}}}return o<i||a<s?null:Int32Array.from([i,s,o-i+1,a-s+1])}getTopLeftOnBit(){const t=this.rowSize,e=this.bits;let r=0;for(;r<e.length&&0===e[r];)r++;if(r===e.length)return null;const n=r/t;let i=r%t*32;const s=e[r];let o=0;for(;0==(s<<31-o&4294967295);)o++;return i+=o,Int32Array.from([i,n])}getBottomRightOnBit(){const t=this.rowSize,e=this.bits;let r=e.length-1;for(;r>=0&&0===e[r];)r--;if(r<0)return null;const n=Math.floor(r/t);let i=32*Math.floor(r%t);const s=e[r];let o=31;for(;s>>>o==0;)o--;return i+=o,Int32Array.from([i,n])}getWidth(){return this.width}getHeight(){return this.height}getRowSize(){return this.rowSize}equals(t){if(!(t instanceof T))return!1;const e=t;return this.width===e.width&&this.height===e.height&&this.rowSize===e.rowSize&&g.equals(this.bits,e.bits)}hashCode(){let t=this.width;return t=31*t+this.width,t=31*t+this.height,t=31*t+this.rowSize,t=31*t+g.hashCode(this.bits),t}toString(t="X ",e=" ",r="\n"){return this.buildToString(t,e,r)}buildToString(t,e,r){let n=new p;for(let i=0,s=this.height;i<s;i++){for(let r=0,s=this.width;r<s;r++)n.append(this.get(r,i)?t:e);n.append(r)}return n.toString()}clone(){return new T(this.width,this.height,this.rowSize,this.bits.slice())}}class R extends i{static getNotFoundInstance(){return new R}}R.kind="NotFoundException";class N extends h{constructor(t){super(t),this.luminances=N.EMPTY,this.buckets=new Int32Array(N.LUMINANCE_BUCKETS)}getBlackRow(t,e){const r=this.getLuminanceSource(),n=r.getWidth();null==e||e.getSize()<n?e=new w(n):e.clear(),this.initArrays(n);const i=r.getRow(t,this.luminances),s=this.buckets;for(let t=0;t<n;t++)s[(255&i[t])>>N.LUMINANCE_SHIFT]++;const o=N.estimateBlackPoint(s);if(n<3)for(let t=0;t<n;t++)(255&i[t])<o&&e.set(t);else{let t=255&i[0],r=255&i[1];for(let s=1;s<n-1;s++){const n=255&i[s+1];(4*r-t-n)/2<o&&e.set(s),t=r,r=n}}return e}getBlackMatrix(){const t=this.getLuminanceSource(),e=t.getWidth(),r=t.getHeight(),n=new T(e,r);this.initArrays(e);const i=this.buckets;for(let n=1;n<5;n++){const s=Math.floor(r*n/5),o=t.getRow(s,this.luminances),a=Math.floor(4*e/5);for(let t=Math.floor(e/5);t<a;t++){i[(255&o[t])>>N.LUMINANCE_SHIFT]++}}const s=N.estimateBlackPoint(i),o=t.getMatrix();for(let t=0;t<r;t++){const r=t*e;for(let i=0;i<e;i++){(255&o[r+i])<s&&n.set(i,t)}}return n}createBinarizer(t){return new N(t)}initArrays(t){this.luminances.length<t&&(this.luminances=new Uint8ClampedArray(t));const e=this.buckets;for(let t=0;t<N.LUMINANCE_BUCKETS;t++)e[t]=0}static estimateBlackPoint(t){const e=t.length;let r=0,n=0,i=0;for(let s=0;s<e;s++)t[s]>i&&(n=s,i=t[s]),t[s]>r&&(r=t[s]);let s=0,o=0;for(let r=0;r<e;r++){const e=r-n,i=t[r]*e*e;i>o&&(s=r,o=i)}if(n>s){const t=n;n=s,s=t}if(s-n<=e/16)throw new R;let a=s-1,l=-1;for(let e=s-1;e>n;e--){const i=e-n,o=i*i*(s-e)*(r-t[e]);o>l&&(a=e,l=o)}return a<<N.LUMINANCE_SHIFT}}N.LUMINANCE_BITS=5,N.LUMINANCE_SHIFT=8-N.LUMINANCE_BITS,N.LUMINANCE_BUCKETS=1<<N.LUMINANCE_BITS,N.EMPTY=Uint8ClampedArray.from([0]);class y extends N{constructor(t){super(t),this.matrix=null}getBlackMatrix(){if(null!==this.matrix)return this.matrix;const t=this.getLuminanceSource(),e=t.getWidth(),r=t.getHeight();if(e>=y.MINIMUM_DIMENSION&&r>=y.MINIMUM_DIMENSION){const n=t.getMatrix();let i=e>>y.BLOCK_SIZE_POWER;0!=(e&y.BLOCK_SIZE_MASK)&&i++;let s=r>>y.BLOCK_SIZE_POWER;0!=(r&y.BLOCK_SIZE_MASK)&&s++;const o=y.calculateBlackPoints(n,i,s,e,r),a=new T(e,r);y.calculateThresholdForBlock(n,i,s,e,r,o,a),this.matrix=a}else this.matrix=super.getBlackMatrix();return this.matrix}createBinarizer(t){return new y(t)}static calculateThresholdForBlock(t,e,r,n,i,s,o){const a=i-y.BLOCK_SIZE,l=n-y.BLOCK_SIZE;for(let i=0;i<r;i++){let h=i<<y.BLOCK_SIZE_POWER;h>a&&(h=a);const c=y.cap(i,2,r-3);for(let r=0;r<e;r++){let i=r<<y.BLOCK_SIZE_POWER;i>l&&(i=l);const a=y.cap(r,2,e-3);let u=0;for(let t=-2;t<=2;t++){const e=s[c+t];u+=e[a-2]+e[a-1]+e[a]+e[a+1]+e[a+2]}const d=u/25;y.thresholdBlock(t,i,h,d,n,o)}}}static cap(t,e,r){return t<e?e:t>r?r:t}static thresholdBlock(t,e,r,n,i,s){for(let o=0,a=r*i+e;o<y.BLOCK_SIZE;o++,a+=i)for(let i=0;i<y.BLOCK_SIZE;i++)(255&t[a+i])<=n&&s.set(e+i,r+o)}static calculateBlackPoints(t,e,r,n,i){const s=i-y.BLOCK_SIZE,o=n-y.BLOCK_SIZE,a=new Array(r);for(let i=0;i<r;i++){a[i]=new Int32Array(e);let r=i<<y.BLOCK_SIZE_POWER;r>s&&(r=s);for(let s=0;s<e;s++){let e=s<<y.BLOCK_SIZE_POWER;e>o&&(e=o);let l=0,h=255,c=0;for(let i=0,s=r*n+e;i<y.BLOCK_SIZE;i++,s+=n){for(let e=0;e<y.BLOCK_SIZE;e++){const r=255&t[s+e];l+=r,r<h&&(h=r),r>c&&(c=r)}if(c-h>y.MIN_DYNAMIC_RANGE)for(i++,s+=n;i<y.BLOCK_SIZE;i++,s+=n)for(let e=0;e<y.BLOCK_SIZE;e++)l+=255&t[s+e]}let u=l>>2*y.BLOCK_SIZE_POWER;if(c-h<=y.MIN_DYNAMIC_RANGE&&(u=h/2,i>0&&s>0)){const t=(a[i-1][s]+2*a[i][s-1]+a[i-1][s-1])/4;h<t&&(u=t)}a[i][s]=u}}return a}}y.BLOCK_SIZE_POWER=3,y.BLOCK_SIZE=1<<y.BLOCK_SIZE_POWER,y.BLOCK_SIZE_MASK=y.BLOCK_SIZE-1,y.MINIMUM_DIMENSION=5*y.BLOCK_SIZE,y.MIN_DYNAMIC_RANGE=24;class D{constructor(t,e){this.width=t,this.height=e}getWidth(){return this.width}getHeight(){return this.height}isCropSupported(){return!1}crop(t,e,r,n){throw new _("This luminance source does not support cropping.")}isRotateSupported(){return!1}rotateCounterClockwise(){throw new _("This luminance source does not support rotation by 90 degrees.")}rotateCounterClockwise45(){throw new _("This luminance source does not support rotation by 45 degrees.")}toString(){const t=new Uint8ClampedArray(this.width);let e=new p;for(let r=0;r<this.height;r++){const n=this.getRow(r,t);for(let t=0;t<this.width;t++){const r=255&n[t];let i;i=r<64?"#":r<128?"+":r<192?".":" ",e.append(i)}e.append("\n")}return e.toString()}}class O extends D{constructor(t){super(t.getWidth(),t.getHeight()),this.delegate=t}getRow(t,e){const r=this.delegate.getRow(t,e),n=this.getWidth();for(let t=0;t<n;t++)r[t]=255-(255&r[t]);return r}getMatrix(){const t=this.delegate.getMatrix(),e=this.getWidth()*this.getHeight(),r=new Uint8ClampedArray(e);for(let n=0;n<e;n++)r[n]=255-(255&t[n]);return r}isCropSupported(){return this.delegate.isCropSupported()}crop(t,e,r,n){return new O(this.delegate.crop(t,e,r,n))}isRotateSupported(){return this.delegate.isRotateSupported()}invert(){return this.delegate}rotateCounterClockwise(){return new O(this.delegate.rotateCounterClockwise())}rotateCounterClockwise45(){return new O(this.delegate.rotateCounterClockwise45())}}class M extends D{constructor(t){super(t.width,t.height),this.canvas=t,this.tempCanvasElement=null,this.buffer=M.makeBufferFromCanvasImageData(t)}static makeBufferFromCanvasImageData(t){const e=t.getContext("2d").getImageData(0,0,t.width,t.height);return M.toGrayscaleBuffer(e.data,t.width,t.height)}static toGrayscaleBuffer(t,e,r){const n=new Uint8ClampedArray(e*r);for(let e=0,r=0,i=t.length;e<i;e+=4,r++){let i;if(0===t[e+3])i=255;else{i=306*t[e]+601*t[e+1]+117*t[e+2]+512>>10}n[r]=i}return n}getRow(t,e){if(t<0||t>=this.getHeight())throw new o("Requested row is outside the image: "+t);const r=this.getWidth(),n=t*r;return null===e?e=this.buffer.slice(n,n+r):(e.length<r&&(e=new Uint8ClampedArray(r)),e.set(this.buffer.slice(n,n+r))),e}getMatrix(){return this.buffer}isCropSupported(){return!0}crop(t,e,r,n){return super.crop(t,e,r,n),this}isRotateSupported(){return!0}rotateCounterClockwise(){return this.rotate(-90),this}rotateCounterClockwise45(){return this.rotate(-45),this}getTempCanvasElement(){if(null===this.tempCanvasElement){const t=this.canvas.ownerDocument.createElement("canvas");t.width=this.canvas.width,t.height=this.canvas.height,this.tempCanvasElement=t}return this.tempCanvasElement}rotate(t){const e=this.getTempCanvasElement(),r=e.getContext("2d"),n=t*M.DEGREE_TO_RADIANS,i=this.canvas.width,s=this.canvas.height,o=Math.ceil(Math.abs(Math.cos(n))*i+Math.abs(Math.sin(n))*s),a=Math.ceil(Math.abs(Math.sin(n))*i+Math.abs(Math.cos(n))*s);return e.width=o,e.height=a,r.translate(o/2,a/2),r.rotate(n),r.drawImage(this.canvas,i/-2,s/-2),this.buffer=M.makeBufferFromCanvasImageData(e),this}invert(){return new O(this)}}M.DEGREE_TO_RADIANS=Math.PI/180;class B{constructor(t,e,r){this.deviceId=t,this.label=e,this.kind="videoinput",this.groupId=r||void 0}toJSON(){return{kind:this.kind,groupId:this.groupId,deviceId:this.deviceId,label:this.label}}}var b,P=(globalThis||global||self||window?(globalThis||global||self||window||void 0).__awaiter:void 0)||function(t,e,r,n){return new(r||(r=Promise))((function(i,s){function o(t){try{l(n.next(t))}catch(t){s(t)}}function a(t){try{l(n.throw(t))}catch(t){s(t)}}function l(t){var e;t.done?i(t.value):(e=t.value,e instanceof r?e:new r((function(t){t(e)}))).then(o,a)}l((n=n.apply(t,e||[])).next())}))};class L{constructor(t,e=500,r){this.reader=t,this.timeBetweenScansMillis=e,this._hints=r,this._stopContinuousDecode=!1,this._stopAsyncDecode=!1,this._timeBetweenDecodingAttempts=0}get hasNavigator(){return"undefined"!=typeof navigator}get isMediaDevicesSuported(){return this.hasNavigator&&!!navigator.mediaDevices}get canEnumerateDevices(){return!(!this.isMediaDevicesSuported||!navigator.mediaDevices.enumerateDevices)}get timeBetweenDecodingAttempts(){return this._timeBetweenDecodingAttempts}set timeBetweenDecodingAttempts(t){this._timeBetweenDecodingAttempts=t<0?0:t}set hints(t){this._hints=t||null}get hints(){return this._hints}listVideoInputDevices(){return P(this,void 0,void 0,(function*(){if(!this.hasNavigator)throw new Error("Can't enumerate devices, navigator is not present.");if(!this.canEnumerateDevices)throw new Error("Can't enumerate devices, method not supported.");const t=yield navigator.mediaDevices.enumerateDevices(),e=[];for(const r of t){const t="video"===r.kind?"videoinput":r.kind;if("videoinput"!==t)continue;const n={deviceId:r.deviceId||r.id,label:r.label||`Video device ${e.length+1}`,kind:t,groupId:r.groupId};e.push(n)}return e}))}getVideoInputDevices(){return P(this,void 0,void 0,(function*(){return(yield this.listVideoInputDevices()).map((t=>new B(t.deviceId,t.label)))}))}findDeviceById(t){return P(this,void 0,void 0,(function*(){const e=yield this.listVideoInputDevices();return e?e.find((e=>e.deviceId===t)):null}))}decodeFromInputVideoDevice(t,e){return P(this,void 0,void 0,(function*(){return yield this.decodeOnceFromVideoDevice(t,e)}))}decodeOnceFromVideoDevice(t,e){return P(this,void 0,void 0,(function*(){let r;this.reset(),r=t?{deviceId:{exact:t}}:{facingMode:"environment"};const n={video:r};return yield this.decodeOnceFromConstraints(n,e)}))}decodeOnceFromConstraints(t,e){return P(this,void 0,void 0,(function*(){const r=yield navigator.mediaDevices.getUserMedia(t);return yield this.decodeOnceFromStream(r,e)}))}decodeOnceFromStream(t,e){return P(this,void 0,void 0,(function*(){this.reset();const r=yield this.attachStreamToVideo(t,e);return yield this.decodeOnce(r)}))}decodeFromInputVideoDeviceContinuously(t,e,r){return P(this,void 0,void 0,(function*(){return yield this.decodeFromVideoDevice(t,e,r)}))}decodeFromVideoDevice(t,e,r){return P(this,void 0,void 0,(function*(){let n;n=t?{deviceId:{exact:t}}:{facingMode:"environment"};const i={video:n};return yield this.decodeFromConstraints(i,e,r)}))}decodeFromConstraints(t,e,r){return P(this,void 0,void 0,(function*(){const n=yield navigator.mediaDevices.getUserMedia(t);return yield this.decodeFromStream(n,e,r)}))}decodeFromStream(t,e,r){return P(this,void 0,void 0,(function*(){this.reset();const n=yield this.attachStreamToVideo(t,e);return yield this.decodeContinuously(n,r)}))}stopAsyncDecode(){this._stopAsyncDecode=!0}stopContinuousDecode(){this._stopContinuousDecode=!0}attachStreamToVideo(t,e){return P(this,void 0,void 0,(function*(){const r=this.prepareVideoElement(e);return this.addVideoSource(r,t),this.videoElement=r,this.stream=t,yield this.playVideoOnLoadAsync(r),r}))}playVideoOnLoadAsync(t){return new Promise(((e,r)=>this.playVideoOnLoad(t,(()=>e()))))}playVideoOnLoad(t,e){this.videoEndedListener=()=>this.stopStreams(),this.videoCanPlayListener=()=>this.tryPlayVideo(t),t.addEventListener("ended",this.videoEndedListener),t.addEventListener("canplay",this.videoCanPlayListener),t.addEventListener("playing",e),this.tryPlayVideo(t)}isVideoPlaying(t){return t.currentTime>0&&!t.paused&&!t.ended&&t.readyState>2}tryPlayVideo(t){return P(this,void 0,void 0,(function*(){if(this.isVideoPlaying(t))console.warn("Trying to play video that is already playing.");else try{yield t.play()}catch(t){console.warn("It was not possible to play the video.")}}))}getMediaElement(t,e){const r=document.getElementById(t);if(!r)throw new s(`element with id '${t}' not found`);if(r.nodeName.toLowerCase()!==e.toLowerCase())throw new s(`element with id '${t}' must be an ${e} element`);return r}decodeFromImage(t,e){if(!t&&!e)throw new s("either imageElement with a src set or an url must be provided");return e&&!t?this.decodeFromImageUrl(e):this.decodeFromImageElement(t)}decodeFromVideo(t,e){if(!t&&!e)throw new s("Either an element with a src set or an URL must be provided");return e&&!t?this.decodeFromVideoUrl(e):this.decodeFromVideoElement(t)}decodeFromVideoContinuously(t,e,r){if(void 0===t&&void 0===e)throw new s("Either an element with a src set or an URL must be provided");return e&&!t?this.decodeFromVideoUrlContinuously(e,r):this.decodeFromVideoElementContinuously(t,r)}decodeFromImageElement(t){if(!t)throw new s("An image element must be provided.");this.reset();const e=this.prepareImageElement(t);let r;return this.imageElement=e,r=this.isImageLoaded(e)?this.decodeOnce(e,!1,!0):this._decodeOnLoadImage(e),r}decodeFromVideoElement(t){const e=this._decodeFromVideoElementSetup(t);return this._decodeOnLoadVideo(e)}decodeFromVideoElementContinuously(t,e){const r=this._decodeFromVideoElementSetup(t);return this._decodeOnLoadVideoContinuously(r,e)}_decodeFromVideoElementSetup(t){if(!t)throw new s("A video element must be provided.");this.reset();const e=this.prepareVideoElement(t);return this.videoElement=e,e}decodeFromImageUrl(t){if(!t)throw new s("An URL must be provided.");this.reset();const e=this.prepareImageElement();this.imageElement=e;const r=this._decodeOnLoadImage(e);return e.src=t,r}decodeFromVideoUrl(t){if(!t)throw new s("An URL must be provided.");this.reset();const e=this.prepareVideoElement(),r=this.decodeFromVideoElement(e);return e.src=t,r}decodeFromVideoUrlContinuously(t,e){if(!t)throw new s("An URL must be provided.");this.reset();const r=this.prepareVideoElement(),n=this.decodeFromVideoElementContinuously(r,e);return r.src=t,n}_decodeOnLoadImage(t){return new Promise(((e,r)=>{this.imageLoadedListener=()=>this.decodeOnce(t,!1,!0).then(e,r),t.addEventListener("load",this.imageLoadedListener)}))}_decodeOnLoadVideo(t){return P(this,void 0,void 0,(function*(){return yield this.playVideoOnLoadAsync(t),yield this.decodeOnce(t)}))}_decodeOnLoadVideoContinuously(t,e){return P(this,void 0,void 0,(function*(){yield this.playVideoOnLoadAsync(t),this.decodeContinuously(t,e)}))}isImageLoaded(t){return!!t.complete&&0!==t.naturalWidth}prepareImageElement(t){let e;return void 0===t&&(e=document.createElement("img"),e.width=200,e.height=200),"string"==typeof t&&(e=this.getMediaElement(t,"img")),t instanceof HTMLImageElement&&(e=t),e}prepareVideoElement(t){let e;return t||"undefined"==typeof document||(e=document.createElement("video"),e.width=200,e.height=200),"string"==typeof t&&(e=this.getMediaElement(t,"video")),t instanceof HTMLVideoElement&&(e=t),e.setAttribute("autoplay","true"),e.setAttribute("muted","true"),e.setAttribute("playsinline","true"),e}decodeOnce(t,e=!0,r=!0){this._stopAsyncDecode=!1;const n=(i,s)=>{if(this._stopAsyncDecode)return s(new R("Video stream has ended before any code could be detected.")),void(this._stopAsyncDecode=void 0);try{i(this.decode(t))}catch(t){if(e&&t instanceof R||(t instanceof l||t instanceof E)&&r)return setTimeout(n,this._timeBetweenDecodingAttempts,i,s);s(t)}};return new Promise(((t,e)=>n(t,e)))}decodeContinuously(t,e){this._stopContinuousDecode=!1;const r=()=>{if(this._stopContinuousDecode)this._stopContinuousDecode=void 0;else try{const n=this.decode(t);e(n,null),setTimeout(r,this.timeBetweenScansMillis)}catch(t){e(null,t);(t instanceof l||t instanceof E||t instanceof R)&&setTimeout(r,this._timeBetweenDecodingAttempts)}};r()}decode(t){const e=this.createBinaryBitmap(t);return this.decodeBitmap(e)}_isHTMLVideoElement(t){return 0!==t.videoWidth}createBinaryBitmap(t){this.getCaptureCanvasContext(t);this._isHTMLVideoElement(t)?this.drawFrameOnCanvas(t):this.drawImageOnCanvas(t);const e=this.getCaptureCanvas(t),r=new M(e),n=new y(r);return new a(n)}getCaptureCanvasContext(t){if(!this.captureCanvasContext){const e=this.getCaptureCanvas(t).getContext("2d");this.captureCanvasContext=e}return this.captureCanvasContext}getCaptureCanvas(t){if(!this.captureCanvas){const e=this.createCaptureCanvas(t);this.captureCanvas=e}return this.captureCanvas}drawFrameOnCanvas(t,e={sx:0,sy:0,sWidth:t.videoWidth,sHeight:t.videoHeight,dx:0,dy:0,dWidth:t.videoWidth,dHeight:t.videoHeight},r=this.captureCanvasContext){r.drawImage(t,e.sx,e.sy,e.sWidth,e.sHeight,e.dx,e.dy,e.dWidth,e.dHeight)}drawImageOnCanvas(t,e={sx:0,sy:0,sWidth:t.naturalWidth,sHeight:t.naturalHeight,dx:0,dy:0,dWidth:t.naturalWidth,dHeight:t.naturalHeight},r=this.captureCanvasContext){r.drawImage(t,e.sx,e.sy,e.sWidth,e.sHeight,e.dx,e.dy,e.dWidth,e.dHeight)}decodeBitmap(t){return this.reader.decode(t,this._hints)}createCaptureCanvas(t){if("undefined"==typeof document)return this._destroyCaptureCanvas(),null;const e=document.createElement("canvas");let r,n;return void 0!==t&&(t instanceof HTMLVideoElement?(r=t.videoWidth,n=t.videoHeight):t instanceof HTMLImageElement&&(r=t.naturalWidth||t.width,n=t.naturalHeight||t.height)),e.style.width=r+"px",e.style.height=n+"px",e.width=r,e.height=n,e}stopStreams(){this.stream&&(this.stream.getVideoTracks().forEach((t=>t.stop())),this.stream=void 0),!1===this._stopAsyncDecode&&this.stopAsyncDecode(),!1===this._stopContinuousDecode&&this.stopContinuousDecode()}reset(){this.stopStreams(),this._destroyVideoElement(),this._destroyImageElement(),this._destroyCaptureCanvas()}_destroyVideoElement(){this.videoElement&&(void 0!==this.videoEndedListener&&this.videoElement.removeEventListener("ended",this.videoEndedListener),void 0!==this.videoPlayingEventListener&&this.videoElement.removeEventListener("playing",this.videoPlayingEventListener),void 0!==this.videoCanPlayListener&&this.videoElement.removeEventListener("loadedmetadata",this.videoCanPlayListener),this.cleanVideoSource(this.videoElement),this.videoElement=void 0)}_destroyImageElement(){this.imageElement&&(void 0!==this.imageLoadedListener&&this.imageElement.removeEventListener("load",this.imageLoadedListener),this.imageElement.src=void 0,this.imageElement.removeAttribute("src"),this.imageElement=void 0)}_destroyCaptureCanvas(){this.captureCanvasContext=void 0,this.captureCanvas=void 0}addVideoSource(t,e){try{t.srcObject=e}catch(r){t.src=URL.createObjectURL(e)}}cleanVideoSource(t){try{t.srcObject=null}catch(e){t.src=""}this.videoElement.removeAttribute("src")}}class F{constructor(t,e,r=(null==e?0:8*e.length),n,i,s=c.currentTimeMillis()){this.text=t,this.rawBytes=e,this.numBits=r,this.resultPoints=n,this.format=i,this.timestamp=s,this.text=t,this.rawBytes=e,this.numBits=null==r?null==e?0:8*e.length:r,this.resultPoints=n,this.format=i,this.resultMetadata=null,this.timestamp=null==s?c.currentTimeMillis():s}getText(){return this.text}getRawBytes(){return this.rawBytes}getNumBits(){return this.numBits}getResultPoints(){return this.resultPoints}getBarcodeFormat(){return this.format}getResultMetadata(){return this.resultMetadata}putMetadata(t,e){null===this.resultMetadata&&(this.resultMetadata=new Map),this.resultMetadata.set(t,e)}putAllMetadata(t){null!==t&&(null===this.resultMetadata?this.resultMetadata=t:this.resultMetadata=new Map(t))}addResultPoints(t){const e=this.resultPoints;if(null===e)this.resultPoints=t;else if(null!==t&&t.length>0){const r=new Array(e.length+t.length);c.arraycopy(e,0,r,0,e.length),c.arraycopy(t,0,r,e.length,t.length),this.resultPoints=r}}getTimestamp(){return this.timestamp}toString(){return this.text}}!function(t){t[t.AZTEC=0]="AZTEC",t[t.CODABAR=1]="CODABAR",t[t.CODE_39=2]="CODE_39",t[t.CODE_93=3]="CODE_93",t[t.CODE_128=4]="CODE_128",t[t.DATA_MATRIX=5]="DATA_MATRIX",t[t.EAN_8=6]="EAN_8",t[t.EAN_13=7]="EAN_13",t[t.ITF=8]="ITF",t[t.MAXICODE=9]="MAXICODE",t[t.PDF_417=10]="PDF_417",t[t.QR_CODE=11]="QR_CODE",t[t.RSS_14=12]="RSS_14",t[t.RSS_EXPANDED=13]="RSS_EXPANDED",t[t.UPC_A=14]="UPC_A",t[t.UPC_E=15]="UPC_E",t[t.UPC_EAN_EXTENSION=16]="UPC_EAN_EXTENSION"}(b||(b={}));var v,k=b;!function(t){t[t.OTHER=0]="OTHER",t[t.ORIENTATION=1]="ORIENTATION",t[t.BYTE_SEGMENTS=2]="BYTE_SEGMENTS",t[t.ERROR_CORRECTION_LEVEL=3]="ERROR_CORRECTION_LEVEL",t[t.ISSUE_NUMBER=4]="ISSUE_NUMBER",t[t.SUGGESTED_PRICE=5]="SUGGESTED_PRICE",t[t.POSSIBLE_COUNTRY=6]="POSSIBLE_COUNTRY",t[t.UPC_EAN_EXTENSION=7]="UPC_EAN_EXTENSION",t[t.PDF417_EXTRA_METADATA=8]="PDF417_EXTRA_METADATA",t[t.STRUCTURED_APPEND_SEQUENCE=9]="STRUCTURED_APPEND_SEQUENCE",t[t.STRUCTURED_APPEND_PARITY=10]="STRUCTURED_APPEND_PARITY"}(v||(v={}));var x,V,U,H,G,X,W=v;class z{constructor(t,e,r,n,i=-1,s=-1){this.rawBytes=t,this.text=e,this.byteSegments=r,this.ecLevel=n,this.structuredAppendSequenceNumber=i,this.structuredAppendParity=s,this.numBits=null==t?0:8*t.length}getRawBytes(){return this.rawBytes}getNumBits(){return this.numBits}setNumBits(t){this.numBits=t}getText(){return this.text}getByteSegments(){return this.byteSegments}getECLevel(){return this.ecLevel}getErrorsCorrected(){return this.errorsCorrected}setErrorsCorrected(t){this.errorsCorrected=t}getErasures(){return this.erasures}setErasures(t){this.erasures=t}getOther(){return this.other}setOther(t){this.other=t}hasStructuredAppend(){return this.structuredAppendParity>=0&&this.structuredAppendSequenceNumber>=0}getStructuredAppendParity(){return this.structuredAppendParity}getStructuredAppendSequenceNumber(){return this.structuredAppendSequenceNumber}}class Y{exp(t){return this.expTable[t]}log(t){if(0===t)throw new o;return this.logTable[t]}static addOrSubtract(t,e){return t^e}}class Z{constructor(t,e){if(0===e.length)throw new o;this.field=t;const r=e.length;if(r>1&&0===e[0]){let t=1;for(;t<r&&0===e[t];)t++;t===r?this.coefficients=Int32Array.from([0]):(this.coefficients=new Int32Array(r-t),c.arraycopy(e,t,this.coefficients,0,this.coefficients.length))}else this.coefficients=e}getCoefficients(){return this.coefficients}getDegree(){return this.coefficients.length-1}isZero(){return 0===this.coefficients[0]}getCoefficient(t){return this.coefficients[this.coefficients.length-1-t]}evaluateAt(t){if(0===t)return this.getCoefficient(0);const e=this.coefficients;let r;if(1===t){r=0;for(let t=0,n=e.length;t!==n;t++){const n=e[t];r=Y.addOrSubtract(r,n)}return r}r=e[0];const n=e.length,i=this.field;for(let s=1;s<n;s++)r=Y.addOrSubtract(i.multiply(t,r),e[s]);return r}addOrSubtract(t){if(!this.field.equals(t.field))throw new o("GenericGFPolys do not have same GenericGF field");if(this.isZero())return t;if(t.isZero())return this;let e=this.coefficients,r=t.coefficients;if(e.length>r.length){const t=e;e=r,r=t}let n=new Int32Array(r.length);const i=r.length-e.length;c.arraycopy(r,0,n,0,i);for(let t=i;t<r.length;t++)n[t]=Y.addOrSubtract(e[t-i],r[t]);return new Z(this.field,n)}multiply(t){if(!this.field.equals(t.field))throw new o("GenericGFPolys do not have same GenericGF field");if(this.isZero()||t.isZero())return this.field.getZero();const e=this.coefficients,r=e.length,n=t.coefficients,i=n.length,s=new Int32Array(r+i-1),a=this.field;for(let t=0;t<r;t++){const r=e[t];for(let e=0;e<i;e++)s[t+e]=Y.addOrSubtract(s[t+e],a.multiply(r,n[e]))}return new Z(a,s)}multiplyScalar(t){if(0===t)return this.field.getZero();if(1===t)return this;const e=this.coefficients.length,r=this.field,n=new Int32Array(e),i=this.coefficients;for(let s=0;s<e;s++)n[s]=r.multiply(i[s],t);return new Z(r,n)}multiplyByMonomial(t,e){if(t<0)throw new o;if(0===e)return this.field.getZero();const r=this.coefficients,n=r.length,i=new Int32Array(n+t),s=this.field;for(let t=0;t<n;t++)i[t]=s.multiply(r[t],e);return new Z(s,i)}divide(t){if(!this.field.equals(t.field))throw new o("GenericGFPolys do not have same GenericGF field");if(t.isZero())throw new o("Divide by 0");const e=this.field;let r=e.getZero(),n=this;const i=t.getCoefficient(t.getDegree()),s=e.inverse(i);for(;n.getDegree()>=t.getDegree()&&!n.isZero();){const i=n.getDegree()-t.getDegree(),o=e.multiply(n.getCoefficient(n.getDegree()),s),a=t.multiplyByMonomial(i,o),l=e.buildMonomial(i,o);r=r.addOrSubtract(l),n=n.addOrSubtract(a)}return[r,n]}toString(){let t="";for(let e=this.getDegree();e>=0;e--){let r=this.getCoefficient(e);if(0!==r){if(r<0?(t+=" - ",r=-r):t.length>0&&(t+=" + "),0===e||1!==r){const e=this.field.log(r);0===e?t+="1":1===e?t+="a":(t+="a^",t+=e)}0!==e&&(1===e?t+="x":(t+="x^",t+=e))}}return t}}class K extends i{}K.kind="ArithmeticException";class q extends Y{constructor(t,e,r){super(),this.primitive=t,this.size=e,this.generatorBase=r;const n=new Int32Array(e);let i=1;for(let r=0;r<e;r++)n[r]=i,i*=2,i>=e&&(i^=t,i&=e-1);this.expTable=n;const s=new Int32Array(e);for(let t=0;t<e-1;t++)s[n[t]]=t;this.logTable=s,this.zero=new Z(this,Int32Array.from([0])),this.one=new Z(this,Int32Array.from([1]))}getZero(){return this.zero}getOne(){return this.one}buildMonomial(t,e){if(t<0)throw new o;if(0===e)return this.zero;const r=new Int32Array(t+1);return r[0]=e,new Z(this,r)}inverse(t){if(0===t)throw new K;return this.expTable[this.size-this.logTable[t]-1]}multiply(t,e){return 0===t||0===e?0:this.expTable[(this.logTable[t]+this.logTable[e])%(this.size-1)]}getSize(){return this.size}getGeneratorBase(){return this.generatorBase}toString(){return"GF(0x"+f.toHexString(this.primitive)+","+this.size+")"}equals(t){return t===this}}q.AZTEC_DATA_12=new q(4201,4096,1),q.AZTEC_DATA_10=new q(1033,1024,1),q.AZTEC_DATA_6=new q(67,64,1),q.AZTEC_PARAM=new q(19,16,1),q.QR_CODE_FIELD_256=new q(285,256,0),q.DATA_MATRIX_FIELD_256=new q(301,256,1),q.AZTEC_DATA_8=q.DATA_MATRIX_FIELD_256,q.MAXICODE_FIELD_64=q.AZTEC_DATA_6;class Q extends i{}Q.kind="ReedSolomonException";class j extends i{}j.kind="IllegalStateException";class J{constructor(t){this.field=t}decode(t,e){const r=this.field,n=new Z(r,t),i=new Int32Array(e);let s=!0;for(let t=0;t<e;t++){const e=n.evaluateAt(r.exp(t+r.getGeneratorBase()));i[i.length-1-t]=e,0!==e&&(s=!1)}if(s)return;const o=new Z(r,i),a=this.runEuclideanAlgorithm(r.buildMonomial(e,1),o,e),l=a[0],h=a[1],c=this.findErrorLocations(l),u=this.findErrorMagnitudes(h,c);for(let e=0;e<c.length;e++){const n=t.length-1-r.log(c[e]);if(n<0)throw new Q("Bad error location");t[n]=q.addOrSubtract(t[n],u[e])}}runEuclideanAlgorithm(t,e,r){if(t.getDegree()<e.getDegree()){const r=t;t=e,e=r}const n=this.field;let i=t,s=e,o=n.getZero(),a=n.getOne();for(;s.getDegree()>=(r/2|0);){let t=i,e=o;if(i=s,o=a,i.isZero())throw new Q("r_{i-1} was zero");s=t;let r=n.getZero();const l=i.getCoefficient(i.getDegree()),h=n.inverse(l);for(;s.getDegree()>=i.getDegree()&&!s.isZero();){const t=s.getDegree()-i.getDegree(),e=n.multiply(s.getCoefficient(s.getDegree()),h);r=r.addOrSubtract(n.buildMonomial(t,e)),s=s.addOrSubtract(i.multiplyByMonomial(t,e))}if(a=r.multiply(o).addOrSubtract(e),s.getDegree()>=i.getDegree())throw new j("Division algorithm failed to reduce polynomial?")}const l=a.getCoefficient(0);if(0===l)throw new Q("sigmaTilde(0) was zero");const h=n.inverse(l);return[a.multiplyScalar(h),s.multiplyScalar(h)]}findErrorLocations(t){const e=t.getDegree();if(1===e)return Int32Array.from([t.getCoefficient(1)]);const r=new Int32Array(e);let n=0;const i=this.field;for(let s=1;s<i.getSize()&&n<e;s++)0===t.evaluateAt(s)&&(r[n]=i.inverse(s),n++);if(n!==e)throw new Q("Error locator degree does not match number of roots");return r}findErrorMagnitudes(t,e){const r=e.length,n=new Int32Array(r),i=this.field;for(let s=0;s<r;s++){const o=i.inverse(e[s]);let a=1;for(let t=0;t<r;t++)if(s!==t){const r=i.multiply(e[t],o),n=0==(1&r)?1|r:-2&r;a=i.multiply(a,n)}n[s]=i.multiply(t.evaluateAt(o),i.inverse(a)),0!==i.getGeneratorBase()&&(n[s]=i.multiply(n[s],o))}return n}}!function(t){t[t.UPPER=0]="UPPER",t[t.LOWER=1]="LOWER",t[t.MIXED=2]="MIXED",t[t.DIGIT=3]="DIGIT",t[t.PUNCT=4]="PUNCT",t[t.BINARY=5]="BINARY"}(x||(x={}));class ${decode(t){this.ddata=t;let e=t.getBits(),r=this.extractBits(e),n=this.correctBits(r),i=$.convertBoolArrayToByteArray(n),s=$.getEncodedData(n),o=new z(i,s,null,null);return o.setNumBits(n.length),o}static highLevelDecode(t){return this.getEncodedData(t)}static getEncodedData(t){let e=t.length,r=x.UPPER,n=x.UPPER,i="",s=0;for(;s<e;)if(n===x.BINARY){if(e-s<5)break;let o=$.readCode(t,s,5);if(s+=5,0===o){if(e-s<11)break;o=$.readCode(t,s,11)+31,s+=11}for(let r=0;r<o;r++){if(e-s<8){s=e;break}const r=$.readCode(t,s,8);i+=S.castAsNonUtf8Char(r),s+=8}n=r}else{let o=n===x.DIGIT?4:5;if(e-s<o)break;let a=$.readCode(t,s,o);s+=o;let l=$.getCharacter(n,a);l.startsWith("CTRL_")?(r=n,n=$.getTable(l.charAt(5)),"L"===l.charAt(6)&&(r=n)):(i+=l,n=r)}return i}static getTable(t){switch(t){case"L":return x.LOWER;case"P":return x.PUNCT;case"M":return x.MIXED;case"D":return x.DIGIT;case"B":return x.BINARY;default:return x.UPPER}}static getCharacter(t,e){switch(t){case x.UPPER:return $.UPPER_TABLE[e];case x.LOWER:return $.LOWER_TABLE[e];case x.MIXED:return $.MIXED_TABLE[e];case x.PUNCT:return $.PUNCT_TABLE[e];case x.DIGIT:return $.DIGIT_TABLE[e];default:throw new j("Bad table")}}correctBits(t){let e,r;this.ddata.getNbLayers()<=2?(r=6,e=q.AZTEC_DATA_6):this.ddata.getNbLayers()<=8?(r=8,e=q.AZTEC_DATA_8):this.ddata.getNbLayers()<=22?(r=10,e=q.AZTEC_DATA_10):(r=12,e=q.AZTEC_DATA_12);let n=this.ddata.getNbDatablocks(),i=t.length/r;if(i<n)throw new E;let s=t.length%r,o=new Int32Array(i);for(let e=0;e<i;e++,s+=r)o[e]=$.readCode(t,s,r);try{new J(e).decode(o,i-n)}catch(t){throw new E(t)}let a=(1<<r)-1,l=0;for(let t=0;t<n;t++){let e=o[t];if(0===e||e===a)throw new E;1!==e&&e!==a-1||l++}let h=new Array(n*r-l),c=0;for(let t=0;t<n;t++){let e=o[t];if(1===e||e===a-1)h.fill(e>1,c,c+r-1),c+=r-1;else for(let t=r-1;t>=0;--t)h[c++]=0!=(e&1<<t)}return h}extractBits(t){let e=this.ddata.isCompact(),r=this.ddata.getNbLayers(),n=(e?11:14)+4*r,i=new Int32Array(n),s=new Array(this.totalBitsInLayer(r,e));if(e)for(let t=0;t<i.length;t++)i[t]=t;else{let t=n+1+2*f.truncDivision(f.truncDivision(n,2)-1,15),e=n/2,r=f.truncDivision(t,2);for(let t=0;t<e;t++){let n=t+f.truncDivision(t,15);i[e-t-1]=r-n-1,i[e+t]=r+n+1}}for(let o=0,a=0;o<r;o++){let l=4*(r-o)+(e?9:12),h=2*o,c=n-1-h;for(let e=0;e<l;e++){let r=2*e;for(let n=0;n<2;n++)s[a+r+n]=t.get(i[h+n],i[h+e]),s[a+2*l+r+n]=t.get(i[h+e],i[c-n]),s[a+4*l+r+n]=t.get(i[c-n],i[c-e]),s[a+6*l+r+n]=t.get(i[c-e],i[h+n])}a+=8*l}return s}static readCode(t,e,r){let n=0;for(let i=e;i<e+r;i++)n<<=1,t[i]&&(n|=1);return n}static readByte(t,e){let r=t.length-e;return r>=8?$.readCode(t,e,8):$.readCode(t,e,r)<<8-r}static convertBoolArrayToByteArray(t){let e=new Uint8Array((t.length+7)/8);for(let r=0;r<e.length;r++)e[r]=$.readByte(t,8*r);return e}totalBitsInLayer(t,e){return((e?88:112)+16*t)*t}}$.UPPER_TABLE=["CTRL_PS"," ","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","CTRL_LL","CTRL_ML","CTRL_DL","CTRL_BS"],$.LOWER_TABLE=["CTRL_PS"," ","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","CTRL_US","CTRL_ML","CTRL_DL","CTRL_BS"],$.MIXED_TABLE=["CTRL_PS"," ","\\1","\\2","\\3","\\4","\\5","\\6","\\7","\b","\t","\n","\\13","\f","\r","\\33","\\34","\\35","\\36","\\37","@","\\","^","_","`","|","~","\\177","CTRL_LL","CTRL_UL","CTRL_PL","CTRL_BS"],$.PUNCT_TABLE=["","\r","\r\n",". ",", ",": ","!",'"',"#","$","%","&","'","(",")","*","+",",","-",".","/",":",";","<","=",">","?","[","]","{","}","CTRL_UL"],$.DIGIT_TABLE=["CTRL_PS"," ","0","1","2","3","4","5","6","7","8","9",",",".","CTRL_UL","CTRL_US"];class tt{constructor(){}static round(t){return NaN===t?0:t<=Number.MIN_SAFE_INTEGER?Number.MIN_SAFE_INTEGER:t>=Number.MAX_SAFE_INTEGER?Number.MAX_SAFE_INTEGER:t+(t<0?-.5:.5)|0}static distance(t,e,r,n){const i=t-r,s=e-n;return Math.sqrt(i*i+s*s)}static sum(t){let e=0;for(let r=0,n=t.length;r!==n;r++){e+=t[r]}return e}}class et{static floatToIntBits(t){return t}}et.MAX_VALUE=Number.MAX_SAFE_INTEGER;class rt{constructor(t,e){this.x=t,this.y=e}getX(){return this.x}getY(){return this.y}equals(t){if(t instanceof rt){const e=t;return this.x===e.x&&this.y===e.y}return!1}hashCode(){return 31*et.floatToIntBits(this.x)+et.floatToIntBits(this.y)}toString(){return"("+this.x+","+this.y+")"}static orderBestPatterns(t){const e=this.distance(t[0],t[1]),r=this.distance(t[1],t[2]),n=this.distance(t[0],t[2]);let i,s,o;if(r>=e&&r>=n?(s=t[0],i=t[1],o=t[2]):n>=r&&n>=e?(s=t[1],i=t[0],o=t[2]):(s=t[2],i=t[0],o=t[1]),this.crossProductZ(i,s,o)<0){const t=i;i=o,o=t}t[0]=i,t[1]=s,t[2]=o}static distance(t,e){return tt.distance(t.x,t.y,e.x,e.y)}static crossProductZ(t,e,r){const n=e.x,i=e.y;return(r.x-n)*(t.y-i)-(r.y-i)*(t.x-n)}}class nt{constructor(t,e){this.bits=t,this.points=e}getBits(){return this.bits}getPoints(){return this.points}}class it extends nt{constructor(t,e,r,n,i){super(t,e),this.compact=r,this.nbDatablocks=n,this.nbLayers=i}getNbLayers(){return this.nbLayers}getNbDatablocks(){return this.nbDatablocks}isCompact(){return this.compact}}class st{constructor(t,e,r,n){this.image=t,this.height=t.getHeight(),this.width=t.getWidth(),null==e&&(e=st.INIT_SIZE),null==r&&(r=t.getWidth()/2|0),null==n&&(n=t.getHeight()/2|0);const i=e/2|0;if(this.leftInit=r-i,this.rightInit=r+i,this.upInit=n-i,this.downInit=n+i,this.upInit<0||this.leftInit<0||this.downInit>=this.height||this.rightInit>=this.width)throw new R}detect(){let t=this.leftInit,e=this.rightInit,r=this.upInit,n=this.downInit,i=!1,s=!0,o=!1,a=!1,l=!1,h=!1,c=!1;const u=this.width,d=this.height;for(;s;){s=!1;let g=!0;for(;(g||!a)&&e<u;)g=this.containsBlackPoint(r,n,e,!1),g?(e++,s=!0,a=!0):a||e++;if(e>=u){i=!0;break}let f=!0;for(;(f||!l)&&n<d;)f=this.containsBlackPoint(t,e,n,!0),f?(n++,s=!0,l=!0):l||n++;if(n>=d){i=!0;break}let w=!0;for(;(w||!h)&&t>=0;)w=this.containsBlackPoint(r,n,t,!1),w?(t--,s=!0,h=!0):h||t--;if(t<0){i=!0;break}let A=!0;for(;(A||!c)&&r>=0;)A=this.containsBlackPoint(t,e,r,!0),A?(r--,s=!0,c=!0):c||r--;if(r<0){i=!0;break}s&&(o=!0)}if(!i&&o){const i=e-t;let s=null;for(let e=1;null===s&&e<i;e++)s=this.getBlackPointOnSegment(t,n-e,t+e,n);if(null==s)throw new R;let o=null;for(let e=1;null===o&&e<i;e++)o=this.getBlackPointOnSegment(t,r+e,t+e,r);if(null==o)throw new R;let a=null;for(let t=1;null===a&&t<i;t++)a=this.getBlackPointOnSegment(e,r+t,e-t,r);if(null==a)throw new R;let l=null;for(let t=1;null===l&&t<i;t++)l=this.getBlackPointOnSegment(e,n-t,e-t,n);if(null==l)throw new R;return this.centerEdges(l,s,a,o)}throw new R}getBlackPointOnSegment(t,e,r,n){const i=tt.round(tt.distance(t,e,r,n)),s=(r-t)/i,o=(n-e)/i,a=this.image;for(let r=0;r<i;r++){const n=tt.round(t+r*s),i=tt.round(e+r*o);if(a.get(n,i))return new rt(n,i)}return null}centerEdges(t,e,r,n){const i=t.getX(),s=t.getY(),o=e.getX(),a=e.getY(),l=r.getX(),h=r.getY(),c=n.getX(),u=n.getY(),d=st.CORR;return i<this.width/2?[new rt(c-d,u+d),new rt(o+d,a+d),new rt(l-d,h-d),new rt(i+d,s-d)]:[new rt(c+d,u+d),new rt(o+d,a-d),new rt(l-d,h+d),new rt(i-d,s-d)]}containsBlackPoint(t,e,r,n){const i=this.image;if(n){for(let n=t;n<=e;n++)if(i.get(n,r))return!0}else for(let n=t;n<=e;n++)if(i.get(r,n))return!0;return!1}}st.INIT_SIZE=10,st.CORR=1;class ot{static checkAndNudgePoints(t,e){const r=t.getWidth(),n=t.getHeight();let i=!0;for(let t=0;t<e.length&&i;t+=2){const s=Math.floor(e[t]),o=Math.floor(e[t+1]);if(s<-1||s>r||o<-1||o>n)throw new R;i=!1,-1===s?(e[t]=0,i=!0):s===r&&(e[t]=r-1,i=!0),-1===o?(e[t+1]=0,i=!0):o===n&&(e[t+1]=n-1,i=!0)}i=!0;for(let t=e.length-2;t>=0&&i;t-=2){const s=Math.floor(e[t]),o=Math.floor(e[t+1]);if(s<-1||s>r||o<-1||o>n)throw new R;i=!1,-1===s?(e[t]=0,i=!0):s===r&&(e[t]=r-1,i=!0),-1===o?(e[t+1]=0,i=!0):o===n&&(e[t+1]=n-1,i=!0)}}}class at{constructor(t,e,r,n,i,s,o,a,l){this.a11=t,this.a21=e,this.a31=r,this.a12=n,this.a22=i,this.a32=s,this.a13=o,this.a23=a,this.a33=l}static quadrilateralToQuadrilateral(t,e,r,n,i,s,o,a,l,h,c,u,d,g,f,w){const A=at.quadrilateralToSquare(t,e,r,n,i,s,o,a);return at.squareToQuadrilateral(l,h,c,u,d,g,f,w).times(A)}transformPoints(t){const e=t.length,r=this.a11,n=this.a12,i=this.a13,s=this.a21,o=this.a22,a=this.a23,l=this.a31,h=this.a32,c=this.a33;for(let u=0;u<e;u+=2){const e=t[u],d=t[u+1],g=i*e+a*d+c;t[u]=(r*e+s*d+l)/g,t[u+1]=(n*e+o*d+h)/g}}transformPointsWithValues(t,e){const r=this.a11,n=this.a12,i=this.a13,s=this.a21,o=this.a22,a=this.a23,l=this.a31,h=this.a32,c=this.a33,u=t.length;for(let d=0;d<u;d++){const u=t[d],g=e[d],f=i*u+a*g+c;t[d]=(r*u+s*g+l)/f,e[d]=(n*u+o*g+h)/f}}static squareToQuadrilateral(t,e,r,n,i,s,o,a){const l=t-r+i-o,h=e-n+s-a;if(0===l&&0===h)return new at(r-t,i-r,t,n-e,s-n,e,0,0,1);{const c=r-i,u=o-i,d=n-s,g=a-s,f=c*g-u*d,w=(l*g-u*h)/f,A=(c*h-l*d)/f;return new at(r-t+w*r,o-t+A*o,t,n-e+w*n,a-e+A*a,e,w,A,1)}}static quadrilateralToSquare(t,e,r,n,i,s,o,a){return at.squareToQuadrilateral(t,e,r,n,i,s,o,a).buildAdjoint()}buildAdjoint(){return new at(this.a22*this.a33-this.a23*this.a32,this.a23*this.a31-this.a21*this.a33,this.a21*this.a32-this.a22*this.a31,this.a13*this.a32-this.a12*this.a33,this.a11*this.a33-this.a13*this.a31,this.a12*this.a31-this.a11*this.a32,this.a12*this.a23-this.a13*this.a22,this.a13*this.a21-this.a11*this.a23,this.a11*this.a22-this.a12*this.a21)}times(t){return new at(this.a11*t.a11+this.a21*t.a12+this.a31*t.a13,this.a11*t.a21+this.a21*t.a22+this.a31*t.a23,this.a11*t.a31+this.a21*t.a32+this.a31*t.a33,this.a12*t.a11+this.a22*t.a12+this.a32*t.a13,this.a12*t.a21+this.a22*t.a22+this.a32*t.a23,this.a12*t.a31+this.a22*t.a32+this.a32*t.a33,this.a13*t.a11+this.a23*t.a12+this.a33*t.a13,this.a13*t.a21+this.a23*t.a22+this.a33*t.a23,this.a13*t.a31+this.a23*t.a32+this.a33*t.a33)}}class lt extends ot{sampleGrid(t,e,r,n,i,s,o,a,l,h,c,u,d,g,f,w,A,C,E){const m=at.quadrilateralToQuadrilateral(n,i,s,o,a,l,h,c,u,d,g,f,w,A,C,E);return this.sampleGridWithTransform(t,e,r,m)}sampleGridWithTransform(t,e,r,n){if(e<=0||r<=0)throw new R;const i=new T(e,r),s=new Float32Array(2*e);for(let e=0;e<r;e++){const r=s.length,o=e+.5;for(let t=0;t<r;t+=2)s[t]=t/2+.5,s[t+1]=o;n.transformPoints(s),ot.checkAndNudgePoints(t,s);try{for(let n=0;n<r;n+=2)t.get(Math.floor(s[n]),Math.floor(s[n+1]))&&i.set(n/2,e)}catch(t){throw new R}}return i}}class ht{static setGridSampler(t){ht.gridSampler=t}static getInstance(){return ht.gridSampler}}ht.gridSampler=new lt;class ct{constructor(t,e){this.x=t,this.y=e}toResultPoint(){return new rt(this.getX(),this.getY())}getX(){return this.x}getY(){return this.y}}class ut{constructor(t){this.EXPECTED_CORNER_BITS=new Int32Array([3808,476,2107,1799]),this.image=t}detect(){return this.detectMirror(!1)}detectMirror(t){let e=this.getMatrixCenter(),r=this.getBullsEyeCorners(e);if(t){let t=r[0];r[0]=r[2],r[2]=t}this.extractParameters(r);let n=this.sampleGrid(this.image,r[this.shift%4],r[(this.shift+1)%4],r[(this.shift+2)%4],r[(this.shift+3)%4]),i=this.getMatrixCornerPoints(r);return new it(n,i,this.compact,this.nbDataBlocks,this.nbLayers)}extractParameters(t){if(!(this.isValidPoint(t[0])&&this.isValidPoint(t[1])&&this.isValidPoint(t[2])&&this.isValidPoint(t[3])))throw new R;let e=2*this.nbCenterLayers,r=new Int32Array([this.sampleLine(t[0],t[1],e),this.sampleLine(t[1],t[2],e),this.sampleLine(t[2],t[3],e),this.sampleLine(t[3],t[0],e)]);this.shift=this.getRotation(r,e);let n=0;for(let t=0;t<4;t++){let e=r[(this.shift+t)%4];this.compact?(n<<=7,n+=e>>1&127):(n<<=10,n+=(e>>2&992)+(e>>1&31))}let i=this.getCorrectedParameterData(n,this.compact);this.compact?(this.nbLayers=1+(i>>6),this.nbDataBlocks=1+(63&i)):(this.nbLayers=1+(i>>11),this.nbDataBlocks=1+(2047&i))}getRotation(t,e){let r=0;t.forEach(((t,n,i)=>{r=(r<<3)+((t>>e-2<<1)+(1&t))})),r=((1&r)<<11)+(r>>1);for(let t=0;t<4;t++)if(f.bitCount(r^this.EXPECTED_CORNER_BITS[t])<=2)return t;throw new R}getCorrectedParameterData(t,e){let r,n;e?(r=7,n=2):(r=10,n=4);let i=r-n,s=new Int32Array(r);for(let e=r-1;e>=0;--e)s[e]=15&t,t>>=4;try{new J(q.AZTEC_PARAM).decode(s,i)}catch(t){throw new R}let o=0;for(let t=0;t<n;t++)o=(o<<4)+s[t];return o}getBullsEyeCorners(t){let e=t,r=t,n=t,i=t,s=!0;for(this.nbCenterLayers=1;this.nbCenterLayers<9;this.nbCenterLayers++){let t=this.getFirstDifferent(e,s,1,-1),o=this.getFirstDifferent(r,s,1,1),a=this.getFirstDifferent(n,s,-1,1),l=this.getFirstDifferent(i,s,-1,-1);if(this.nbCenterLayers>2){let r=this.distancePoint(l,t)*this.nbCenterLayers/(this.distancePoint(i,e)*(this.nbCenterLayers+2));if(r<.75||r>1.25||!this.isWhiteOrBlackRectangle(t,o,a,l))break}e=t,r=o,n=a,i=l,s=!s}if(5!==this.nbCenterLayers&&7!==this.nbCenterLayers)throw new R;this.compact=5===this.nbCenterLayers;let o=new rt(e.getX()+.5,e.getY()-.5),a=new rt(r.getX()+.5,r.getY()+.5),l=new rt(n.getX()-.5,n.getY()+.5),h=new rt(i.getX()-.5,i.getY()-.5);return this.expandSquare([o,a,l,h],2*this.nbCenterLayers-3,2*this.nbCenterLayers)}getMatrixCenter(){let t,e,r,n;try{let i=new st(this.image).detect();t=i[0],e=i[1],r=i[2],n=i[3]}catch(i){let s=this.image.getWidth()/2,o=this.image.getHeight()/2;t=this.getFirstDifferent(new ct(s+7,o-7),!1,1,-1).toResultPoint(),e=this.getFirstDifferent(new ct(s+7,o+7),!1,1,1).toResultPoint(),r=this.getFirstDifferent(new ct(s-7,o+7),!1,-1,1).toResultPoint(),n=this.getFirstDifferent(new ct(s-7,o-7),!1,-1,-1).toResultPoint()}let i=tt.round((t.getX()+n.getX()+e.getX()+r.getX())/4),s=tt.round((t.getY()+n.getY()+e.getY()+r.getY())/4);try{let o=new st(this.image,15,i,s).detect();t=o[0],e=o[1],r=o[2],n=o[3]}catch(o){t=this.getFirstDifferent(new ct(i+7,s-7),!1,1,-1).toResultPoint(),e=this.getFirstDifferent(new ct(i+7,s+7),!1,1,1).toResultPoint(),r=this.getFirstDifferent(new ct(i-7,s+7),!1,-1,1).toResultPoint(),n=this.getFirstDifferent(new ct(i-7,s-7),!1,-1,-1).toResultPoint()}return i=tt.round((t.getX()+n.getX()+e.getX()+r.getX())/4),s=tt.round((t.getY()+n.getY()+e.getY()+r.getY())/4),new ct(i,s)}getMatrixCornerPoints(t){return this.expandSquare(t,2*this.nbCenterLayers,this.getDimension())}sampleGrid(t,e,r,n,i){let s=ht.getInstance(),o=this.getDimension(),a=o/2-this.nbCenterLayers,l=o/2+this.nbCenterLayers;return s.sampleGrid(t,o,o,a,a,l,a,l,l,a,l,e.getX(),e.getY(),r.getX(),r.getY(),n.getX(),n.getY(),i.getX(),i.getY())}sampleLine(t,e,r){let n=0,i=this.distanceResultPoint(t,e),s=i/r,o=t.getX(),a=t.getY(),l=s*(e.getX()-t.getX())/i,h=s*(e.getY()-t.getY())/i;for(let t=0;t<r;t++)this.image.get(tt.round(o+t*l),tt.round(a+t*h))&&(n|=1<<r-t-1);return n}isWhiteOrBlackRectangle(t,e,r,n){t=new ct(t.getX()-3,t.getY()+3),e=new ct(e.getX()-3,e.getY()-3),r=new ct(r.getX()+3,r.getY()-3),n=new ct(n.getX()+3,n.getY()+3);let i=this.getColor(n,t);if(0===i)return!1;let s=this.getColor(t,e);return s===i&&(s=this.getColor(e,r),s===i&&(s=this.getColor(r,n),s===i))}getColor(t,e){let r=this.distancePoint(t,e),n=(e.getX()-t.getX())/r,i=(e.getY()-t.getY())/r,s=0,o=t.getX(),a=t.getY(),l=this.image.get(t.getX(),t.getY()),h=Math.ceil(r);for(let t=0;t<h;t++)o+=n,a+=i,this.image.get(tt.round(o),tt.round(a))!==l&&s++;let c=s/r;return c>.1&&c<.9?0:c<=.1===l?1:-1}getFirstDifferent(t,e,r,n){let i=t.getX()+r,s=t.getY()+n;for(;this.isValid(i,s)&&this.image.get(i,s)===e;)i+=r,s+=n;for(i-=r,s-=n;this.isValid(i,s)&&this.image.get(i,s)===e;)i+=r;for(i-=r;this.isValid(i,s)&&this.image.get(i,s)===e;)s+=n;return s-=n,new ct(i,s)}expandSquare(t,e,r){let n=r/(2*e),i=t[0].getX()-t[2].getX(),s=t[0].getY()-t[2].getY(),o=(t[0].getX()+t[2].getX())/2,a=(t[0].getY()+t[2].getY())/2,l=new rt(o+n*i,a+n*s),h=new rt(o-n*i,a-n*s);return i=t[1].getX()-t[3].getX(),s=t[1].getY()-t[3].getY(),o=(t[1].getX()+t[3].getX())/2,a=(t[1].getY()+t[3].getY())/2,[l,new rt(o+n*i,a+n*s),h,new rt(o-n*i,a-n*s)]}isValid(t,e){return t>=0&&t<this.image.getWidth()&&e>0&&e<this.image.getHeight()}isValidPoint(t){let e=tt.round(t.getX()),r=tt.round(t.getY());return this.isValid(e,r)}distancePoint(t,e){return tt.distance(t.getX(),t.getY(),e.getX(),e.getY())}distanceResultPoint(t,e){return tt.distance(t.getX(),t.getY(),e.getX(),e.getY())}getDimension(){return this.compact?4*this.nbLayers+11:this.nbLayers<=4?4*this.nbLayers+15:4*this.nbLayers+2*(f.truncDivision(this.nbLayers-4,8)+1)+15}}class dt{decode(t,e=null){let r=null,n=new ut(t.getBlackMatrix()),i=null,s=null;try{let t=n.detectMirror(!1);i=t.getPoints(),this.reportFoundResultPoints(e,i),s=(new $).decode(t)}catch(t){r=t}if(null==s)try{let t=n.detectMirror(!0);i=t.getPoints(),this.reportFoundResultPoints(e,i),s=(new $).decode(t)}catch(t){if(null!=r)throw r;throw t}let o=new F(s.getText(),s.getRawBytes(),s.getNumBits(),i,k.AZTEC,c.currentTimeMillis()),a=s.getByteSegments();null!=a&&o.putMetadata(W.BYTE_SEGMENTS,a);let l=s.getECLevel();return null!=l&&o.putMetadata(W.ERROR_CORRECTION_LEVEL,l),o}reportFoundResultPoints(t,e){if(null!=t){let r=t.get(C.NEED_RESULT_POINT_CALLBACK);null!=r&&e.forEach(((t,e,n)=>{r.foundPossibleResultPoint(t)}))}}reset(){}}class gt{decode(t,e){try{return this.doDecode(t,e)}catch(r){if(e&&!0===e.get(C.TRY_HARDER)&&t.isRotateSupported()){const r=t.rotateCounterClockwise(),n=this.doDecode(r,e),i=n.getResultMetadata();let s=270;null!==i&&!0===i.get(W.ORIENTATION)&&(s+=i.get(W.ORIENTATION)%360),n.putMetadata(W.ORIENTATION,s);const o=n.getResultPoints();if(null!==o){const t=r.getHeight();for(let e=0;e<o.length;e++)o[e]=new rt(t-o[e].getY()-1,o[e].getX())}return n}throw new R}}reset(){}doDecode(t,e){const r=t.getWidth(),n=t.getHeight();let i=new w(r);const s=e&&!0===e.get(C.TRY_HARDER),o=Math.max(1,n>>(s?8:5));let a;a=s?n:15;const l=Math.trunc(n/2);for(let s=0;s<a;s++){const a=Math.trunc((s+1)/2),h=l+o*(0==(1&s)?a:-a);if(h<0||h>=n)break;try{i=t.getBlackRow(h,i)}catch(t){continue}for(let t=0;t<2;t++){if(1===t&&(i.reverse(),e&&!0===e.get(C.NEED_RESULT_POINT_CALLBACK))){const t=new Map;e.forEach(((e,r)=>t.set(r,e))),t.delete(C.NEED_RESULT_POINT_CALLBACK),e=t}try{const n=this.decodeRow(h,i,e);if(1===t){n.putMetadata(W.ORIENTATION,180);const t=n.getResultPoints();null!==t&&(t[0]=new rt(r-t[0].getX()-1,t[0].getY()),t[1]=new rt(r-t[1].getX()-1,t[1].getY()))}return n}catch(t){}}}throw new R}static recordPattern(t,e,r){const n=r.length;for(let t=0;t<n;t++)r[t]=0;const i=t.getSize();if(e>=i)throw new R;let s=!t.get(e),o=0,a=e;for(;a<i;){if(t.get(a)!==s)r[o]++;else{if(++o===n)break;r[o]=1,s=!s}a++}if(o!==n&&(o!==n-1||a!==i))throw new R}static recordPatternInReverse(t,e,r){let n=r.length,i=t.get(e);for(;e>0&&n>=0;)t.get(--e)!==i&&(n--,i=!i);if(n>=0)throw new R;gt.recordPattern(t,e+1,r)}static patternMatchVariance(t,e,r){const n=t.length;let i=0,s=0;for(let r=0;r<n;r++)i+=t[r],s+=e[r];if(i<s)return Number.POSITIVE_INFINITY;const o=i/s;r*=o;let a=0;for(let i=0;i<n;i++){const n=t[i],s=e[i]*o,l=n>s?n-s:s-n;if(l>r)return Number.POSITIVE_INFINITY;a+=l}return a/i}}class ft extends gt{static findStartPattern(t){const e=t.getSize(),r=t.getNextSet(0);let n=0,i=Int32Array.from([0,0,0,0,0,0]),s=r,o=!1;for(let a=r;a<e;a++)if(t.get(a)!==o)i[n]++;else{if(5===n){let e=ft.MAX_AVG_VARIANCE,r=-1;for(let t=ft.CODE_START_A;t<=ft.CODE_START_C;t++){const n=gt.patternMatchVariance(i,ft.CODE_PATTERNS[t],ft.MAX_INDIVIDUAL_VARIANCE);n<e&&(e=n,r=t)}if(r>=0&&t.isRange(Math.max(0,s-(a-s)/2),s,!1))return Int32Array.from([s,a,r]);s+=i[0]+i[1],i=i.slice(2,i.length-1),i[n-1]=0,i[n]=0,n--}else n++;i[n]=1,o=!o}throw new R}static decodeCode(t,e,r){gt.recordPattern(t,r,e);let n=ft.MAX_AVG_VARIANCE,i=-1;for(let t=0;t<ft.CODE_PATTERNS.length;t++){const r=ft.CODE_PATTERNS[t],s=this.patternMatchVariance(e,r,ft.MAX_INDIVIDUAL_VARIANCE);s<n&&(n=s,i=t)}if(i>=0)return i;throw new R}decodeRow(t,e,r){const n=r&&!0===r.get(C.ASSUME_GS1),i=ft.findStartPattern(e),s=i[2];let o=0;const a=new Uint8Array(20);let h;switch(a[o++]=s,s){case ft.CODE_START_A:h=ft.CODE_CODE_A;break;case ft.CODE_START_B:h=ft.CODE_CODE_B;break;case ft.CODE_START_C:h=ft.CODE_CODE_C;break;default:throw new E}let c=!1,u=!1,d="",g=i[0],f=i[1];const w=Int32Array.from([0,0,0,0,0,0]);let A=0,m=0,_=s,I=0,S=!0,p=!1,T=!1;for(;!c;){const t=u;switch(u=!1,A=m,m=ft.decodeCode(e,w,f),a[o++]=m,m!==ft.CODE_STOP&&(S=!0),m!==ft.CODE_STOP&&(I++,_+=I*m),g=f,f+=w.reduce(((t,e)=>t+e),0),m){case ft.CODE_START_A:case ft.CODE_START_B:case ft.CODE_START_C:throw new E}switch(h){case ft.CODE_CODE_A:if(m<64)d+=T===p?String.fromCharCode(" ".charCodeAt(0)+m):String.fromCharCode(" ".charCodeAt(0)+m+128),T=!1;else if(m<96)d+=T===p?String.fromCharCode(m-64):String.fromCharCode(m+64),T=!1;else switch(m!==ft.CODE_STOP&&(S=!1),m){case ft.CODE_FNC_1:n&&(0===d.length?d+="]C1":d+=String.fromCharCode(29));break;case ft.CODE_FNC_2:case ft.CODE_FNC_3:break;case ft.CODE_FNC_4_A:!p&&T?(p=!0,T=!1):p&&T?(p=!1,T=!1):T=!0;break;case ft.CODE_SHIFT:u=!0,h=ft.CODE_CODE_B;break;case ft.CODE_CODE_B:h=ft.CODE_CODE_B;break;case ft.CODE_CODE_C:h=ft.CODE_CODE_C;break;case ft.CODE_STOP:c=!0}break;case ft.CODE_CODE_B:if(m<96)d+=T===p?String.fromCharCode(" ".charCodeAt(0)+m):String.fromCharCode(" ".charCodeAt(0)+m+128),T=!1;else switch(m!==ft.CODE_STOP&&(S=!1),m){case ft.CODE_FNC_1:n&&(0===d.length?d+="]C1":d+=String.fromCharCode(29));break;case ft.CODE_FNC_2:case ft.CODE_FNC_3:break;case ft.CODE_FNC_4_B:!p&&T?(p=!0,T=!1):p&&T?(p=!1,T=!1):T=!0;break;case ft.CODE_SHIFT:u=!0,h=ft.CODE_CODE_A;break;case ft.CODE_CODE_A:h=ft.CODE_CODE_A;break;case ft.CODE_CODE_C:h=ft.CODE_CODE_C;break;case ft.CODE_STOP:c=!0}break;case ft.CODE_CODE_C:if(m<100)m<10&&(d+="0"),d+=m;else switch(m!==ft.CODE_STOP&&(S=!1),m){case ft.CODE_FNC_1:n&&(0===d.length?d+="]C1":d+=String.fromCharCode(29));break;case ft.CODE_CODE_A:h=ft.CODE_CODE_A;break;case ft.CODE_CODE_B:h=ft.CODE_CODE_B;break;case ft.CODE_STOP:c=!0}}t&&(h=h===ft.CODE_CODE_A?ft.CODE_CODE_B:ft.CODE_CODE_A)}const N=f-g;if(f=e.getNextUnset(f),!e.isRange(f,Math.min(e.getSize(),f+(f-g)/2),!1))throw new R;if(_-=I*A,_%103!==A)throw new l;const y=d.length;if(0===y)throw new R;y>0&&S&&(d=h===ft.CODE_CODE_C?d.substring(0,y-2):d.substring(0,y-1));const D=(i[1]+i[0])/2,O=g+N/2,M=a.length,B=new Uint8Array(M);for(let t=0;t<M;t++)B[t]=a[t];const b=[new rt(D,t),new rt(O,t)];return new F(d,B,0,b,k.CODE_128,(new Date).getTime())}}ft.CODE_PATTERNS=[Int32Array.from([2,1,2,2,2,2]),Int32Array.from([2,2,2,1,2,2]),Int32Array.from([2,2,2,2,2,1]),Int32Array.from([1,2,1,2,2,3]),Int32Array.from([1,2,1,3,2,2]),Int32Array.from([1,3,1,2,2,2]),Int32Array.from([1,2,2,2,1,3]),Int32Array.from([1,2,2,3,1,2]),Int32Array.from([1,3,2,2,1,2]),Int32Array.from([2,2,1,2,1,3]),Int32Array.from([2,2,1,3,1,2]),Int32Array.from([2,3,1,2,1,2]),Int32Array.from([1,1,2,2,3,2]),Int32Array.from([1,2,2,1,3,2]),Int32Array.from([1,2,2,2,3,1]),Int32Array.from([1,1,3,2,2,2]),Int32Array.from([1,2,3,1,2,2]),Int32Array.from([1,2,3,2,2,1]),Int32Array.from([2,2,3,2,1,1]),Int32Array.from([2,2,1,1,3,2]),Int32Array.from([2,2,1,2,3,1]),Int32Array.from([2,1,3,2,1,2]),Int32Array.from([2,2,3,1,1,2]),Int32Array.from([3,1,2,1,3,1]),Int32Array.from([3,1,1,2,2,2]),Int32Array.from([3,2,1,1,2,2]),Int32Array.from([3,2,1,2,2,1]),Int32Array.from([3,1,2,2,1,2]),Int32Array.from([3,2,2,1,1,2]),Int32Array.from([3,2,2,2,1,1]),Int32Array.from([2,1,2,1,2,3]),Int32Array.from([2,1,2,3,2,1]),Int32Array.from([2,3,2,1,2,1]),Int32Array.from([1,1,1,3,2,3]),Int32Array.from([1,3,1,1,2,3]),Int32Array.from([1,3,1,3,2,1]),Int32Array.from([1,1,2,3,1,3]),Int32Array.from([1,3,2,1,1,3]),Int32Array.from([1,3,2,3,1,1]),Int32Array.from([2,1,1,3,1,3]),Int32Array.from([2,3,1,1,1,3]),Int32Array.from([2,3,1,3,1,1]),Int32Array.from([1,1,2,1,3,3]),Int32Array.from([1,1,2,3,3,1]),Int32Array.from([1,3,2,1,3,1]),Int32Array.from([1,1,3,1,2,3]),Int32Array.from([1,1,3,3,2,1]),Int32Array.from([1,3,3,1,2,1]),Int32Array.from([3,1,3,1,2,1]),Int32Array.from([2,1,1,3,3,1]),Int32Array.from([2,3,1,1,3,1]),Int32Array.from([2,1,3,1,1,3]),Int32Array.from([2,1,3,3,1,1]),Int32Array.from([2,1,3,1,3,1]),Int32Array.from([3,1,1,1,2,3]),Int32Array.from([3,1,1,3,2,1]),Int32Array.from([3,3,1,1,2,1]),Int32Array.from([3,1,2,1,1,3]),Int32Array.from([3,1,2,3,1,1]),Int32Array.from([3,3,2,1,1,1]),Int32Array.from([3,1,4,1,1,1]),Int32Array.from([2,2,1,4,1,1]),Int32Array.from([4,3,1,1,1,1]),Int32Array.from([1,1,1,2,2,4]),Int32Array.from([1,1,1,4,2,2]),Int32Array.from([1,2,1,1,2,4]),Int32Array.from([1,2,1,4,2,1]),Int32Array.from([1,4,1,1,2,2]),Int32Array.from([1,4,1,2,2,1]),Int32Array.from([1,1,2,2,1,4]),Int32Array.from([1,1,2,4,1,2]),Int32Array.from([1,2,2,1,1,4]),Int32Array.from([1,2,2,4,1,1]),Int32Array.from([1,4,2,1,1,2]),Int32Array.from([1,4,2,2,1,1]),Int32Array.from([2,4,1,2,1,1]),Int32Array.from([2,2,1,1,1,4]),Int32Array.from([4,1,3,1,1,1]),Int32Array.from([2,4,1,1,1,2]),Int32Array.from([1,3,4,1,1,1]),Int32Array.from([1,1,1,2,4,2]),Int32Array.from([1,2,1,1,4,2]),Int32Array.from([1,2,1,2,4,1]),Int32Array.from([1,1,4,2,1,2]),Int32Array.from([1,2,4,1,1,2]),Int32Array.from([1,2,4,2,1,1]),Int32Array.from([4,1,1,2,1,2]),Int32Array.from([4,2,1,1,1,2]),Int32Array.from([4,2,1,2,1,1]),Int32Array.from([2,1,2,1,4,1]),Int32Array.from([2,1,4,1,2,1]),Int32Array.from([4,1,2,1,2,1]),Int32Array.from([1,1,1,1,4,3]),Int32Array.from([1,1,1,3,4,1]),Int32Array.from([1,3,1,1,4,1]),Int32Array.from([1,1,4,1,1,3]),Int32Array.from([1,1,4,3,1,1]),Int32Array.from([4,1,1,1,1,3]),Int32Array.from([4,1,1,3,1,1]),Int32Array.from([1,1,3,1,4,1]),Int32Array.from([1,1,4,1,3,1]),Int32Array.from([3,1,1,1,4,1]),Int32Array.from([4,1,1,1,3,1]),Int32Array.from([2,1,1,4,1,2]),Int32Array.from([2,1,1,2,1,4]),Int32Array.from([2,1,1,2,3,2]),Int32Array.from([2,3,3,1,1,1,2])],ft.MAX_AVG_VARIANCE=.25,ft.MAX_INDIVIDUAL_VARIANCE=.7,ft.CODE_SHIFT=98,ft.CODE_CODE_C=99,ft.CODE_CODE_B=100,ft.CODE_CODE_A=101,ft.CODE_FNC_1=102,ft.CODE_FNC_2=97,ft.CODE_FNC_3=96,ft.CODE_FNC_4_A=101,ft.CODE_FNC_4_B=100,ft.CODE_START_A=103,ft.CODE_START_B=104,ft.CODE_START_C=105,ft.CODE_STOP=106;class wt extends gt{constructor(t=!1,e=!1){super(),this.usingCheckDigit=t,this.extendedMode=e,this.decodeRowResult="",this.counters=new Int32Array(9)}decodeRow(t,e,r){let n=this.counters;n.fill(0),this.decodeRowResult="";let i,s,o=wt.findAsteriskPattern(e,n),a=e.getNextSet(o[1]),h=e.getSize();do{wt.recordPattern(e,a,n);let t=wt.toNarrowWidePattern(n);if(t<0)throw new R;i=wt.patternToChar(t),this.decodeRowResult+=i,s=a;for(let t of n)a+=t;a=e.getNextSet(a)}while("*"!==i);this.decodeRowResult=this.decodeRowResult.substring(0,this.decodeRowResult.length-1);let c,u=0;for(let t of n)u+=t;if(a!==h&&2*(a-s-u)<u)throw new R;if(this.usingCheckDigit){let t=this.decodeRowResult.length-1,e=0;for(let r=0;r<t;r++)e+=wt.ALPHABET_STRING.indexOf(this.decodeRowResult.charAt(r));if(this.decodeRowResult.charAt(t)!==wt.ALPHABET_STRING.charAt(e%43))throw new l;this.decodeRowResult=this.decodeRowResult.substring(0,t)}if(0===this.decodeRowResult.length)throw new R;c=this.extendedMode?wt.decodeExtended(this.decodeRowResult):this.decodeRowResult;let d=(o[1]+o[0])/2,g=s+u/2;return new F(c,null,0,[new rt(d,t),new rt(g,t)],k.CODE_39,(new Date).getTime())}static findAsteriskPattern(t,e){let r=t.getSize(),n=t.getNextSet(0),i=0,s=n,o=!1,a=e.length;for(let l=n;l<r;l++)if(t.get(l)!==o)e[i]++;else{if(i===a-1){if(this.toNarrowWidePattern(e)===wt.ASTERISK_ENCODING&&t.isRange(Math.max(0,s-Math.floor((l-s)/2)),s,!1))return[s,l];s+=e[0]+e[1],e.copyWithin(0,2,2+i-1),e[i-1]=0,e[i]=0,i--}else i++;e[i]=1,o=!o}throw new R}static toNarrowWidePattern(t){let e,r=t.length,n=0;do{let i=2147483647;for(let e of t)e<i&&e>n&&(i=e);n=i,e=0;let s=0,o=0;for(let i=0;i<r;i++){let a=t[i];a>n&&(o|=1<<r-1-i,e++,s+=a)}if(3===e){for(let i=0;i<r&&e>0;i++){let r=t[i];if(r>n&&(e--,2*r>=s))return-1}return o}}while(e>3);return-1}static patternToChar(t){for(let e=0;e<wt.CHARACTER_ENCODINGS.length;e++)if(wt.CHARACTER_ENCODINGS[e]===t)return wt.ALPHABET_STRING.charAt(e);if(t===wt.ASTERISK_ENCODING)return"*";throw new R}static decodeExtended(t){let e=t.length,r="";for(let n=0;n<e;n++){let e=t.charAt(n);if("+"===e||"$"===e||"%"===e||"/"===e){let i=t.charAt(n+1),s="\0";switch(e){case"+":if(!(i>="A"&&i<="Z"))throw new E;s=String.fromCharCode(i.charCodeAt(0)+32);break;case"$":if(!(i>="A"&&i<="Z"))throw new E;s=String.fromCharCode(i.charCodeAt(0)-64);break;case"%":if(i>="A"&&i<="E")s=String.fromCharCode(i.charCodeAt(0)-38);else if(i>="F"&&i<="J")s=String.fromCharCode(i.charCodeAt(0)-11);else if(i>="K"&&i<="O")s=String.fromCharCode(i.charCodeAt(0)+16);else if(i>="P"&&i<="T")s=String.fromCharCode(i.charCodeAt(0)+43);else if("U"===i)s="\0";else if("V"===i)s="@";else if("W"===i)s="`";else{if("X"!==i&&"Y"!==i&&"Z"!==i)throw new E;s=""}break;case"/":if(i>="A"&&i<="O")s=String.fromCharCode(i.charCodeAt(0)-32);else{if("Z"!==i)throw new E;s=":"}}r+=s,n++}else r+=e}return r}}wt.ALPHABET_STRING="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%",wt.CHARACTER_ENCODINGS=[52,289,97,352,49,304,112,37,292,100,265,73,328,25,280,88,13,268,76,28,259,67,322,19,274,82,7,262,70,22,385,193,448,145,400,208,133,388,196,168,162,138,42],wt.ASTERISK_ENCODING=148;class At extends gt{constructor(){super(...arguments),this.narrowLineWidth=-1}decodeRow(t,e,r){let n=this.decodeStart(e),i=this.decodeEnd(e),s=new p;At.decodeMiddle(e,n[1],i[0],s);let o=s.toString(),a=null;null!=r&&(a=r.get(C.ALLOWED_LENGTHS)),null==a&&(a=At.DEFAULT_ALLOWED_LENGTHS);let l=o.length,h=!1,c=0;for(let t of a){if(l===t){h=!0;break}t>c&&(c=t)}if(!h&&l>c&&(h=!0),!h)throw new E;const u=[new rt(n[1],t),new rt(i[0],t)];return new F(o,null,0,u,k.ITF,(new Date).getTime())}static decodeMiddle(t,e,r,n){let i=new Int32Array(10),s=new Int32Array(5),o=new Int32Array(5);for(i.fill(0),s.fill(0),o.fill(0);e<r;){gt.recordPattern(t,e,i);for(let t=0;t<5;t++){let e=2*t;s[t]=i[e],o[t]=i[e+1]}let r=At.decodeDigit(s);n.append(r.toString()),r=this.decodeDigit(o),n.append(r.toString()),i.forEach((function(t){e+=t}))}}decodeStart(t){let e=At.skipWhiteSpace(t),r=At.findGuardPattern(t,e,At.START_PATTERN);return this.narrowLineWidth=(r[1]-r[0])/4,this.validateQuietZone(t,r[0]),r}validateQuietZone(t,e){let r=10*this.narrowLineWidth;r=r<e?r:e;for(let n=e-1;r>0&&n>=0&&!t.get(n);n--)r--;if(0!==r)throw new R}static skipWhiteSpace(t){const e=t.getSize(),r=t.getNextSet(0);if(r===e)throw new R;return r}decodeEnd(t){t.reverse();try{let e,r=At.skipWhiteSpace(t);try{e=At.findGuardPattern(t,r,At.END_PATTERN_REVERSED[0])}catch(n){n instanceof R&&(e=At.findGuardPattern(t,r,At.END_PATTERN_REVERSED[1]))}this.validateQuietZone(t,e[0]);let n=e[0];return e[0]=t.getSize()-e[1],e[1]=t.getSize()-n,e}finally{t.reverse()}}static findGuardPattern(t,e,r){let n=r.length,i=new Int32Array(n),s=t.getSize(),o=!1,a=0,l=e;i.fill(0);for(let h=e;h<s;h++)if(t.get(h)!==o)i[a]++;else{if(a===n-1){if(gt.patternMatchVariance(i,r,At.MAX_INDIVIDUAL_VARIANCE)<At.MAX_AVG_VARIANCE)return[l,h];l+=i[0]+i[1],c.arraycopy(i,2,i,0,a-1),i[a-1]=0,i[a]=0,a--}else a++;i[a]=1,o=!o}throw new R}static decodeDigit(t){let e=At.MAX_AVG_VARIANCE,r=-1,n=At.PATTERNS.length;for(let i=0;i<n;i++){let n=At.PATTERNS[i],s=gt.patternMatchVariance(t,n,At.MAX_INDIVIDUAL_VARIANCE);s<e?(e=s,r=i):s===e&&(r=-1)}if(r>=0)return r%10;throw new R}}At.PATTERNS=[Int32Array.from([1,1,2,2,1]),Int32Array.from([2,1,1,1,2]),Int32Array.from([1,2,1,1,2]),Int32Array.from([2,2,1,1,1]),Int32Array.from([1,1,2,1,2]),Int32Array.from([2,1,2,1,1]),Int32Array.from([1,2,2,1,1]),Int32Array.from([1,1,1,2,2]),Int32Array.from([2,1,1,2,1]),Int32Array.from([1,2,1,2,1]),Int32Array.from([1,1,3,3,1]),Int32Array.from([3,1,1,1,3]),Int32Array.from([1,3,1,1,3]),Int32Array.from([3,3,1,1,1]),Int32Array.from([1,1,3,1,3]),Int32Array.from([3,1,3,1,1]),Int32Array.from([1,3,3,1,1]),Int32Array.from([1,1,1,3,3]),Int32Array.from([3,1,1,3,1]),Int32Array.from([1,3,1,3,1])],At.MAX_AVG_VARIANCE=.38,At.MAX_INDIVIDUAL_VARIANCE=.5,At.DEFAULT_ALLOWED_LENGTHS=[6,8,10,12,14],At.START_PATTERN=Int32Array.from([1,1,1,1]),At.END_PATTERN_REVERSED=[Int32Array.from([1,1,2]),Int32Array.from([1,1,3])];class Ct extends gt{constructor(){super(...arguments),this.decodeRowStringBuffer=""}static findStartGuardPattern(t){let e,r=!1,n=0,i=Int32Array.from([0,0,0]);for(;!r;){i=Int32Array.from([0,0,0]),e=Ct.findGuardPattern(t,n,!1,this.START_END_PATTERN,i);let s=e[0];n=e[1];let o=s-(n-s);o>=0&&(r=t.isRange(o,s,!1))}return e}static checkChecksum(t){return Ct.checkStandardUPCEANChecksum(t)}static checkStandardUPCEANChecksum(t){let e=t.length;if(0===e)return!1;let r=parseInt(t.charAt(e-1),10);return Ct.getStandardUPCEANChecksum(t.substring(0,e-1))===r}static getStandardUPCEANChecksum(t){let e=t.length,r=0;for(let n=e-1;n>=0;n-=2){let e=t.charAt(n).charCodeAt(0)-"0".charCodeAt(0);if(e<0||e>9)throw new E;r+=e}r*=3;for(let n=e-2;n>=0;n-=2){let e=t.charAt(n).charCodeAt(0)-"0".charCodeAt(0);if(e<0||e>9)throw new E;r+=e}return(1e3-r)%10}static decodeEnd(t,e){return Ct.findGuardPattern(t,e,!1,Ct.START_END_PATTERN,new Int32Array(Ct.START_END_PATTERN.length).fill(0))}static findGuardPatternWithoutCounters(t,e,r,n){return this.findGuardPattern(t,e,r,n,new Int32Array(n.length))}static findGuardPattern(t,e,r,n,i){let s=t.getSize(),o=0,a=e=r?t.getNextUnset(e):t.getNextSet(e),l=n.length,h=r;for(let r=e;r<s;r++)if(t.get(r)!==h)i[o]++;else{if(o===l-1){if(gt.patternMatchVariance(i,n,Ct.MAX_INDIVIDUAL_VARIANCE)<Ct.MAX_AVG_VARIANCE)return Int32Array.from([a,r]);a+=i[0]+i[1];let t=i.slice(2,i.length-1);for(let e=0;e<o-1;e++)i[e]=t[e];i[o-1]=0,i[o]=0,o--}else o++;i[o]=1,h=!h}throw new R}static decodeDigit(t,e,r,n){this.recordPattern(t,r,e);let i=this.MAX_AVG_VARIANCE,s=-1,o=n.length;for(let t=0;t<o;t++){let r=n[t],o=gt.patternMatchVariance(e,r,Ct.MAX_INDIVIDUAL_VARIANCE);o<i&&(i=o,s=t)}if(s>=0)return s;throw new R}}Ct.MAX_AVG_VARIANCE=.48,Ct.MAX_INDIVIDUAL_VARIANCE=.7,Ct.START_END_PATTERN=Int32Array.from([1,1,1]),Ct.MIDDLE_PATTERN=Int32Array.from([1,1,1,1,1]),Ct.END_PATTERN=Int32Array.from([1,1,1,1,1,1]),Ct.L_PATTERNS=[Int32Array.from([3,2,1,1]),Int32Array.from([2,2,2,1]),Int32Array.from([2,1,2,2]),Int32Array.from([1,4,1,1]),Int32Array.from([1,1,3,2]),Int32Array.from([1,2,3,1]),Int32Array.from([1,1,1,4]),Int32Array.from([1,3,1,2]),Int32Array.from([1,2,1,3]),Int32Array.from([3,1,1,2])];class Et{constructor(){this.CHECK_DIGIT_ENCODINGS=[24,20,18,17,12,6,3,10,9,5],this.decodeMiddleCounters=Int32Array.from([0,0,0,0]),this.decodeRowStringBuffer=""}decodeRow(t,e,r){let n=this.decodeRowStringBuffer,i=this.decodeMiddle(e,r,n),s=n.toString(),o=Et.parseExtensionString(s),a=[new rt((r[0]+r[1])/2,t),new rt(i,t)],l=new F(s,null,0,a,k.UPC_EAN_EXTENSION,(new Date).getTime());return null!=o&&l.putAllMetadata(o),l}decodeMiddle(t,e,r){let n=this.decodeMiddleCounters;n[0]=0,n[1]=0,n[2]=0,n[3]=0;let i=t.getSize(),s=e[1],o=0;for(let e=0;e<5&&s<i;e++){let i=Ct.decodeDigit(t,n,s,Ct.L_AND_G_PATTERNS);r+=String.fromCharCode("0".charCodeAt(0)+i%10);for(let t of n)s+=t;i>=10&&(o|=1<<4-e),4!==e&&(s=t.getNextSet(s),s=t.getNextUnset(s))}if(5!==r.length)throw new R;let a=this.determineCheckDigit(o);if(Et.extensionChecksum(r.toString())!==a)throw new R;return s}static extensionChecksum(t){let e=t.length,r=0;for(let n=e-2;n>=0;n-=2)r+=t.charAt(n).charCodeAt(0)-"0".charCodeAt(0);r*=3;for(let n=e-1;n>=0;n-=2)r+=t.charAt(n).charCodeAt(0)-"0".charCodeAt(0);return r*=3,r%10}determineCheckDigit(t){for(let e=0;e<10;e++)if(t===this.CHECK_DIGIT_ENCODINGS[e])return e;throw new R}static parseExtensionString(t){if(5!==t.length)return null;let e=Et.parseExtension5String(t);return null==e?null:new Map([[W.SUGGESTED_PRICE,e]])}static parseExtension5String(t){let e;switch(t.charAt(0)){case"0":e="£";break;case"5":e="$";break;case"9":switch(t){case"90000":return null;case"99991":return"0.00";case"99990":return"Used"}e="";break;default:e=""}let r=parseInt(t.substring(1)),n=r%100;return e+(r/100).toString()+"."+(n<10?"0"+n:n.toString())}}class mt{constructor(){this.decodeMiddleCounters=Int32Array.from([0,0,0,0]),this.decodeRowStringBuffer=""}decodeRow(t,e,r){let n=this.decodeRowStringBuffer,i=this.decodeMiddle(e,r,n),s=n.toString(),o=mt.parseExtensionString(s),a=[new rt((r[0]+r[1])/2,t),new rt(i,t)],l=new F(s,null,0,a,k.UPC_EAN_EXTENSION,(new Date).getTime());return null!=o&&l.putAllMetadata(o),l}decodeMiddle(t,e,r){let n=this.decodeMiddleCounters;n[0]=0,n[1]=0,n[2]=0,n[3]=0;let i=t.getSize(),s=e[1],o=0;for(let e=0;e<2&&s<i;e++){let i=Ct.decodeDigit(t,n,s,Ct.L_AND_G_PATTERNS);r+=String.fromCharCode("0".charCodeAt(0)+i%10);for(let t of n)s+=t;i>=10&&(o|=1<<1-e),1!==e&&(s=t.getNextSet(s),s=t.getNextUnset(s))}if(2!==r.length)throw new R;if(parseInt(r.toString())%4!==o)throw new R;return s}static parseExtensionString(t){return 2!==t.length?null:new Map([[W.ISSUE_NUMBER,parseInt(t)]])}}class _t{static decodeRow(t,e,r){let n=Ct.findGuardPattern(e,r,!1,this.EXTENSION_START_PATTERN,new Int32Array(this.EXTENSION_START_PATTERN.length).fill(0));try{return(new Et).decodeRow(t,e,n)}catch(r){return(new mt).decodeRow(t,e,n)}}}_t.EXTENSION_START_PATTERN=Int32Array.from([1,1,2]);class It extends Ct{constructor(){super(),this.decodeRowStringBuffer="",It.L_AND_G_PATTERNS=It.L_PATTERNS.map((t=>Int32Array.from(t)));for(let t=10;t<20;t++){let e=It.L_PATTERNS[t-10],r=new Int32Array(e.length);for(let t=0;t<e.length;t++)r[t]=e[e.length-t-1];It.L_AND_G_PATTERNS[t]=r}}decodeRow(t,e,r){let n=It.findStartGuardPattern(e),i=null==r?null:r.get(C.NEED_RESULT_POINT_CALLBACK);if(null!=i){const e=new rt((n[0]+n[1])/2,t);i.foundPossibleResultPoint(e)}let s=this.decodeMiddle(e,n,this.decodeRowStringBuffer),o=s.rowOffset,a=s.resultString;if(null!=i){const e=new rt(o,t);i.foundPossibleResultPoint(e)}let h=It.decodeEnd(e,o);if(null!=i){const e=new rt((h[0]+h[1])/2,t);i.foundPossibleResultPoint(e)}let c=h[1],u=c+(c-h[0]);if(u>=e.getSize()||!e.isRange(c,u,!1))throw new R;let d=a.toString();if(d.length<8)throw new E;if(!It.checkChecksum(d))throw new l;let g=(n[1]+n[0])/2,f=(h[1]+h[0])/2,w=this.getBarcodeFormat(),A=[new rt(g,t),new rt(f,t)],m=new F(d,null,0,A,w,(new Date).getTime()),_=0;try{let r=_t.decodeRow(t,e,h[1]);m.putMetadata(W.UPC_EAN_EXTENSION,r.getText()),m.putAllMetadata(r.getResultMetadata()),m.addResultPoints(r.getResultPoints()),_=r.getText().length}catch(t){}let I=null==r?null:r.get(C.ALLOWED_EAN_EXTENSIONS);if(null!=I){let t=!1;for(let e in I)if(_.toString()===e){t=!0;break}if(!t)throw new R}return w===k.EAN_13||k.UPC_A,m}static checkChecksum(t){return It.checkStandardUPCEANChecksum(t)}static checkStandardUPCEANChecksum(t){let e=t.length;if(0===e)return!1;let r=parseInt(t.charAt(e-1),10);return It.getStandardUPCEANChecksum(t.substring(0,e-1))===r}static getStandardUPCEANChecksum(t){let e=t.length,r=0;for(let n=e-1;n>=0;n-=2){let e=t.charAt(n).charCodeAt(0)-"0".charCodeAt(0);if(e<0||e>9)throw new E;r+=e}r*=3;for(let n=e-2;n>=0;n-=2){let e=t.charAt(n).charCodeAt(0)-"0".charCodeAt(0);if(e<0||e>9)throw new E;r+=e}return(1e3-r)%10}static decodeEnd(t,e){return It.findGuardPattern(t,e,!1,It.START_END_PATTERN,new Int32Array(It.START_END_PATTERN.length).fill(0))}}class St extends It{constructor(){super(),this.decodeMiddleCounters=Int32Array.from([0,0,0,0])}decodeMiddle(t,e,r){let n=this.decodeMiddleCounters;n[0]=0,n[1]=0,n[2]=0,n[3]=0;let i=t.getSize(),s=e[1],o=0;for(let e=0;e<6&&s<i;e++){let i=It.decodeDigit(t,n,s,It.L_AND_G_PATTERNS);r+=String.fromCharCode("0".charCodeAt(0)+i%10);for(let t of n)s+=t;i>=10&&(o|=1<<5-e)}r=St.determineFirstDigit(r,o),s=It.findGuardPattern(t,s,!0,It.MIDDLE_PATTERN,new Int32Array(It.MIDDLE_PATTERN.length).fill(0))[1];for(let e=0;e<6&&s<i;e++){let e=It.decodeDigit(t,n,s,It.L_PATTERNS);r+=String.fromCharCode("0".charCodeAt(0)+e);for(let t of n)s+=t}return{rowOffset:s,resultString:r}}getBarcodeFormat(){return k.EAN_13}static determineFirstDigit(t,e){for(let r=0;r<10;r++)if(e===this.FIRST_DIGIT_ENCODINGS[r])return t=String.fromCharCode("0".charCodeAt(0)+r)+t;throw new R}}St.FIRST_DIGIT_ENCODINGS=[0,11,13,14,19,25,28,21,22,26];class pt extends It{constructor(){super(),this.decodeMiddleCounters=Int32Array.from([0,0,0,0])}decodeMiddle(t,e,r){const n=this.decodeMiddleCounters;n[0]=0,n[1]=0,n[2]=0,n[3]=0;let i=t.getSize(),s=e[1];for(let e=0;e<4&&s<i;e++){let e=It.decodeDigit(t,n,s,It.L_PATTERNS);r+=String.fromCharCode("0".charCodeAt(0)+e);for(let t of n)s+=t}s=It.findGuardPattern(t,s,!0,It.MIDDLE_PATTERN,new Int32Array(It.MIDDLE_PATTERN.length).fill(0))[1];for(let e=0;e<4&&s<i;e++){let e=It.decodeDigit(t,n,s,It.L_PATTERNS);r+=String.fromCharCode("0".charCodeAt(0)+e);for(let t of n)s+=t}return{rowOffset:s,resultString:r}}getBarcodeFormat(){return k.EAN_8}}class Tt extends It{constructor(){super(...arguments),this.ean13Reader=new St}getBarcodeFormat(){return k.UPC_A}decode(t,e){return this.maybeReturnResult(this.ean13Reader.decode(t))}decodeRow(t,e,r){return this.maybeReturnResult(this.ean13Reader.decodeRow(t,e,r))}decodeMiddle(t,e,r){return this.ean13Reader.decodeMiddle(t,e,r)}maybeReturnResult(t){let e=t.getText();if("0"===e.charAt(0)){let r=new F(e.substring(1),null,null,t.getResultPoints(),k.UPC_A);return null!=t.getResultMetadata()&&r.putAllMetadata(t.getResultMetadata()),r}throw new R}reset(){this.ean13Reader.reset()}}class Rt extends It{constructor(){super(),this.decodeMiddleCounters=new Int32Array(4)}decodeMiddle(t,e,r){const n=this.decodeMiddleCounters.map((t=>t));n[0]=0,n[1]=0,n[2]=0,n[3]=0;const i=t.getSize();let s=e[1],o=0;for(let e=0;e<6&&s<i;e++){const i=Rt.decodeDigit(t,n,s,Rt.L_AND_G_PATTERNS);r+=String.fromCharCode("0".charCodeAt(0)+i%10);for(let t of n)s+=t;i>=10&&(o|=1<<5-e)}return Rt.determineNumSysAndCheckDigit(new p(r),o),s}decodeEnd(t,e){return Rt.findGuardPatternWithoutCounters(t,e,!0,Rt.MIDDLE_END_PATTERN)}checkChecksum(t){return It.checkChecksum(Rt.convertUPCEtoUPCA(t))}static determineNumSysAndCheckDigit(t,e){for(let r=0;r<=1;r++)for(let n=0;n<10;n++)if(e===this.NUMSYS_AND_CHECK_DIGIT_PATTERNS[r][n])return t.insert(0,"0"+r),void t.append("0"+n);throw R.getNotFoundInstance()}getBarcodeFormat(){return k.UPC_E}static convertUPCEtoUPCA(t){const e=t.slice(1,7).split("").map((t=>t.charCodeAt(0))),r=new p;r.append(t.charAt(0));let n=e[5];switch(n){case 0:case 1:case 2:r.appendChars(e,0,2),r.append(n),r.append("0000"),r.appendChars(e,2,3);break;case 3:r.appendChars(e,0,3),r.append("00000"),r.appendChars(e,3,2);break;case 4:r.appendChars(e,0,4),r.append("00000"),r.append(e[4]);break;default:r.appendChars(e,0,5),r.append("0000"),r.append(n)}return t.length>=8&&r.append(t.charAt(7)),r.toString()}}Rt.MIDDLE_END_PATTERN=Int32Array.from([1,1,1,1,1,1]),Rt.NUMSYS_AND_CHECK_DIGIT_PATTERNS=[Int32Array.from([56,52,50,49,44,38,35,42,41,37]),Int32Array.from([7,11,13,14,19,25,28,21,22,1])];class Nt extends gt{constructor(t){super();let e=null==t?null:t.get(C.POSSIBLE_FORMATS),r=[];null!=e&&(e.indexOf(k.EAN_13)>-1&&r.push(new St),e.indexOf(k.UPC_A)>-1&&r.push(new Tt),e.indexOf(k.EAN_8)>-1&&r.push(new pt),e.indexOf(k.UPC_E)>-1&&r.push(new Rt)),0===r.length&&(r.push(new St),r.push(new Tt),r.push(new pt),r.push(new Rt)),this.readers=r}decodeRow(t,e,r){for(let n of this.readers)try{const i=n.decodeRow(t,e,r),s=i.getBarcodeFormat()===k.EAN_13&&"0"===i.getText().charAt(0),o=null==r?null:r.get(C.POSSIBLE_FORMATS),a=null==o||o.includes(k.UPC_A);if(s&&a){const t=i.getRawBytes(),e=new F(i.getText().substring(1),t,t?t.length:null,i.getResultPoints(),k.UPC_A);return e.putAllMetadata(i.getResultMetadata()),e}return i}catch(t){}throw new R}reset(){for(let t of this.readers)t.reset()}}class yt extends gt{constructor(){super(),this.decodeFinderCounters=new Int32Array(4),this.dataCharacterCounters=new Int32Array(8),this.oddRoundingErrors=new Array(4),this.evenRoundingErrors=new Array(4),this.oddCounts=new Array(this.dataCharacterCounters.length/2),this.evenCounts=new Array(this.dataCharacterCounters.length/2)}getDecodeFinderCounters(){return this.decodeFinderCounters}getDataCharacterCounters(){return this.dataCharacterCounters}getOddRoundingErrors(){return this.oddRoundingErrors}getEvenRoundingErrors(){return this.evenRoundingErrors}getOddCounts(){return this.oddCounts}getEvenCounts(){return this.evenCounts}parseFinderValue(t,e){for(let r=0;r<e.length;r++)if(gt.patternMatchVariance(t,e[r],yt.MAX_INDIVIDUAL_VARIANCE)<yt.MAX_AVG_VARIANCE)return r;throw new R}static count(t){return tt.sum(new Int32Array(t))}static increment(t,e){let r=0,n=e[0];for(let i=1;i<t.length;i++)e[i]>n&&(n=e[i],r=i);t[r]++}static decrement(t,e){let r=0,n=e[0];for(let i=1;i<t.length;i++)e[i]<n&&(n=e[i],r=i);t[r]--}static isFinderPattern(t){let e=t[0]+t[1],r=e/(e+t[2]+t[3]);if(r>=yt.MIN_FINDER_PATTERN_RATIO&&r<=yt.MAX_FINDER_PATTERN_RATIO){let e=Number.MAX_SAFE_INTEGER,r=Number.MIN_SAFE_INTEGER;for(let n of t)n>r&&(r=n),n<e&&(e=n);return r<10*e}return!1}}yt.MAX_AVG_VARIANCE=.2,yt.MAX_INDIVIDUAL_VARIANCE=.45,yt.MIN_FINDER_PATTERN_RATIO=9.5/12,yt.MAX_FINDER_PATTERN_RATIO=12.5/14;class Dt{constructor(t,e){this.value=t,this.checksumPortion=e}getValue(){return this.value}getChecksumPortion(){return this.checksumPortion}toString(){return this.value+"("+this.checksumPortion+")"}equals(t){if(!(t instanceof Dt))return!1;const e=t;return this.value===e.value&&this.checksumPortion===e.checksumPortion}hashCode(){return this.value^this.checksumPortion}}class Ot{constructor(t,e,r,n,i){this.value=t,this.startEnd=e,this.value=t,this.startEnd=e,this.resultPoints=new Array,this.resultPoints.push(new rt(r,i)),this.resultPoints.push(new rt(n,i))}getValue(){return this.value}getStartEnd(){return this.startEnd}getResultPoints(){return this.resultPoints}equals(t){if(!(t instanceof Ot))return!1;const e=t;return this.value===e.value}hashCode(){return this.value}}class Mt{constructor(){}static getRSSvalue(t,e,r){let n=0;for(let e of t)n+=e;let i=0,s=0,o=t.length;for(let a=0;a<o-1;a++){let l;for(l=1,s|=1<<a;l<t[a];l++,s&=~(1<<a)){let t=Mt.combins(n-l-1,o-a-2);if(r&&0===s&&n-l-(o-a-1)>=o-a-1&&(t-=Mt.combins(n-l-(o-a),o-a-2)),o-a-1>1){let r=0;for(let t=n-l-(o-a-2);t>e;t--)r+=Mt.combins(n-l-t-1,o-a-3);t-=r*(o-1-a)}else n-l>e&&t--;i+=t}n-=l}return i}static combins(t,e){let r,n;t-e>e?(n=e,r=t-e):(n=t-e,r=e);let i=1,s=1;for(let e=t;e>r;e--)i*=e,s<=n&&(i/=s,s++);for(;s<=n;)i/=s,s++;return i}}class Bt{static buildBitArray(t){let e=2*t.length-1;null==t[t.length-1].getRightChar()&&(e-=1);let r=new w(12*e),n=0,i=t[0].getRightChar().getValue();for(let t=11;t>=0;--t)0!=(i&1<<t)&&r.set(n),n++;for(let e=1;e<t.length;++e){let i=t[e],s=i.getLeftChar().getValue();for(let t=11;t>=0;--t)0!=(s&1<<t)&&r.set(n),n++;if(null!=i.getRightChar()){let t=i.getRightChar().getValue();for(let e=11;e>=0;--e)0!=(t&1<<e)&&r.set(n),n++}}return r}}class bt{constructor(t,e){e?this.decodedInformation=null:(this.finished=t,this.decodedInformation=e)}getDecodedInformation(){return this.decodedInformation}isFinished(){return this.finished}}class Pt{constructor(t){this.newPosition=t}getNewPosition(){return this.newPosition}}class Lt extends Pt{constructor(t,e){super(t),this.value=e}getValue(){return this.value}isFNC1(){return this.value===Lt.FNC1}}Lt.FNC1="$";class Ft extends Pt{constructor(t,e,r){super(t),r?(this.remaining=!0,this.remainingValue=this.remainingValue):(this.remaining=!1,this.remainingValue=0),this.newString=e}getNewString(){return this.newString}isRemaining(){return this.remaining}getRemainingValue(){return this.remainingValue}}class vt extends Pt{constructor(t,e,r){if(super(t),e<0||e>10||r<0||r>10)throw new E;this.firstDigit=e,this.secondDigit=r}getFirstDigit(){return this.firstDigit}getSecondDigit(){return this.secondDigit}getValue(){return 10*this.firstDigit+this.secondDigit}isFirstDigitFNC1(){return this.firstDigit===vt.FNC1}isSecondDigitFNC1(){return this.secondDigit===vt.FNC1}isAnyFNC1(){return this.firstDigit===vt.FNC1||this.secondDigit===vt.FNC1}}vt.FNC1=10;class kt{constructor(){}static parseFieldsInGeneralPurpose(t){if(!t)return null;if(t.length<2)throw new R;let e=t.substring(0,2);for(let r of kt.TWO_DIGIT_DATA_LENGTH)if(r[0]===e)return r[1]===kt.VARIABLE_LENGTH?kt.processVariableAI(2,r[2],t):kt.processFixedAI(2,r[1],t);if(t.length<3)throw new R;let r=t.substring(0,3);for(let e of kt.THREE_DIGIT_DATA_LENGTH)if(e[0]===r)return e[1]===kt.VARIABLE_LENGTH?kt.processVariableAI(3,e[2],t):kt.processFixedAI(3,e[1],t);for(let e of kt.THREE_DIGIT_PLUS_DIGIT_DATA_LENGTH)if(e[0]===r)return e[1]===kt.VARIABLE_LENGTH?kt.processVariableAI(4,e[2],t):kt.processFixedAI(4,e[1],t);if(t.length<4)throw new R;let n=t.substring(0,4);for(let e of kt.FOUR_DIGIT_DATA_LENGTH)if(e[0]===n)return e[1]===kt.VARIABLE_LENGTH?kt.processVariableAI(4,e[2],t):kt.processFixedAI(4,e[1],t);throw new R}static processFixedAI(t,e,r){if(r.length<t)throw new R;let n=r.substring(0,t);if(r.length<t+e)throw new R;let i=r.substring(t,t+e),s=r.substring(t+e),o="("+n+")"+i,a=kt.parseFieldsInGeneralPurpose(s);return null==a?o:o+a}static processVariableAI(t,e,r){let n,i=r.substring(0,t);n=r.length<t+e?r.length:t+e;let s=r.substring(t,n),o=r.substring(n),a="("+i+")"+s,l=kt.parseFieldsInGeneralPurpose(o);return null==l?a:a+l}}kt.VARIABLE_LENGTH=[],kt.TWO_DIGIT_DATA_LENGTH=[["00",18],["01",14],["02",14],["10",kt.VARIABLE_LENGTH,20],["11",6],["12",6],["13",6],["15",6],["17",6],["20",2],["21",kt.VARIABLE_LENGTH,20],["22",kt.VARIABLE_LENGTH,29],["30",kt.VARIABLE_LENGTH,8],["37",kt.VARIABLE_LENGTH,8],["90",kt.VARIABLE_LENGTH,30],["91",kt.VARIABLE_LENGTH,30],["92",kt.VARIABLE_LENGTH,30],["93",kt.VARIABLE_LENGTH,30],["94",kt.VARIABLE_LENGTH,30],["95",kt.VARIABLE_LENGTH,30],["96",kt.VARIABLE_LENGTH,30],["97",kt.VARIABLE_LENGTH,3],["98",kt.VARIABLE_LENGTH,30],["99",kt.VARIABLE_LENGTH,30]],kt.THREE_DIGIT_DATA_LENGTH=[["240",kt.VARIABLE_LENGTH,30],["241",kt.VARIABLE_LENGTH,30],["242",kt.VARIABLE_LENGTH,6],["250",kt.VARIABLE_LENGTH,30],["251",kt.VARIABLE_LENGTH,30],["253",kt.VARIABLE_LENGTH,17],["254",kt.VARIABLE_LENGTH,20],["400",kt.VARIABLE_LENGTH,30],["401",kt.VARIABLE_LENGTH,30],["402",17],["403",kt.VARIABLE_LENGTH,30],["410",13],["411",13],["412",13],["413",13],["414",13],["420",kt.VARIABLE_LENGTH,20],["421",kt.VARIABLE_LENGTH,15],["422",3],["423",kt.VARIABLE_LENGTH,15],["424",3],["425",3],["426",3]],kt.THREE_DIGIT_PLUS_DIGIT_DATA_LENGTH=[["310",6],["311",6],["312",6],["313",6],["314",6],["315",6],["316",6],["320",6],["321",6],["322",6],["323",6],["324",6],["325",6],["326",6],["327",6],["328",6],["329",6],["330",6],["331",6],["332",6],["333",6],["334",6],["335",6],["336",6],["340",6],["341",6],["342",6],["343",6],["344",6],["345",6],["346",6],["347",6],["348",6],["349",6],["350",6],["351",6],["352",6],["353",6],["354",6],["355",6],["356",6],["357",6],["360",6],["361",6],["362",6],["363",6],["364",6],["365",6],["366",6],["367",6],["368",6],["369",6],["390",kt.VARIABLE_LENGTH,15],["391",kt.VARIABLE_LENGTH,18],["392",kt.VARIABLE_LENGTH,15],["393",kt.VARIABLE_LENGTH,18],["703",kt.VARIABLE_LENGTH,30]],kt.FOUR_DIGIT_DATA_LENGTH=[["7001",13],["7002",kt.VARIABLE_LENGTH,30],["7003",10],["8001",14],["8002",kt.VARIABLE_LENGTH,20],["8003",kt.VARIABLE_LENGTH,30],["8004",kt.VARIABLE_LENGTH,30],["8005",6],["8006",18],["8007",kt.VARIABLE_LENGTH,30],["8008",kt.VARIABLE_LENGTH,12],["8018",18],["8020",kt.VARIABLE_LENGTH,25],["8100",6],["8101",10],["8102",2],["8110",kt.VARIABLE_LENGTH,70],["8200",kt.VARIABLE_LENGTH,70]];class xt{constructor(t){this.buffer=new p,this.information=t}decodeAllCodes(t,e){let r=e,n=null;for(;;){let e=this.decodeGeneralPurposeField(r,n),i=kt.parseFieldsInGeneralPurpose(e.getNewString());if(null!=i&&t.append(i),n=e.isRemaining()?""+e.getRemainingValue():null,r===e.getNewPosition())break;r=e.getNewPosition()}return t.toString()}isStillNumeric(t){if(t+7>this.information.getSize())return t+4<=this.information.getSize();for(let e=t;e<t+3;++e)if(this.information.get(e))return!0;return this.information.get(t+3)}decodeNumeric(t){if(t+7>this.information.getSize()){let e=this.extractNumericValueFromBitArray(t,4);return new vt(this.information.getSize(),0===e?vt.FNC1:e-1,vt.FNC1)}let e=this.extractNumericValueFromBitArray(t,7);return new vt(t+7,(e-8)/11,(e-8)%11)}extractNumericValueFromBitArray(t,e){return xt.extractNumericValueFromBitArray(this.information,t,e)}static extractNumericValueFromBitArray(t,e,r){let n=0;for(let i=0;i<r;++i)t.get(e+i)&&(n|=1<<r-i-1);return n}decodeGeneralPurposeField(t,e){this.buffer.setLengthToZero(),null!=e&&this.buffer.append(e),this.current.setPosition(t);let r=this.parseBlocks();return null!=r&&r.isRemaining()?new Ft(this.current.getPosition(),this.buffer.toString(),r.getRemainingValue()):new Ft(this.current.getPosition(),this.buffer.toString())}parseBlocks(){let t,e;do{let r=this.current.getPosition();if(this.current.isAlpha()?(e=this.parseAlphaBlock(),t=e.isFinished()):this.current.isIsoIec646()?(e=this.parseIsoIec646Block(),t=e.isFinished()):(e=this.parseNumericBlock(),t=e.isFinished()),!(r!==this.current.getPosition())&&!t)break}while(!t);return e.getDecodedInformation()}parseNumericBlock(){for(;this.isStillNumeric(this.current.getPosition());){let t=this.decodeNumeric(this.current.getPosition());if(this.current.setPosition(t.getNewPosition()),t.isFirstDigitFNC1()){let e;return e=t.isSecondDigitFNC1()?new Ft(this.current.getPosition(),this.buffer.toString()):new Ft(this.current.getPosition(),this.buffer.toString(),t.getSecondDigit()),new bt(!0,e)}if(this.buffer.append(t.getFirstDigit()),t.isSecondDigitFNC1()){let t=new Ft(this.current.getPosition(),this.buffer.toString());return new bt(!0,t)}this.buffer.append(t.getSecondDigit())}return this.isNumericToAlphaNumericLatch(this.current.getPosition())&&(this.current.setAlpha(),this.current.incrementPosition(4)),new bt(!1)}parseIsoIec646Block(){for(;this.isStillIsoIec646(this.current.getPosition());){let t=this.decodeIsoIec646(this.current.getPosition());if(this.current.setPosition(t.getNewPosition()),t.isFNC1()){let t=new Ft(this.current.getPosition(),this.buffer.toString());return new bt(!0,t)}this.buffer.append(t.getValue())}return this.isAlphaOr646ToNumericLatch(this.current.getPosition())?(this.current.incrementPosition(3),this.current.setNumeric()):this.isAlphaTo646ToAlphaLatch(this.current.getPosition())&&(this.current.getPosition()+5<this.information.getSize()?this.current.incrementPosition(5):this.current.setPosition(this.information.getSize()),this.current.setAlpha()),new bt(!1)}parseAlphaBlock(){for(;this.isStillAlpha(this.current.getPosition());){let t=this.decodeAlphanumeric(this.current.getPosition());if(this.current.setPosition(t.getNewPosition()),t.isFNC1()){let t=new Ft(this.current.getPosition(),this.buffer.toString());return new bt(!0,t)}this.buffer.append(t.getValue())}return this.isAlphaOr646ToNumericLatch(this.current.getPosition())?(this.current.incrementPosition(3),this.current.setNumeric()):this.isAlphaTo646ToAlphaLatch(this.current.getPosition())&&(this.current.getPosition()+5<this.information.getSize()?this.current.incrementPosition(5):this.current.setPosition(this.information.getSize()),this.current.setIsoIec646()),new bt(!1)}isStillIsoIec646(t){if(t+5>this.information.getSize())return!1;let e=this.extractNumericValueFromBitArray(t,5);if(e>=5&&e<16)return!0;if(t+7>this.information.getSize())return!1;let r=this.extractNumericValueFromBitArray(t,7);if(r>=64&&r<116)return!0;if(t+8>this.information.getSize())return!1;let n=this.extractNumericValueFromBitArray(t,8);return n>=232&&n<253}decodeIsoIec646(t){let e=this.extractNumericValueFromBitArray(t,5);if(15===e)return new Lt(t+5,Lt.FNC1);if(e>=5&&e<15)return new Lt(t+5,"0"+(e-5));let r,n=this.extractNumericValueFromBitArray(t,7);if(n>=64&&n<90)return new Lt(t+7,""+(n+1));if(n>=90&&n<116)return new Lt(t+7,""+(n+7));switch(this.extractNumericValueFromBitArray(t,8)){case 232:r="!";break;case 233:r='"';break;case 234:r="%";break;case 235:r="&";break;case 236:r="'";break;case 237:r="(";break;case 238:r=")";break;case 239:r="*";break;case 240:r="+";break;case 241:r=",";break;case 242:r="-";break;case 243:r=".";break;case 244:r="/";break;case 245:r=":";break;case 246:r=";";break;case 247:r="<";break;case 248:r="=";break;case 249:r=">";break;case 250:r="?";break;case 251:r="_";break;case 252:r=" ";break;default:throw new E}return new Lt(t+8,r)}isStillAlpha(t){if(t+5>this.information.getSize())return!1;let e=this.extractNumericValueFromBitArray(t,5);if(e>=5&&e<16)return!0;if(t+6>this.information.getSize())return!1;let r=this.extractNumericValueFromBitArray(t,6);return r>=16&&r<63}decodeAlphanumeric(t){let e=this.extractNumericValueFromBitArray(t,5);if(15===e)return new Lt(t+5,Lt.FNC1);if(e>=5&&e<15)return new Lt(t+5,"0"+(e-5));let r,n=this.extractNumericValueFromBitArray(t,6);if(n>=32&&n<58)return new Lt(t+6,""+(n+33));switch(n){case 58:r="*";break;case 59:r=",";break;case 60:r="-";break;case 61:r=".";break;case 62:r="/";break;default:throw new j("Decoding invalid alphanumeric value: "+n)}return new Lt(t+6,r)}isAlphaTo646ToAlphaLatch(t){if(t+1>this.information.getSize())return!1;for(let e=0;e<5&&e+t<this.information.getSize();++e)if(2===e){if(!this.information.get(t+2))return!1}else if(this.information.get(t+e))return!1;return!0}isAlphaOr646ToNumericLatch(t){if(t+3>this.information.getSize())return!1;for(let e=t;e<t+3;++e)if(this.information.get(e))return!1;return!0}isNumericToAlphaNumericLatch(t){if(t+1>this.information.getSize())return!1;for(let e=0;e<4&&e+t<this.information.getSize();++e)if(this.information.get(t+e))return!1;return!0}}class Vt{constructor(t){this.information=t,this.generalDecoder=new xt(t)}getInformation(){return this.information}getGeneralDecoder(){return this.generalDecoder}}class Ut extends Vt{constructor(t){super(t)}encodeCompressedGtin(t,e){t.append("(01)");let r=t.length();t.append("9"),this.encodeCompressedGtinWithoutAI(t,e,r)}encodeCompressedGtinWithoutAI(t,e,r){for(let r=0;r<4;++r){let n=this.getGeneralDecoder().extractNumericValueFromBitArray(e+10*r,10);n/100==0&&t.append("0"),n/10==0&&t.append("0"),t.append(n)}Ut.appendCheckDigit(t,r)}static appendCheckDigit(t,e){let r=0;for(let n=0;n<13;n++){let i=t.charAt(n+e).charCodeAt(0)-"0".charCodeAt(0);r+=0==(1&n)?3*i:i}r=10-r%10,10===r&&(r=0),t.append(r)}}Ut.GTIN_SIZE=40;class Ht extends Ut{constructor(t){super(t)}parseInformation(){let t=new p;t.append("(01)");let e=t.length(),r=this.getGeneralDecoder().extractNumericValueFromBitArray(Ht.HEADER_SIZE,4);return t.append(r),this.encodeCompressedGtinWithoutAI(t,Ht.HEADER_SIZE+4,e),this.getGeneralDecoder().decodeAllCodes(t,Ht.HEADER_SIZE+44)}}Ht.HEADER_SIZE=4;class Gt extends Vt{constructor(t){super(t)}parseInformation(){let t=new p;return this.getGeneralDecoder().decodeAllCodes(t,Gt.HEADER_SIZE)}}Gt.HEADER_SIZE=5;class Xt extends Ut{constructor(t){super(t)}encodeCompressedWeight(t,e,r){let n=this.getGeneralDecoder().extractNumericValueFromBitArray(e,r);this.addWeightCode(t,n);let i=this.checkWeight(n),s=1e5;for(let e=0;e<5;++e)i/s==0&&t.append("0"),s/=10;t.append(i)}}class Wt extends Xt{constructor(t){super(t)}parseInformation(){if(this.getInformation().getSize()!=Wt.HEADER_SIZE+Xt.GTIN_SIZE+Wt.WEIGHT_SIZE)throw new R;let t=new p;return this.encodeCompressedGtin(t,Wt.HEADER_SIZE),this.encodeCompressedWeight(t,Wt.HEADER_SIZE+Xt.GTIN_SIZE,Wt.WEIGHT_SIZE),t.toString()}}Wt.HEADER_SIZE=5,Wt.WEIGHT_SIZE=15;class zt extends Wt{constructor(t){super(t)}addWeightCode(t,e){t.append("(3103)")}checkWeight(t){return t}}class Yt extends Wt{constructor(t){super(t)}addWeightCode(t,e){e<1e4?t.append("(3202)"):t.append("(3203)")}checkWeight(t){return t<1e4?t:t-1e4}}class Zt extends Ut{constructor(t){super(t)}parseInformation(){if(this.getInformation().getSize()<Zt.HEADER_SIZE+Ut.GTIN_SIZE)throw new R;let t=new p;this.encodeCompressedGtin(t,Zt.HEADER_SIZE);let e=this.getGeneralDecoder().extractNumericValueFromBitArray(Zt.HEADER_SIZE+Ut.GTIN_SIZE,Zt.LAST_DIGIT_SIZE);t.append("(392"),t.append(e),t.append(")");let r=this.getGeneralDecoder().decodeGeneralPurposeField(Zt.HEADER_SIZE+Ut.GTIN_SIZE+Zt.LAST_DIGIT_SIZE,null);return t.append(r.getNewString()),t.toString()}}Zt.HEADER_SIZE=8,Zt.LAST_DIGIT_SIZE=2;class Kt extends Ut{constructor(t){super(t)}parseInformation(){if(this.getInformation().getSize()<Kt.HEADER_SIZE+Ut.GTIN_SIZE)throw new R;let t=new p;this.encodeCompressedGtin(t,Kt.HEADER_SIZE);let e=this.getGeneralDecoder().extractNumericValueFromBitArray(Kt.HEADER_SIZE+Ut.GTIN_SIZE,Kt.LAST_DIGIT_SIZE);t.append("(393"),t.append(e),t.append(")");let r=this.getGeneralDecoder().extractNumericValueFromBitArray(Kt.HEADER_SIZE+Ut.GTIN_SIZE+Kt.LAST_DIGIT_SIZE,Kt.FIRST_THREE_DIGITS_SIZE);r/100==0&&t.append("0"),r/10==0&&t.append("0"),t.append(r);let n=this.getGeneralDecoder().decodeGeneralPurposeField(Kt.HEADER_SIZE+Ut.GTIN_SIZE+Kt.LAST_DIGIT_SIZE+Kt.FIRST_THREE_DIGITS_SIZE,null);return t.append(n.getNewString()),t.toString()}}Kt.HEADER_SIZE=8,Kt.LAST_DIGIT_SIZE=2,Kt.FIRST_THREE_DIGITS_SIZE=10;class qt extends Xt{constructor(t,e,r){super(t),this.dateCode=r,this.firstAIdigits=e}parseInformation(){if(this.getInformation().getSize()!=qt.HEADER_SIZE+qt.GTIN_SIZE+qt.WEIGHT_SIZE+qt.DATE_SIZE)throw new R;let t=new p;return this.encodeCompressedGtin(t,qt.HEADER_SIZE),this.encodeCompressedWeight(t,qt.HEADER_SIZE+qt.GTIN_SIZE,qt.WEIGHT_SIZE),this.encodeCompressedDate(t,qt.HEADER_SIZE+qt.GTIN_SIZE+qt.WEIGHT_SIZE),t.toString()}encodeCompressedDate(t,e){let r=this.getGeneralDecoder().extractNumericValueFromBitArray(e,qt.DATE_SIZE);if(38400==r)return;t.append("("),t.append(this.dateCode),t.append(")");let n=r%32;r/=32;let i=r%12+1;r/=12;let s=r;s/10==0&&t.append("0"),t.append(s),i/10==0&&t.append("0"),t.append(i),n/10==0&&t.append("0"),t.append(n)}addWeightCode(t,e){t.append("("),t.append(this.firstAIdigits),t.append(e/1e5),t.append(")")}checkWeight(t){return t%1e5}}function Qt(t){try{if(t.get(1))return new Ht(t);if(!t.get(2))return new Gt(t);switch(xt.extractNumericValueFromBitArray(t,1,4)){case 4:return new zt(t);case 5:return new Yt(t)}switch(xt.extractNumericValueFromBitArray(t,1,5)){case 12:return new Zt(t);case 13:return new Kt(t)}switch(xt.extractNumericValueFromBitArray(t,1,7)){case 56:return new qt(t,"310","11");case 57:return new qt(t,"320","11");case 58:return new qt(t,"310","13");case 59:return new qt(t,"320","13");case 60:return new qt(t,"310","15");case 61:return new qt(t,"320","15");case 62:return new qt(t,"310","17");case 63:return new qt(t,"320","17")}}catch(e){throw console.log(e),new j("unknown decoder: "+t)}}qt.HEADER_SIZE=8,qt.WEIGHT_SIZE=20,qt.DATE_SIZE=16;class jt{constructor(t,e,r,n){this.leftchar=t,this.rightchar=e,this.finderpattern=r,this.maybeLast=n}mayBeLast(){return this.maybeLast}getLeftChar(){return this.leftchar}getRightChar(){return this.rightchar}getFinderPattern(){return this.finderpattern}mustBeLast(){return null==this.rightchar}toString(){return"[ "+this.leftchar+", "+this.rightchar+" : "+(null==this.finderpattern?"null":this.finderpattern.getValue())+" ]"}static equals(t,e){return t instanceof jt&&(jt.equalsOrNull(t.leftchar,e.leftchar)&&jt.equalsOrNull(t.rightchar,e.rightchar)&&jt.equalsOrNull(t.finderpattern,e.finderpattern))}static equalsOrNull(t,e){return null===t?null===e:jt.equals(t,e)}hashCode(){return this.leftchar.getValue()^this.rightchar.getValue()^this.finderpattern.getValue()}}class Jt{constructor(t,e,r){this.pairs=t,this.rowNumber=e,this.wasReversed=r}getPairs(){return this.pairs}getRowNumber(){return this.rowNumber}isReversed(){return this.wasReversed}isEquivalent(t){return this.checkEqualitity(this,t)}toString(){return"{ "+this.pairs+" }"}equals(t,e){return t instanceof Jt&&(this.checkEqualitity(t,e)&&t.wasReversed===e.wasReversed)}checkEqualitity(t,e){if(!t||!e)return;let r;return t.forEach(((t,n)=>{e.forEach((e=>{t.getLeftChar().getValue()===e.getLeftChar().getValue()&&t.getRightChar().getValue()===e.getRightChar().getValue()&&t.getFinderPatter().getValue()===e.getFinderPatter().getValue()&&(r=!0)}))})),r}}class $t extends yt{constructor(){super(...arguments),this.pairs=new Array($t.MAX_PAIRS),this.rows=new Array,this.startEnd=[2]}decodeRow(t,e,r){this.pairs.length=0,this.startFromEven=!1;try{return $t.constructResult(this.decodeRow2pairs(t,e))}catch(t){}return this.pairs.length=0,this.startFromEven=!0,$t.constructResult(this.decodeRow2pairs(t,e))}reset(){this.pairs.length=0,this.rows.length=0}decodeRow2pairs(t,e){let r,n=!1;for(;!n;)try{this.pairs.push(this.retrieveNextPair(e,this.pairs,t))}catch(t){if(t instanceof R){if(!this.pairs.length)throw new R;n=!0}}if(this.checkChecksum())return this.pairs;if(r=!!this.rows.length,this.storeRow(t,!1),r){let t=this.checkRowsBoolean(!1);if(null!=t)return t;if(t=this.checkRowsBoolean(!0),null!=t)return t}throw new R}checkRowsBoolean(t){if(this.rows.length>25)return this.rows.length=0,null;this.pairs.length=0,t&&(this.rows=this.rows.reverse());let e=null;try{e=this.checkRows(new Array,0)}catch(t){console.log(t)}return t&&(this.rows=this.rows.reverse()),e}checkRows(t,e){for(let r=e;r<this.rows.length;r++){let e=this.rows[r];this.pairs.length=0;for(let e of t)this.pairs.push(e.getPairs());if(this.pairs.push(e.getPairs()),!$t.isValidSequence(this.pairs))continue;if(this.checkChecksum())return this.pairs;let n=new Array(t);n.push(e);try{return this.checkRows(n,r+1)}catch(t){console.log(t)}}throw new R}static isValidSequence(t){for(let e of $t.FINDER_PATTERN_SEQUENCES){if(t.length>e.length)continue;let r=!0;for(let n=0;n<t.length;n++)if(t[n].getFinderPattern().getValue()!=e[n]){r=!1;break}if(r)return!0}return!1}storeRow(t,e){let r=0,n=!1,i=!1;for(;r<this.rows.length;){let e=this.rows[r];if(e.getRowNumber()>t){i=e.isEquivalent(this.pairs);break}n=e.isEquivalent(this.pairs),r++}i||n||$t.isPartialRow(this.pairs,this.rows)||(this.rows.push(r,new Jt(this.pairs,t,e)),this.removePartialRows(this.pairs,this.rows))}removePartialRows(t,e){for(let r of e)if(r.getPairs().length!==t.length)for(let e of r.getPairs())for(let r of t)if(jt.equals(e,r))break}static isPartialRow(t,e){for(let r of e){let e=!0;for(let n of t){let t=!1;for(let e of r.getPairs())if(n.equals(e)){t=!0;break}if(!t){e=!1;break}}if(e)return!0}return!1}getRows(){return this.rows}static constructResult(t){let e=Qt(Bt.buildBitArray(t)).parseInformation(),r=t[0].getFinderPattern().getResultPoints(),n=t[t.length-1].getFinderPattern().getResultPoints(),i=[r[0],r[1],n[0],n[1]];return new F(e,null,null,i,k.RSS_EXPANDED,null)}checkChecksum(){let t=this.pairs.get(0),e=t.getLeftChar(),r=t.getRightChar();if(null==r)return!1;let n=r.getChecksumPortion(),i=2;for(let t=1;t<this.pairs.size();++t){let e=this.pairs.get(t);n+=e.getLeftChar().getChecksumPortion(),i++;let r=e.getRightChar();null!=r&&(n+=r.getChecksumPortion(),i++)}return n%=211,211*(i-4)+n==e.getValue()}static getNextSecondBar(t,e){let r;return t.get(e)?(r=t.getNextUnset(e),r=t.getNextSet(r)):(r=t.getNextSet(e),r=t.getNextUnset(r)),r}retrieveNextPair(t,e,r){let n,i=e.length%2==0;this.startFromEven&&(i=!i);let s=!0,o=-1;do{this.findNextPair(t,e,o),n=this.parseFoundFinderPattern(t,r,i),null==n?o=$t.getNextSecondBar(t,this.startEnd[0]):s=!1}while(s);let a,l=this.decodeDataCharacter(t,n,i,!0);if(!this.isEmptyPair(e)&&e[e.length-1].mustBeLast())throw new R;try{a=this.decodeDataCharacter(t,n,i,!1)}catch(t){a=null,console.log(t)}return new jt(l,a,n,!0)}isEmptyPair(t){return 0===t.length}findNextPair(t,e,r){let n=this.getDecodeFinderCounters();n[0]=0,n[1]=0,n[2]=0,n[3]=0;let i,s=t.getSize();if(r>=0)i=r;else if(this.isEmptyPair(e))i=0;else{i=e[e.length-1].getFinderPattern().getStartEnd()[1]}let o=e.length%2!=0;this.startFromEven&&(o=!o);let a=!1;for(;i<s&&(a=!t.get(i),a);)i++;let l=0,h=i;for(let e=i;e<s;e++)if(t.get(e)!=a)n[l]++;else{if(3==l){if(o&&$t.reverseCounters(n),$t.isFinderPattern(n))return this.startEnd[0]=h,void(this.startEnd[1]=e);o&&$t.reverseCounters(n),h+=n[0]+n[1],n[0]=n[2],n[1]=n[3],n[2]=0,n[3]=0,l--}else l++;n[l]=1,a=!a}throw new R}static reverseCounters(t){let e=t.length;for(let r=0;r<e/2;++r){let n=t[r];t[r]=t[e-r-1],t[e-r-1]=n}}parseFoundFinderPattern(t,e,r){let n,i,s;if(r){let e=this.startEnd[0]-1;for(;e>=0&&!t.get(e);)e--;e++,n=this.startEnd[0]-e,i=e,s=this.startEnd[1]}else i=this.startEnd[0],s=t.getNextUnset(this.startEnd[1]+1),n=s-this.startEnd[1];let o,a=this.getDecodeFinderCounters();c.arraycopy(a,0,a,1,a.length-1),a[0]=n;try{o=this.parseFinderValue(a,$t.FINDER_PATTERNS)}catch(t){return null}return new Ot(o,[i,s],i,s,e)}decodeDataCharacter(t,e,r,n){let i=this.getDataCharacterCounters();for(let t=0;t<i.length;t++)i[t]=0;if(n)$t.recordPatternInReverse(t,e.getStartEnd()[0],i);else{$t.recordPattern(t,e.getStartEnd()[1],i);for(let t=0,e=i.length-1;t<e;t++,e--){let r=i[t];i[t]=i[e],i[e]=r}}let s=tt.sum(new Int32Array(i))/17,o=(e.getStartEnd()[1]-e.getStartEnd()[0])/15;if(Math.abs(s-o)/o>.3)throw new R;let a=this.getOddCounts(),l=this.getEvenCounts(),h=this.getOddRoundingErrors(),c=this.getEvenRoundingErrors();for(let t=0;t<i.length;t++){let e=1*i[t]/s,r=e+.5;if(r<1){if(e<.3)throw new R;r=1}else if(r>8){if(e>8.7)throw new R;r=8}let n=t/2;0==(1&t)?(a[n]=r,h[n]=e-r):(l[n]=r,c[n]=e-r)}this.adjustOddEvenCounts(17);let u=4*e.getValue()+(r?0:2)+(n?0:1)-1,d=0,g=0;for(let t=a.length-1;t>=0;t--){if($t.isNotA1left(e,r,n)){let e=$t.WEIGHTS[u][2*t];g+=a[t]*e}d+=a[t]}let f=0;for(let t=l.length-1;t>=0;t--)if($t.isNotA1left(e,r,n)){let e=$t.WEIGHTS[u][2*t+1];f+=l[t]*e}let w=g+f;if(0!=(1&d)||d>13||d<4)throw new R;let A=(13-d)/2,C=$t.SYMBOL_WIDEST[A],E=9-C,m=Mt.getRSSvalue(a,C,!0),_=Mt.getRSSvalue(l,E,!1),I=$t.EVEN_TOTAL_SUBSET[A],S=$t.GSUM[A];return new Dt(m*I+_+S,w)}static isNotA1left(t,e,r){return!(0==t.getValue()&&e&&r)}adjustOddEvenCounts(t){let e=tt.sum(new Int32Array(this.getOddCounts())),r=tt.sum(new Int32Array(this.getEvenCounts())),n=!1,i=!1;e>13?i=!0:e<4&&(n=!0);let s=!1,o=!1;r>13?o=!0:r<4&&(s=!0);let a=e+r-t,l=1==(1&e),h=0==(1&r);if(1==a)if(l){if(h)throw new R;i=!0}else{if(!h)throw new R;o=!0}else if(-1==a)if(l){if(h)throw new R;n=!0}else{if(!h)throw new R;s=!0}else{if(0!=a)throw new R;if(l){if(!h)throw new R;e<r?(n=!0,o=!0):(i=!0,s=!0)}else if(h)throw new R}if(n){if(i)throw new R;$t.increment(this.getOddCounts(),this.getOddRoundingErrors())}if(i&&$t.decrement(this.getOddCounts(),this.getOddRoundingErrors()),s){if(o)throw new R;$t.increment(this.getEvenCounts(),this.getOddRoundingErrors())}o&&$t.decrement(this.getEvenCounts(),this.getEvenRoundingErrors())}}$t.SYMBOL_WIDEST=[7,5,4,3,1],$t.EVEN_TOTAL_SUBSET=[4,20,52,104,204],$t.GSUM=[0,348,1388,2948,3988],$t.FINDER_PATTERNS=[Int32Array.from([1,8,4,1]),Int32Array.from([3,6,4,1]),Int32Array.from([3,4,6,1]),Int32Array.from([3,2,8,1]),Int32Array.from([2,6,5,1]),Int32Array.from([2,2,9,1])],$t.WEIGHTS=[[1,3,9,27,81,32,96,77],[20,60,180,118,143,7,21,63],[189,145,13,39,117,140,209,205],[193,157,49,147,19,57,171,91],[62,186,136,197,169,85,44,132],[185,133,188,142,4,12,36,108],[113,128,173,97,80,29,87,50],[150,28,84,41,123,158,52,156],[46,138,203,187,139,206,196,166],[76,17,51,153,37,111,122,155],[43,129,176,106,107,110,119,146],[16,48,144,10,30,90,59,177],[109,116,137,200,178,112,125,164],[70,210,208,202,184,130,179,115],[134,191,151,31,93,68,204,190],[148,22,66,198,172,94,71,2],[6,18,54,162,64,192,154,40],[120,149,25,75,14,42,126,167],[79,26,78,23,69,207,199,175],[103,98,83,38,114,131,182,124],[161,61,183,127,170,88,53,159],[55,165,73,8,24,72,5,15],[45,135,194,160,58,174,100,89]],$t.FINDER_PAT_A=0,$t.FINDER_PAT_B=1,$t.FINDER_PAT_C=2,$t.FINDER_PAT_D=3,$t.FINDER_PAT_E=4,$t.FINDER_PAT_F=5,$t.FINDER_PATTERN_SEQUENCES=[[$t.FINDER_PAT_A,$t.FINDER_PAT_A],[$t.FINDER_PAT_A,$t.FINDER_PAT_B,$t.FINDER_PAT_B],[$t.FINDER_PAT_A,$t.FINDER_PAT_C,$t.FINDER_PAT_B,$t.FINDER_PAT_D],[$t.FINDER_PAT_A,$t.FINDER_PAT_E,$t.FINDER_PAT_B,$t.FINDER_PAT_D,$t.FINDER_PAT_C],[$t.FINDER_PAT_A,$t.FINDER_PAT_E,$t.FINDER_PAT_B,$t.FINDER_PAT_D,$t.FINDER_PAT_D,$t.FINDER_PAT_F],[$t.FINDER_PAT_A,$t.FINDER_PAT_E,$t.FINDER_PAT_B,$t.FINDER_PAT_D,$t.FINDER_PAT_E,$t.FINDER_PAT_F,$t.FINDER_PAT_F],[$t.FINDER_PAT_A,$t.FINDER_PAT_A,$t.FINDER_PAT_B,$t.FINDER_PAT_B,$t.FINDER_PAT_C,$t.FINDER_PAT_C,$t.FINDER_PAT_D,$t.FINDER_PAT_D],[$t.FINDER_PAT_A,$t.FINDER_PAT_A,$t.FINDER_PAT_B,$t.FINDER_PAT_B,$t.FINDER_PAT_C,$t.FINDER_PAT_C,$t.FINDER_PAT_D,$t.FINDER_PAT_E,$t.FINDER_PAT_E],[$t.FINDER_PAT_A,$t.FINDER_PAT_A,$t.FINDER_PAT_B,$t.FINDER_PAT_B,$t.FINDER_PAT_C,$t.FINDER_PAT_C,$t.FINDER_PAT_D,$t.FINDER_PAT_E,$t.FINDER_PAT_F,$t.FINDER_PAT_F],[$t.FINDER_PAT_A,$t.FINDER_PAT_A,$t.FINDER_PAT_B,$t.FINDER_PAT_B,$t.FINDER_PAT_C,$t.FINDER_PAT_D,$t.FINDER_PAT_D,$t.FINDER_PAT_E,$t.FINDER_PAT_E,$t.FINDER_PAT_F,$t.FINDER_PAT_F]],$t.MAX_PAIRS=11;class te extends Dt{constructor(t,e,r){super(t,e),this.count=0,this.finderPattern=r}getFinderPattern(){return this.finderPattern}getCount(){return this.count}incrementCount(){this.count++}}class ee extends yt{constructor(){super(...arguments),this.possibleLeftPairs=[],this.possibleRightPairs=[]}decodeRow(t,e,r){const n=this.decodePair(e,!1,t,r);ee.addOrTally(this.possibleLeftPairs,n),e.reverse();let i=this.decodePair(e,!0,t,r);ee.addOrTally(this.possibleRightPairs,i),e.reverse();for(let t of this.possibleLeftPairs)if(t.getCount()>1)for(let e of this.possibleRightPairs)if(e.getCount()>1&&ee.checkChecksum(t,e))return ee.constructResult(t,e);throw new R}static addOrTally(t,e){if(null==e)return;let r=!1;for(let n of t)if(n.getValue()===e.getValue()){n.incrementCount(),r=!0;break}r||t.push(e)}reset(){this.possibleLeftPairs.length=0,this.possibleRightPairs.length=0}static constructResult(t,e){let r=4537077*t.getValue()+e.getValue(),n=new String(r).toString(),i=new p;for(let t=13-n.length;t>0;t--)i.append("0");i.append(n);let s=0;for(let t=0;t<13;t++){let e=i.charAt(t).charCodeAt(0)-"0".charCodeAt(0);s+=0==(1&t)?3*e:e}s=10-s%10,10===s&&(s=0),i.append(s.toString());let o=t.getFinderPattern().getResultPoints(),a=e.getFinderPattern().getResultPoints();return new F(i.toString(),null,0,[o[0],o[1],a[0],a[1]],k.RSS_14,(new Date).getTime())}static checkChecksum(t,e){let r=(t.getChecksumPortion()+16*e.getChecksumPortion())%79,n=9*t.getFinderPattern().getValue()+e.getFinderPattern().getValue();return n>72&&n--,n>8&&n--,r===n}decodePair(t,e,r,n){try{let i=this.findFinderPattern(t,e),s=this.parseFoundFinderPattern(t,r,e,i),o=null==n?null:n.get(C.NEED_RESULT_POINT_CALLBACK);if(null!=o){let n=(i[0]+i[1])/2;e&&(n=t.getSize()-1-n),o.foundPossibleResultPoint(new rt(n,r))}let a=this.decodeDataCharacter(t,s,!0),l=this.decodeDataCharacter(t,s,!1);return new te(1597*a.getValue()+l.getValue(),a.getChecksumPortion()+4*l.getChecksumPortion(),s)}catch(t){return null}}decodeDataCharacter(t,e,r){let n=this.getDataCharacterCounters();for(let t=0;t<n.length;t++)n[t]=0;if(r)gt.recordPatternInReverse(t,e.getStartEnd()[0],n);else{gt.recordPattern(t,e.getStartEnd()[1]+1,n);for(let t=0,e=n.length-1;t<e;t++,e--){let r=n[t];n[t]=n[e],n[e]=r}}let i=r?16:15,s=tt.sum(new Int32Array(n))/i,o=this.getOddCounts(),a=this.getEvenCounts(),l=this.getOddRoundingErrors(),h=this.getEvenRoundingErrors();for(let t=0;t<n.length;t++){let e=n[t]/s,r=Math.floor(e+.5);r<1?r=1:r>8&&(r=8);let i=Math.floor(t/2);0==(1&t)?(o[i]=r,l[i]=e-r):(a[i]=r,h[i]=e-r)}this.adjustOddEvenCounts(r,i);let c=0,u=0;for(let t=o.length-1;t>=0;t--)u*=9,u+=o[t],c+=o[t];let d=0,g=0;for(let t=a.length-1;t>=0;t--)d*=9,d+=a[t],g+=a[t];let f=u+3*d;if(r){if(0!=(1&c)||c>12||c<4)throw new R;let t=(12-c)/2,e=ee.OUTSIDE_ODD_WIDEST[t],r=9-e,n=Mt.getRSSvalue(o,e,!1),i=Mt.getRSSvalue(a,r,!0),s=ee.OUTSIDE_EVEN_TOTAL_SUBSET[t],l=ee.OUTSIDE_GSUM[t];return new Dt(n*s+i+l,f)}{if(0!=(1&g)||g>10||g<4)throw new R;let t=(10-g)/2,e=ee.INSIDE_ODD_WIDEST[t],r=9-e,n=Mt.getRSSvalue(o,e,!0),i=Mt.getRSSvalue(a,r,!1),s=ee.INSIDE_ODD_TOTAL_SUBSET[t],l=ee.INSIDE_GSUM[t];return new Dt(i*s+n+l,f)}}findFinderPattern(t,e){let r=this.getDecodeFinderCounters();r[0]=0,r[1]=0,r[2]=0,r[3]=0;let n=t.getSize(),i=!1,s=0;for(;s<n&&(i=!t.get(s),e!==i);)s++;let o=0,a=s;for(let e=s;e<n;e++)if(t.get(e)!==i)r[o]++;else{if(3===o){if(yt.isFinderPattern(r))return[a,e];a+=r[0]+r[1],r[0]=r[2],r[1]=r[3],r[2]=0,r[3]=0,o--}else o++;r[o]=1,i=!i}throw new R}parseFoundFinderPattern(t,e,r,n){let i=t.get(n[0]),s=n[0]-1;for(;s>=0&&i!==t.get(s);)s--;s++;const o=n[0]-s,a=this.getDecodeFinderCounters(),l=new Int32Array(a.length);c.arraycopy(a,0,l,1,a.length-1),l[0]=o;const h=this.parseFinderValue(l,ee.FINDER_PATTERNS);let u=s,d=n[1];return r&&(u=t.getSize()-1-u,d=t.getSize()-1-d),new Ot(h,[s,n[1]],u,d,e)}adjustOddEvenCounts(t,e){let r=tt.sum(new Int32Array(this.getOddCounts())),n=tt.sum(new Int32Array(this.getEvenCounts())),i=!1,s=!1,o=!1,a=!1;t?(r>12?s=!0:r<4&&(i=!0),n>12?a=!0:n<4&&(o=!0)):(r>11?s=!0:r<5&&(i=!0),n>10?a=!0:n<4&&(o=!0));let l=r+n-e,h=(1&r)==(t?1:0),c=1==(1&n);if(1===l)if(h){if(c)throw new R;s=!0}else{if(!c)throw new R;a=!0}else if(-1===l)if(h){if(c)throw new R;i=!0}else{if(!c)throw new R;o=!0}else{if(0!==l)throw new R;if(h){if(!c)throw new R;r<n?(i=!0,a=!0):(s=!0,o=!0)}else if(c)throw new R}if(i){if(s)throw new R;yt.increment(this.getOddCounts(),this.getOddRoundingErrors())}if(s&&yt.decrement(this.getOddCounts(),this.getOddRoundingErrors()),o){if(a)throw new R;yt.increment(this.getEvenCounts(),this.getOddRoundingErrors())}a&&yt.decrement(this.getEvenCounts(),this.getEvenRoundingErrors())}}ee.OUTSIDE_EVEN_TOTAL_SUBSET=[1,10,34,70,126],ee.INSIDE_ODD_TOTAL_SUBSET=[4,20,48,81],ee.OUTSIDE_GSUM=[0,161,961,2015,2715],ee.INSIDE_GSUM=[0,336,1036,1516],ee.OUTSIDE_ODD_WIDEST=[8,6,4,3,1],ee.INSIDE_ODD_WIDEST=[2,4,6,8],ee.FINDER_PATTERNS=[Int32Array.from([3,8,2,1]),Int32Array.from([3,5,5,1]),Int32Array.from([3,3,7,1]),Int32Array.from([3,1,9,1]),Int32Array.from([2,7,4,1]),Int32Array.from([2,5,6,1]),Int32Array.from([2,3,8,1]),Int32Array.from([1,5,7,1]),Int32Array.from([1,3,9,1])];class re extends gt{constructor(t){super(),this.readers=[];const e=t?t.get(C.POSSIBLE_FORMATS):null,r=t&&void 0!==t.get(C.ASSUME_CODE_39_CHECK_DIGIT);e&&((e.includes(k.EAN_13)||e.includes(k.UPC_A)||e.includes(k.EAN_8)||e.includes(k.UPC_E))&&this.readers.push(new Nt(t)),e.includes(k.CODE_39)&&this.readers.push(new wt(r)),e.includes(k.CODE_128)&&this.readers.push(new ft),e.includes(k.ITF)&&this.readers.push(new At),e.includes(k.RSS_14)&&this.readers.push(new ee),e.includes(k.RSS_EXPANDED)&&(console.warn("RSS Expanded reader IS NOT ready for production yet! use at your own risk."),this.readers.push(new $t))),0===this.readers.length&&(this.readers.push(new Nt(t)),this.readers.push(new wt),this.readers.push(new Nt(t)),this.readers.push(new ft),this.readers.push(new At),this.readers.push(new ee))}decodeRow(t,e,r){for(let n=0;n<this.readers.length;n++)try{return this.readers[n].decodeRow(t,e,r)}catch(t){}throw new R}reset(){this.readers.forEach((t=>t.reset()))}}class ne{constructor(t,e,r){this.ecCodewords=t,this.ecBlocks=[e],r&&this.ecBlocks.push(r)}getECCodewords(){return this.ecCodewords}getECBlocks(){return this.ecBlocks}}class ie{constructor(t,e){this.count=t,this.dataCodewords=e}getCount(){return this.count}getDataCodewords(){return this.dataCodewords}}class se{constructor(t,e,r,n,i,s){this.versionNumber=t,this.symbolSizeRows=e,this.symbolSizeColumns=r,this.dataRegionSizeRows=n,this.dataRegionSizeColumns=i,this.ecBlocks=s;let o=0;const a=s.getECCodewords(),l=s.getECBlocks();for(let t of l)o+=t.getCount()*(t.getDataCodewords()+a);this.totalCodewords=o}getVersionNumber(){return this.versionNumber}getSymbolSizeRows(){return this.symbolSizeRows}getSymbolSizeColumns(){return this.symbolSizeColumns}getDataRegionSizeRows(){return this.dataRegionSizeRows}getDataRegionSizeColumns(){return this.dataRegionSizeColumns}getTotalCodewords(){return this.totalCodewords}getECBlocks(){return this.ecBlocks}static getVersionForDimensions(t,e){if(0!=(1&t)||0!=(1&e))throw new E;for(let r of se.VERSIONS)if(r.symbolSizeRows===t&&r.symbolSizeColumns===e)return r;throw new E}toString(){return""+this.versionNumber}static buildVersions(){return[new se(1,10,10,8,8,new ne(5,new ie(1,3))),new se(2,12,12,10,10,new ne(7,new ie(1,5))),new se(3,14,14,12,12,new ne(10,new ie(1,8))),new se(4,16,16,14,14,new ne(12,new ie(1,12))),new se(5,18,18,16,16,new ne(14,new ie(1,18))),new se(6,20,20,18,18,new ne(18,new ie(1,22))),new se(7,22,22,20,20,new ne(20,new ie(1,30))),new se(8,24,24,22,22,new ne(24,new ie(1,36))),new se(9,26,26,24,24,new ne(28,new ie(1,44))),new se(10,32,32,14,14,new ne(36,new ie(1,62))),new se(11,36,36,16,16,new ne(42,new ie(1,86))),new se(12,40,40,18,18,new ne(48,new ie(1,114))),new se(13,44,44,20,20,new ne(56,new ie(1,144))),new se(14,48,48,22,22,new ne(68,new ie(1,174))),new se(15,52,52,24,24,new ne(42,new ie(2,102))),new se(16,64,64,14,14,new ne(56,new ie(2,140))),new se(17,72,72,16,16,new ne(36,new ie(4,92))),new se(18,80,80,18,18,new ne(48,new ie(4,114))),new se(19,88,88,20,20,new ne(56,new ie(4,144))),new se(20,96,96,22,22,new ne(68,new ie(4,174))),new se(21,104,104,24,24,new ne(56,new ie(6,136))),new se(22,120,120,18,18,new ne(68,new ie(6,175))),new se(23,132,132,20,20,new ne(62,new ie(8,163))),new se(24,144,144,22,22,new ne(62,new ie(8,156),new ie(2,155))),new se(25,8,18,6,16,new ne(7,new ie(1,5))),new se(26,8,32,6,14,new ne(11,new ie(1,10))),new se(27,12,26,10,24,new ne(14,new ie(1,16))),new se(28,12,36,10,16,new ne(18,new ie(1,22))),new se(29,16,36,14,16,new ne(24,new ie(1,32))),new se(30,16,48,14,22,new ne(28,new ie(1,49)))]}}se.VERSIONS=se.buildVersions();class oe{constructor(t){const e=t.getHeight();if(e<8||e>144||0!=(1&e))throw new E;this.version=oe.readVersion(t),this.mappingBitMatrix=this.extractDataRegion(t),this.readMappingMatrix=new T(this.mappingBitMatrix.getWidth(),this.mappingBitMatrix.getHeight())}getVersion(){return this.version}static readVersion(t){const e=t.getHeight(),r=t.getWidth();return se.getVersionForDimensions(e,r)}readCodewords(){const t=new Int8Array(this.version.getTotalCodewords());let e=0,r=4,n=0;const i=this.mappingBitMatrix.getHeight(),s=this.mappingBitMatrix.getWidth();let o=!1,a=!1,l=!1,h=!1;do{if(r!==i||0!==n||o)if(r!==i-2||0!==n||0==(3&s)||a)if(r!==i+4||2!==n||0!=(7&s)||l)if(r!==i-2||0!==n||4!=(7&s)||h){do{r<i&&n>=0&&!this.readMappingMatrix.get(n,r)&&(t[e++]=255&this.readUtah(r,n,i,s)),r-=2,n+=2}while(r>=0&&n<s);r+=1,n+=3;do{r>=0&&n<s&&!this.readMappingMatrix.get(n,r)&&(t[e++]=255&this.readUtah(r,n,i,s)),r+=2,n-=2}while(r<i&&n>=0);r+=3,n+=1}else t[e++]=255&this.readCorner4(i,s),r-=2,n+=2,h=!0;else t[e++]=255&this.readCorner3(i,s),r-=2,n+=2,l=!0;else t[e++]=255&this.readCorner2(i,s),r-=2,n+=2,a=!0;else t[e++]=255&this.readCorner1(i,s),r-=2,n+=2,o=!0}while(r<i||n<s);if(e!==this.version.getTotalCodewords())throw new E;return t}readModule(t,e,r,n){return t<0&&(t+=r,e+=4-(r+4&7)),e<0&&(e+=n,t+=4-(n+4&7)),this.readMappingMatrix.set(e,t),this.mappingBitMatrix.get(e,t)}readUtah(t,e,r,n){let i=0;return this.readModule(t-2,e-2,r,n)&&(i|=1),i<<=1,this.readModule(t-2,e-1,r,n)&&(i|=1),i<<=1,this.readModule(t-1,e-2,r,n)&&(i|=1),i<<=1,this.readModule(t-1,e-1,r,n)&&(i|=1),i<<=1,this.readModule(t-1,e,r,n)&&(i|=1),i<<=1,this.readModule(t,e-2,r,n)&&(i|=1),i<<=1,this.readModule(t,e-1,r,n)&&(i|=1),i<<=1,this.readModule(t,e,r,n)&&(i|=1),i}readCorner1(t,e){let r=0;return this.readModule(t-1,0,t,e)&&(r|=1),r<<=1,this.readModule(t-1,1,t,e)&&(r|=1),r<<=1,this.readModule(t-1,2,t,e)&&(r|=1),r<<=1,this.readModule(0,e-2,t,e)&&(r|=1),r<<=1,this.readModule(0,e-1,t,e)&&(r|=1),r<<=1,this.readModule(1,e-1,t,e)&&(r|=1),r<<=1,this.readModule(2,e-1,t,e)&&(r|=1),r<<=1,this.readModule(3,e-1,t,e)&&(r|=1),r}readCorner2(t,e){let r=0;return this.readModule(t-3,0,t,e)&&(r|=1),r<<=1,this.readModule(t-2,0,t,e)&&(r|=1),r<<=1,this.readModule(t-1,0,t,e)&&(r|=1),r<<=1,this.readModule(0,e-4,t,e)&&(r|=1),r<<=1,this.readModule(0,e-3,t,e)&&(r|=1),r<<=1,this.readModule(0,e-2,t,e)&&(r|=1),r<<=1,this.readModule(0,e-1,t,e)&&(r|=1),r<<=1,this.readModule(1,e-1,t,e)&&(r|=1),r}readCorner3(t,e){let r=0;return this.readModule(t-1,0,t,e)&&(r|=1),r<<=1,this.readModule(t-1,e-1,t,e)&&(r|=1),r<<=1,this.readModule(0,e-3,t,e)&&(r|=1),r<<=1,this.readModule(0,e-2,t,e)&&(r|=1),r<<=1,this.readModule(0,e-1,t,e)&&(r|=1),r<<=1,this.readModule(1,e-3,t,e)&&(r|=1),r<<=1,this.readModule(1,e-2,t,e)&&(r|=1),r<<=1,this.readModule(1,e-1,t,e)&&(r|=1),r}readCorner4(t,e){let r=0;return this.readModule(t-3,0,t,e)&&(r|=1),r<<=1,this.readModule(t-2,0,t,e)&&(r|=1),r<<=1,this.readModule(t-1,0,t,e)&&(r|=1),r<<=1,this.readModule(0,e-2,t,e)&&(r|=1),r<<=1,this.readModule(0,e-1,t,e)&&(r|=1),r<<=1,this.readModule(1,e-1,t,e)&&(r|=1),r<<=1,this.readModule(2,e-1,t,e)&&(r|=1),r<<=1,this.readModule(3,e-1,t,e)&&(r|=1),r}extractDataRegion(t){const e=this.version.getSymbolSizeRows(),r=this.version.getSymbolSizeColumns();if(t.getHeight()!==e)throw new o("Dimension of bitMatrix must match the version size");const n=this.version.getDataRegionSizeRows(),i=this.version.getDataRegionSizeColumns(),s=e/n|0,a=r/i|0,l=new T(a*i,s*n);for(let e=0;e<s;++e){const r=e*n;for(let s=0;s<a;++s){const o=s*i;for(let a=0;a<n;++a){const h=e*(n+2)+1+a,c=r+a;for(let e=0;e<i;++e){const r=s*(i+2)+1+e;if(t.get(r,h)){const t=o+e;l.set(t,c)}}}}}return l}}class ae{constructor(t,e){this.numDataCodewords=t,this.codewords=e}static getDataBlocks(t,e){const r=e.getECBlocks();let n=0;const i=r.getECBlocks();for(let t of i)n+=t.getCount();const s=new Array(n);let a=0;for(let t of i)for(let e=0;e<t.getCount();e++){const e=t.getDataCodewords(),n=r.getECCodewords()+e;s[a++]=new ae(e,new Uint8Array(n))}const l=s[0].codewords.length-r.getECCodewords(),h=l-1;let c=0;for(let e=0;e<h;e++)for(let r=0;r<a;r++)s[r].codewords[e]=t[c++];const u=24===e.getVersionNumber(),d=u?8:a;for(let e=0;e<d;e++)s[e].codewords[l-1]=t[c++];const g=s[0].codewords.length;for(let e=l;e<g;e++)for(let r=0;r<a;r++){const n=u?(r+8)%a:r,i=u&&n>7?e-1:e;s[n].codewords[i]=t[c++]}if(c!==t.length)throw new o;return s}getNumDataCodewords(){return this.numDataCodewords}getCodewords(){return this.codewords}}class le{constructor(t){this.bytes=t,this.byteOffset=0,this.bitOffset=0}getBitOffset(){return this.bitOffset}getByteOffset(){return this.byteOffset}readBits(t){if(t<1||t>32||t>this.available())throw new o(""+t);let e=0,r=this.bitOffset,n=this.byteOffset;const i=this.bytes;if(r>0){const s=8-r,o=t<s?t:s,a=s-o,l=255>>8-o<<a;e=(i[n]&l)>>a,t-=o,r+=o,8===r&&(r=0,n++)}if(t>0){for(;t>=8;)e=e<<8|255&i[n],n++,t-=8;if(t>0){const s=8-t,o=255>>s<<s;e=e<<t|(i[n]&o)>>s,r+=t}}return this.bitOffset=r,this.byteOffset=n,e}available(){return 8*(this.bytes.length-this.byteOffset)-this.bitOffset}}!function(t){t[t.PAD_ENCODE=0]="PAD_ENCODE",t[t.ASCII_ENCODE=1]="ASCII_ENCODE",t[t.C40_ENCODE=2]="C40_ENCODE",t[t.TEXT_ENCODE=3]="TEXT_ENCODE",t[t.ANSIX12_ENCODE=4]="ANSIX12_ENCODE",t[t.EDIFACT_ENCODE=5]="EDIFACT_ENCODE",t[t.BASE256_ENCODE=6]="BASE256_ENCODE"}(V||(V={}));class he{static decode(t){const e=new le(t),r=new p,n=new p,i=new Array;let s=V.ASCII_ENCODE;do{if(s===V.ASCII_ENCODE)s=this.decodeAsciiSegment(e,r,n);else{switch(s){case V.C40_ENCODE:this.decodeC40Segment(e,r);break;case V.TEXT_ENCODE:this.decodeTextSegment(e,r);break;case V.ANSIX12_ENCODE:this.decodeAnsiX12Segment(e,r);break;case V.EDIFACT_ENCODE:this.decodeEdifactSegment(e,r);break;case V.BASE256_ENCODE:this.decodeBase256Segment(e,r,i);break;default:throw new E}s=V.ASCII_ENCODE}}while(s!==V.PAD_ENCODE&&e.available()>0);return n.length()>0&&r.append(n.toString()),new z(t,r.toString(),0===i.length?null:i,null)}static decodeAsciiSegment(t,e,r){let n=!1;do{let i=t.readBits(8);if(0===i)throw new E;if(i<=128)return n&&(i+=128),e.append(String.fromCharCode(i-1)),V.ASCII_ENCODE;if(129===i)return V.PAD_ENCODE;if(i<=229){const t=i-130;t<10&&e.append("0"),e.append(""+t)}else switch(i){case 230:return V.C40_ENCODE;case 231:return V.BASE256_ENCODE;case 232:e.append(String.fromCharCode(29));break;case 233:case 234:case 241:break;case 235:n=!0;break;case 236:e.append("[)>05"),r.insert(0,"");break;case 237:e.append("[)>06"),r.insert(0,"");break;case 238:return V.ANSIX12_ENCODE;case 239:return V.TEXT_ENCODE;case 240:return V.EDIFACT_ENCODE;default:if(254!==i||0!==t.available())throw new E}}while(t.available()>0);return V.ASCII_ENCODE}static decodeC40Segment(t,e){let r=!1;const n=[];let i=0;do{if(8===t.available())return;const s=t.readBits(8);if(254===s)return;this.parseTwoBytes(s,t.readBits(8),n);for(let t=0;t<3;t++){const s=n[t];switch(i){case 0:if(s<3)i=s+1;else{if(!(s<this.C40_BASIC_SET_CHARS.length))throw new E;{const t=this.C40_BASIC_SET_CHARS[s];r?(e.append(String.fromCharCode(t.charCodeAt(0)+128)),r=!1):e.append(t)}}break;case 1:r?(e.append(String.fromCharCode(s+128)),r=!1):e.append(String.fromCharCode(s)),i=0;break;case 2:if(s<this.C40_SHIFT2_SET_CHARS.length){const t=this.C40_SHIFT2_SET_CHARS[s];r?(e.append(String.fromCharCode(t.charCodeAt(0)+128)),r=!1):e.append(t)}else switch(s){case 27:e.append(String.fromCharCode(29));break;case 30:r=!0;break;default:throw new E}i=0;break;case 3:r?(e.append(String.fromCharCode(s+224)),r=!1):e.append(String.fromCharCode(s+96)),i=0;break;default:throw new E}}}while(t.available()>0)}static decodeTextSegment(t,e){let r=!1,n=[],i=0;do{if(8===t.available())return;const s=t.readBits(8);if(254===s)return;this.parseTwoBytes(s,t.readBits(8),n);for(let t=0;t<3;t++){const s=n[t];switch(i){case 0:if(s<3)i=s+1;else{if(!(s<this.TEXT_BASIC_SET_CHARS.length))throw new E;{const t=this.TEXT_BASIC_SET_CHARS[s];r?(e.append(String.fromCharCode(t.charCodeAt(0)+128)),r=!1):e.append(t)}}break;case 1:r?(e.append(String.fromCharCode(s+128)),r=!1):e.append(String.fromCharCode(s)),i=0;break;case 2:if(s<this.TEXT_SHIFT2_SET_CHARS.length){const t=this.TEXT_SHIFT2_SET_CHARS[s];r?(e.append(String.fromCharCode(t.charCodeAt(0)+128)),r=!1):e.append(t)}else switch(s){case 27:e.append(String.fromCharCode(29));break;case 30:r=!0;break;default:throw new E}i=0;break;case 3:if(!(s<this.TEXT_SHIFT3_SET_CHARS.length))throw new E;{const t=this.TEXT_SHIFT3_SET_CHARS[s];r?(e.append(String.fromCharCode(t.charCodeAt(0)+128)),r=!1):e.append(t),i=0}break;default:throw new E}}}while(t.available()>0)}static decodeAnsiX12Segment(t,e){const r=[];do{if(8===t.available())return;const n=t.readBits(8);if(254===n)return;this.parseTwoBytes(n,t.readBits(8),r);for(let t=0;t<3;t++){const n=r[t];switch(n){case 0:e.append("\r");break;case 1:e.append("*");break;case 2:e.append(">");break;case 3:e.append(" ");break;default:if(n<14)e.append(String.fromCharCode(n+44));else{if(!(n<40))throw new E;e.append(String.fromCharCode(n+51))}}}}while(t.available()>0)}static parseTwoBytes(t,e,r){let n=(t<<8)+e-1,i=Math.floor(n/1600);r[0]=i,n-=1600*i,i=Math.floor(n/40),r[1]=i,r[2]=n-40*i}static decodeEdifactSegment(t,e){do{if(t.available()<=16)return;for(let r=0;r<4;r++){let r=t.readBits(6);if(31===r){const e=8-t.getBitOffset();return void(8!==e&&t.readBits(e))}0==(32&r)&&(r|=64),e.append(String.fromCharCode(r))}}while(t.available()>0)}static decodeBase256Segment(t,e,r){let n=1+t.getByteOffset();const i=this.unrandomize255State(t.readBits(8),n++);let s;if(s=0===i?t.available()/8|0:i<250?i:250*(i-249)+this.unrandomize255State(t.readBits(8),n++),s<0)throw new E;const o=new Uint8Array(s);for(let e=0;e<s;e++){if(t.available()<8)throw new E;o[e]=this.unrandomize255State(t.readBits(8),n++)}r.push(o);try{e.append(I.decode(o,S.ISO88591))}catch(t){throw new j("Platform does not support required encoding: "+t.message)}}static unrandomize255State(t,e){const r=t-(149*e%255+1);return r>=0?r:r+256}}he.C40_BASIC_SET_CHARS=["*","*","*"," ","0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"],he.C40_SHIFT2_SET_CHARS=["!",'"',"#","$","%","&","'","(",")","*","+",",","-",".","/",":",";","<","=",">","?","@","[","\\","]","^","_"],he.TEXT_BASIC_SET_CHARS=["*","*","*"," ","0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"],he.TEXT_SHIFT2_SET_CHARS=he.C40_SHIFT2_SET_CHARS,he.TEXT_SHIFT3_SET_CHARS=["`","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","{","|","}","~",String.fromCharCode(127)];class ce{constructor(){this.rsDecoder=new J(q.DATA_MATRIX_FIELD_256)}decode(t){const e=new oe(t),r=e.getVersion(),n=e.readCodewords(),i=ae.getDataBlocks(n,r);let s=0;for(let t of i)s+=t.getNumDataCodewords();const o=new Uint8Array(s),a=i.length;for(let t=0;t<a;t++){const e=i[t],r=e.getCodewords(),n=e.getNumDataCodewords();this.correctErrors(r,n);for(let e=0;e<n;e++)o[e*a+t]=r[e]}return he.decode(o)}correctErrors(t,e){const r=new Int32Array(t);try{this.rsDecoder.decode(r,t.length-e)}catch(t){throw new l}for(let n=0;n<e;n++)t[n]=r[n]}}class ue{constructor(t){this.image=t,this.rectangleDetector=new st(this.image)}detect(){const t=this.rectangleDetector.detect();let e=this.detectSolid1(t);if(e=this.detectSolid2(e),e[3]=this.correctTopRight(e),!e[3])throw new R;e=this.shiftToModuleCenter(e);const r=e[0],n=e[1],i=e[2],s=e[3];let o=this.transitionsBetween(r,s)+1,a=this.transitionsBetween(i,s)+1;1==(1&o)&&(o+=1),1==(1&a)&&(a+=1),4*o<7*a&&4*a<7*o&&(o=a=Math.max(o,a));let l=ue.sampleGrid(this.image,r,n,i,s,o,a);return new nt(l,[r,n,i,s])}static shiftPoint(t,e,r){let n=(e.getX()-t.getX())/(r+1),i=(e.getY()-t.getY())/(r+1);return new rt(t.getX()+n,t.getY()+i)}static moveAway(t,e,r){let n=t.getX(),i=t.getY();return n<e?n-=1:n+=1,i<r?i-=1:i+=1,new rt(n,i)}detectSolid1(t){let e=t[0],r=t[1],n=t[3],i=t[2],s=this.transitionsBetween(e,r),o=this.transitionsBetween(r,n),a=this.transitionsBetween(n,i),l=this.transitionsBetween(i,e),h=s,c=[i,e,r,n];return h>o&&(h=o,c[0]=e,c[1]=r,c[2]=n,c[3]=i),h>a&&(h=a,c[0]=r,c[1]=n,c[2]=i,c[3]=e),h>l&&(c[0]=n,c[1]=i,c[2]=e,c[3]=r),c}detectSolid2(t){let e=t[0],r=t[1],n=t[2],i=t[3],s=this.transitionsBetween(e,i),o=ue.shiftPoint(r,n,4*(s+1)),a=ue.shiftPoint(n,r,4*(s+1));return this.transitionsBetween(o,e)<this.transitionsBetween(a,i)?(t[0]=e,t[1]=r,t[2]=n,t[3]=i):(t[0]=r,t[1]=n,t[2]=i,t[3]=e),t}correctTopRight(t){let e=t[0],r=t[1],n=t[2],i=t[3],s=this.transitionsBetween(e,i),o=this.transitionsBetween(r,i),a=ue.shiftPoint(e,r,4*(o+1)),l=ue.shiftPoint(n,r,4*(s+1));s=this.transitionsBetween(a,i),o=this.transitionsBetween(l,i);let h=new rt(i.getX()+(n.getX()-r.getX())/(s+1),i.getY()+(n.getY()-r.getY())/(s+1)),c=new rt(i.getX()+(e.getX()-r.getX())/(o+1),i.getY()+(e.getY()-r.getY())/(o+1));return this.isValid(h)?this.isValid(c)?this.transitionsBetween(a,h)+this.transitionsBetween(l,h)>this.transitionsBetween(a,c)+this.transitionsBetween(l,c)?h:c:h:this.isValid(c)?c:null}shiftToModuleCenter(t){let e=t[0],r=t[1],n=t[2],i=t[3],s=this.transitionsBetween(e,i)+1,o=this.transitionsBetween(n,i)+1,a=ue.shiftPoint(e,r,4*o),l=ue.shiftPoint(n,r,4*s);s=this.transitionsBetween(a,i)+1,o=this.transitionsBetween(l,i)+1,1==(1&s)&&(s+=1),1==(1&o)&&(o+=1);let h,c,u=(e.getX()+r.getX()+n.getX()+i.getX())/4,d=(e.getY()+r.getY()+n.getY()+i.getY())/4;return e=ue.moveAway(e,u,d),r=ue.moveAway(r,u,d),n=ue.moveAway(n,u,d),i=ue.moveAway(i,u,d),a=ue.shiftPoint(e,r,4*o),a=ue.shiftPoint(a,i,4*s),h=ue.shiftPoint(r,e,4*o),h=ue.shiftPoint(h,n,4*s),l=ue.shiftPoint(n,i,4*o),l=ue.shiftPoint(l,r,4*s),c=ue.shiftPoint(i,n,4*o),c=ue.shiftPoint(c,e,4*s),[a,h,l,c]}isValid(t){return t.getX()>=0&&t.getX()<this.image.getWidth()&&t.getY()>0&&t.getY()<this.image.getHeight()}static sampleGrid(t,e,r,n,i,s,o){return ht.getInstance().sampleGrid(t,s,o,.5,.5,s-.5,.5,s-.5,o-.5,.5,o-.5,e.getX(),e.getY(),i.getX(),i.getY(),n.getX(),n.getY(),r.getX(),r.getY())}transitionsBetween(t,e){let r=Math.trunc(t.getX()),n=Math.trunc(t.getY()),i=Math.trunc(e.getX()),s=Math.trunc(e.getY()),o=Math.abs(s-n)>Math.abs(i-r);if(o){let t=r;r=n,n=t,t=i,i=s,s=t}let a=Math.abs(i-r),l=Math.abs(s-n),h=-a/2,c=n<s?1:-1,u=r<i?1:-1,d=0,g=this.image.get(o?n:r,o?r:n);for(let t=r,e=n;t!==i;t+=u){let r=this.image.get(o?e:t,o?t:e);if(r!==g&&(d++,g=r),h+=l,h>0){if(e===s)break;e+=c,h-=a}}return d}}class de{constructor(){this.decoder=new ce}decode(t,e=null){let r,n;if(null!=e&&e.has(C.PURE_BARCODE)){const e=de.extractPureBits(t.getBlackMatrix());r=this.decoder.decode(e),n=de.NO_POINTS}else{const e=new ue(t.getBlackMatrix()).detect();r=this.decoder.decode(e.getBits()),n=e.getPoints()}const i=r.getRawBytes(),s=new F(r.getText(),i,8*i.length,n,k.DATA_MATRIX,c.currentTimeMillis()),o=r.getByteSegments();null!=o&&s.putMetadata(W.BYTE_SEGMENTS,o);const a=r.getECLevel();return null!=a&&s.putMetadata(W.ERROR_CORRECTION_LEVEL,a),s}reset(){}static extractPureBits(t){const e=t.getTopLeftOnBit(),r=t.getBottomRightOnBit();if(null==e||null==r)throw new R;const n=this.moduleSize(e,t);let i=e[1];const s=r[1];let o=e[0];const a=(r[0]-o+1)/n,l=(s-i+1)/n;if(a<=0||l<=0)throw new R;const h=n/2;i+=h,o+=h;const c=new T(a,l);for(let e=0;e<l;e++){const r=i+e*n;for(let i=0;i<a;i++)t.get(o+i*n,r)&&c.set(i,e)}return c}static moduleSize(t,e){const r=e.getWidth();let n=t[0];const i=t[1];for(;n<r&&e.get(n,i);)n++;if(n===r)throw new R;const s=n-t[0];if(0===s)throw new R;return s}}de.NO_POINTS=[];!function(t){t[t.L=0]="L",t[t.M=1]="M",t[t.Q=2]="Q",t[t.H=3]="H"}(U||(U={}));class ge{constructor(t,e,r){this.value=t,this.stringValue=e,this.bits=r,ge.FOR_BITS.set(r,this),ge.FOR_VALUE.set(t,this)}getValue(){return this.value}getBits(){return this.bits}static fromString(t){switch(t){case"L":return ge.L;case"M":return ge.M;case"Q":return ge.Q;case"H":return ge.H;default:throw new s(t+"not available")}}toString(){return this.stringValue}equals(t){if(!(t instanceof ge))return!1;const e=t;return this.value===e.value}static forBits(t){if(t<0||t>=ge.FOR_BITS.size)throw new o;return ge.FOR_BITS.get(t)}}ge.FOR_BITS=new Map,ge.FOR_VALUE=new Map,ge.L=new ge(U.L,"L",1),ge.M=new ge(U.M,"M",0),ge.Q=new ge(U.Q,"Q",3),ge.H=new ge(U.H,"H",2);class fe{constructor(t){this.errorCorrectionLevel=ge.forBits(t>>3&3),this.dataMask=7&t}static numBitsDiffering(t,e){return f.bitCount(t^e)}static decodeFormatInformation(t,e){const r=fe.doDecodeFormatInformation(t,e);return null!==r?r:fe.doDecodeFormatInformation(t^fe.FORMAT_INFO_MASK_QR,e^fe.FORMAT_INFO_MASK_QR)}static doDecodeFormatInformation(t,e){let r=Number.MAX_SAFE_INTEGER,n=0;for(const i of fe.FORMAT_INFO_DECODE_LOOKUP){const s=i[0];if(s===t||s===e)return new fe(i[1]);let o=fe.numBitsDiffering(t,s);o<r&&(n=i[1],r=o),t!==e&&(o=fe.numBitsDiffering(e,s),o<r&&(n=i[1],r=o))}return r<=3?new fe(n):null}getErrorCorrectionLevel(){return this.errorCorrectionLevel}getDataMask(){return this.dataMask}hashCode(){return this.errorCorrectionLevel.getBits()<<3|this.dataMask}equals(t){if(!(t instanceof fe))return!1;const e=t;return this.errorCorrectionLevel===e.errorCorrectionLevel&&this.dataMask===e.dataMask}}fe.FORMAT_INFO_MASK_QR=21522,fe.FORMAT_INFO_DECODE_LOOKUP=[Int32Array.from([21522,0]),Int32Array.from([20773,1]),Int32Array.from([24188,2]),Int32Array.from([23371,3]),Int32Array.from([17913,4]),Int32Array.from([16590,5]),Int32Array.from([20375,6]),Int32Array.from([19104,7]),Int32Array.from([30660,8]),Int32Array.from([29427,9]),Int32Array.from([32170,10]),Int32Array.from([30877,11]),Int32Array.from([26159,12]),Int32Array.from([25368,13]),Int32Array.from([27713,14]),Int32Array.from([26998,15]),Int32Array.from([5769,16]),Int32Array.from([5054,17]),Int32Array.from([7399,18]),Int32Array.from([6608,19]),Int32Array.from([1890,20]),Int32Array.from([597,21]),Int32Array.from([3340,22]),Int32Array.from([2107,23]),Int32Array.from([13663,24]),Int32Array.from([12392,25]),Int32Array.from([16177,26]),Int32Array.from([14854,27]),Int32Array.from([9396,28]),Int32Array.from([8579,29]),Int32Array.from([11994,30]),Int32Array.from([11245,31])];class we{constructor(t,...e){this.ecCodewordsPerBlock=t,this.ecBlocks=e}getECCodewordsPerBlock(){return this.ecCodewordsPerBlock}getNumBlocks(){let t=0;const e=this.ecBlocks;for(const r of e)t+=r.getCount();return t}getTotalECCodewords(){return this.ecCodewordsPerBlock*this.getNumBlocks()}getECBlocks(){return this.ecBlocks}}class Ae{constructor(t,e){this.count=t,this.dataCodewords=e}getCount(){return this.count}getDataCodewords(){return this.dataCodewords}}class Ce{constructor(t,e,...r){this.versionNumber=t,this.alignmentPatternCenters=e,this.ecBlocks=r;let n=0;const i=r[0].getECCodewordsPerBlock(),s=r[0].getECBlocks();for(const t of s)n+=t.getCount()*(t.getDataCodewords()+i);this.totalCodewords=n}getVersionNumber(){return this.versionNumber}getAlignmentPatternCenters(){return this.alignmentPatternCenters}getTotalCodewords(){return this.totalCodewords}getDimensionForVersion(){return 17+4*this.versionNumber}getECBlocksForLevel(t){return this.ecBlocks[t.getValue()]}static getProvisionalVersionForDimension(t){if(t%4!=1)throw new E;try{return this.getVersionForNumber((t-17)/4)}catch(t){throw new E}}static getVersionForNumber(t){if(t<1||t>40)throw new o;return Ce.VERSIONS[t-1]}static decodeVersionInformation(t){let e=Number.MAX_SAFE_INTEGER,r=0;for(let n=0;n<Ce.VERSION_DECODE_INFO.length;n++){const i=Ce.VERSION_DECODE_INFO[n];if(i===t)return Ce.getVersionForNumber(n+7);const s=fe.numBitsDiffering(t,i);s<e&&(r=n+7,e=s)}return e<=3?Ce.getVersionForNumber(r):null}buildFunctionPattern(){const t=this.getDimensionForVersion(),e=new T(t);e.setRegion(0,0,9,9),e.setRegion(t-8,0,8,9),e.setRegion(0,t-8,9,8);const r=this.alignmentPatternCenters.length;for(let t=0;t<r;t++){const n=this.alignmentPatternCenters[t]-2;for(let i=0;i<r;i++)0===t&&(0===i||i===r-1)||t===r-1&&0===i||e.setRegion(this.alignmentPatternCenters[i]-2,n,5,5)}return e.setRegion(6,9,1,t-17),e.setRegion(9,6,t-17,1),this.versionNumber>6&&(e.setRegion(t-11,0,3,6),e.setRegion(0,t-11,6,3)),e}toString(){return""+this.versionNumber}}Ce.VERSION_DECODE_INFO=Int32Array.from([31892,34236,39577,42195,48118,51042,55367,58893,63784,68472,70749,76311,79154,84390,87683,92361,96236,102084,102881,110507,110734,117786,119615,126325,127568,133589,136944,141498,145311,150283,152622,158308,161089,167017]),Ce.VERSIONS=[new Ce(1,new Int32Array(0),new we(7,new Ae(1,19)),new we(10,new Ae(1,16)),new we(13,new Ae(1,13)),new we(17,new Ae(1,9))),new Ce(2,Int32Array.from([6,18]),new we(10,new Ae(1,34)),new we(16,new Ae(1,28)),new we(22,new Ae(1,22)),new we(28,new Ae(1,16))),new Ce(3,Int32Array.from([6,22]),new we(15,new Ae(1,55)),new we(26,new Ae(1,44)),new we(18,new Ae(2,17)),new we(22,new Ae(2,13))),new Ce(4,Int32Array.from([6,26]),new we(20,new Ae(1,80)),new we(18,new Ae(2,32)),new we(26,new Ae(2,24)),new we(16,new Ae(4,9))),new Ce(5,Int32Array.from([6,30]),new we(26,new Ae(1,108)),new we(24,new Ae(2,43)),new we(18,new Ae(2,15),new Ae(2,16)),new we(22,new Ae(2,11),new Ae(2,12))),new Ce(6,Int32Array.from([6,34]),new we(18,new Ae(2,68)),new we(16,new Ae(4,27)),new we(24,new Ae(4,19)),new we(28,new Ae(4,15))),new Ce(7,Int32Array.from([6,22,38]),new we(20,new Ae(2,78)),new we(18,new Ae(4,31)),new we(18,new Ae(2,14),new Ae(4,15)),new we(26,new Ae(4,13),new Ae(1,14))),new Ce(8,Int32Array.from([6,24,42]),new we(24,new Ae(2,97)),new we(22,new Ae(2,38),new Ae(2,39)),new we(22,new Ae(4,18),new Ae(2,19)),new we(26,new Ae(4,14),new Ae(2,15))),new Ce(9,Int32Array.from([6,26,46]),new we(30,new Ae(2,116)),new we(22,new Ae(3,36),new Ae(2,37)),new we(20,new Ae(4,16),new Ae(4,17)),new we(24,new Ae(4,12),new Ae(4,13))),new Ce(10,Int32Array.from([6,28,50]),new we(18,new Ae(2,68),new Ae(2,69)),new we(26,new Ae(4,43),new Ae(1,44)),new we(24,new Ae(6,19),new Ae(2,20)),new we(28,new Ae(6,15),new Ae(2,16))),new Ce(11,Int32Array.from([6,30,54]),new we(20,new Ae(4,81)),new we(30,new Ae(1,50),new Ae(4,51)),new we(28,new Ae(4,22),new Ae(4,23)),new we(24,new Ae(3,12),new Ae(8,13))),new Ce(12,Int32Array.from([6,32,58]),new we(24,new Ae(2,92),new Ae(2,93)),new we(22,new Ae(6,36),new Ae(2,37)),new we(26,new Ae(4,20),new Ae(6,21)),new we(28,new Ae(7,14),new Ae(4,15))),new Ce(13,Int32Array.from([6,34,62]),new we(26,new Ae(4,107)),new we(22,new Ae(8,37),new Ae(1,38)),new we(24,new Ae(8,20),new Ae(4,21)),new we(22,new Ae(12,11),new Ae(4,12))),new Ce(14,Int32Array.from([6,26,46,66]),new we(30,new Ae(3,115),new Ae(1,116)),new we(24,new Ae(4,40),new Ae(5,41)),new we(20,new Ae(11,16),new Ae(5,17)),new we(24,new Ae(11,12),new Ae(5,13))),new Ce(15,Int32Array.from([6,26,48,70]),new we(22,new Ae(5,87),new Ae(1,88)),new we(24,new Ae(5,41),new Ae(5,42)),new we(30,new Ae(5,24),new Ae(7,25)),new we(24,new Ae(11,12),new Ae(7,13))),new Ce(16,Int32Array.from([6,26,50,74]),new we(24,new Ae(5,98),new Ae(1,99)),new we(28,new Ae(7,45),new Ae(3,46)),new we(24,new Ae(15,19),new Ae(2,20)),new we(30,new Ae(3,15),new Ae(13,16))),new Ce(17,Int32Array.from([6,30,54,78]),new we(28,new Ae(1,107),new Ae(5,108)),new we(28,new Ae(10,46),new Ae(1,47)),new we(28,new Ae(1,22),new Ae(15,23)),new we(28,new Ae(2,14),new Ae(17,15))),new Ce(18,Int32Array.from([6,30,56,82]),new we(30,new Ae(5,120),new Ae(1,121)),new we(26,new Ae(9,43),new Ae(4,44)),new we(28,new Ae(17,22),new Ae(1,23)),new we(28,new Ae(2,14),new Ae(19,15))),new Ce(19,Int32Array.from([6,30,58,86]),new we(28,new Ae(3,113),new Ae(4,114)),new we(26,new Ae(3,44),new Ae(11,45)),new we(26,new Ae(17,21),new Ae(4,22)),new we(26,new Ae(9,13),new Ae(16,14))),new Ce(20,Int32Array.from([6,34,62,90]),new we(28,new Ae(3,107),new Ae(5,108)),new we(26,new Ae(3,41),new Ae(13,42)),new we(30,new Ae(15,24),new Ae(5,25)),new we(28,new Ae(15,15),new Ae(10,16))),new Ce(21,Int32Array.from([6,28,50,72,94]),new we(28,new Ae(4,116),new Ae(4,117)),new we(26,new Ae(17,42)),new we(28,new Ae(17,22),new Ae(6,23)),new we(30,new Ae(19,16),new Ae(6,17))),new Ce(22,Int32Array.from([6,26,50,74,98]),new we(28,new Ae(2,111),new Ae(7,112)),new we(28,new Ae(17,46)),new we(30,new Ae(7,24),new Ae(16,25)),new we(24,new Ae(34,13))),new Ce(23,Int32Array.from([6,30,54,78,102]),new we(30,new Ae(4,121),new Ae(5,122)),new we(28,new Ae(4,47),new Ae(14,48)),new we(30,new Ae(11,24),new Ae(14,25)),new we(30,new Ae(16,15),new Ae(14,16))),new Ce(24,Int32Array.from([6,28,54,80,106]),new we(30,new Ae(6,117),new Ae(4,118)),new we(28,new Ae(6,45),new Ae(14,46)),new we(30,new Ae(11,24),new Ae(16,25)),new we(30,new Ae(30,16),new Ae(2,17))),new Ce(25,Int32Array.from([6,32,58,84,110]),new we(26,new Ae(8,106),new Ae(4,107)),new we(28,new Ae(8,47),new Ae(13,48)),new we(30,new Ae(7,24),new Ae(22,25)),new we(30,new Ae(22,15),new Ae(13,16))),new Ce(26,Int32Array.from([6,30,58,86,114]),new we(28,new Ae(10,114),new Ae(2,115)),new we(28,new Ae(19,46),new Ae(4,47)),new we(28,new Ae(28,22),new Ae(6,23)),new we(30,new Ae(33,16),new Ae(4,17))),new Ce(27,Int32Array.from([6,34,62,90,118]),new we(30,new Ae(8,122),new Ae(4,123)),new we(28,new Ae(22,45),new Ae(3,46)),new we(30,new Ae(8,23),new Ae(26,24)),new we(30,new Ae(12,15),new Ae(28,16))),new Ce(28,Int32Array.from([6,26,50,74,98,122]),new we(30,new Ae(3,117),new Ae(10,118)),new we(28,new Ae(3,45),new Ae(23,46)),new we(30,new Ae(4,24),new Ae(31,25)),new we(30,new Ae(11,15),new Ae(31,16))),new Ce(29,Int32Array.from([6,30,54,78,102,126]),new we(30,new Ae(7,116),new Ae(7,117)),new we(28,new Ae(21,45),new Ae(7,46)),new we(30,new Ae(1,23),new Ae(37,24)),new we(30,new Ae(19,15),new Ae(26,16))),new Ce(30,Int32Array.from([6,26,52,78,104,130]),new we(30,new Ae(5,115),new Ae(10,116)),new we(28,new Ae(19,47),new Ae(10,48)),new we(30,new Ae(15,24),new Ae(25,25)),new we(30,new Ae(23,15),new Ae(25,16))),new Ce(31,Int32Array.from([6,30,56,82,108,134]),new we(30,new Ae(13,115),new Ae(3,116)),new we(28,new Ae(2,46),new Ae(29,47)),new we(30,new Ae(42,24),new Ae(1,25)),new we(30,new Ae(23,15),new Ae(28,16))),new Ce(32,Int32Array.from([6,34,60,86,112,138]),new we(30,new Ae(17,115)),new we(28,new Ae(10,46),new Ae(23,47)),new we(30,new Ae(10,24),new Ae(35,25)),new we(30,new Ae(19,15),new Ae(35,16))),new Ce(33,Int32Array.from([6,30,58,86,114,142]),new we(30,new Ae(17,115),new Ae(1,116)),new we(28,new Ae(14,46),new Ae(21,47)),new we(30,new Ae(29,24),new Ae(19,25)),new we(30,new Ae(11,15),new Ae(46,16))),new Ce(34,Int32Array.from([6,34,62,90,118,146]),new we(30,new Ae(13,115),new Ae(6,116)),new we(28,new Ae(14,46),new Ae(23,47)),new we(30,new Ae(44,24),new Ae(7,25)),new we(30,new Ae(59,16),new Ae(1,17))),new Ce(35,Int32Array.from([6,30,54,78,102,126,150]),new we(30,new Ae(12,121),new Ae(7,122)),new we(28,new Ae(12,47),new Ae(26,48)),new we(30,new Ae(39,24),new Ae(14,25)),new we(30,new Ae(22,15),new Ae(41,16))),new Ce(36,Int32Array.from([6,24,50,76,102,128,154]),new we(30,new Ae(6,121),new Ae(14,122)),new we(28,new Ae(6,47),new Ae(34,48)),new we(30,new Ae(46,24),new Ae(10,25)),new we(30,new Ae(2,15),new Ae(64,16))),new Ce(37,Int32Array.from([6,28,54,80,106,132,158]),new we(30,new Ae(17,122),new Ae(4,123)),new we(28,new Ae(29,46),new Ae(14,47)),new we(30,new Ae(49,24),new Ae(10,25)),new we(30,new Ae(24,15),new Ae(46,16))),new Ce(38,Int32Array.from([6,32,58,84,110,136,162]),new we(30,new Ae(4,122),new Ae(18,123)),new we(28,new Ae(13,46),new Ae(32,47)),new we(30,new Ae(48,24),new Ae(14,25)),new we(30,new Ae(42,15),new Ae(32,16))),new Ce(39,Int32Array.from([6,26,54,82,110,138,166]),new we(30,new Ae(20,117),new Ae(4,118)),new we(28,new Ae(40,47),new Ae(7,48)),new we(30,new Ae(43,24),new Ae(22,25)),new we(30,new Ae(10,15),new Ae(67,16))),new Ce(40,Int32Array.from([6,30,58,86,114,142,170]),new we(30,new Ae(19,118),new Ae(6,119)),new we(28,new Ae(18,47),new Ae(31,48)),new we(30,new Ae(34,24),new Ae(34,25)),new we(30,new Ae(20,15),new Ae(61,16)))],function(t){t[t.DATA_MASK_000=0]="DATA_MASK_000",t[t.DATA_MASK_001=1]="DATA_MASK_001",t[t.DATA_MASK_010=2]="DATA_MASK_010",t[t.DATA_MASK_011=3]="DATA_MASK_011",t[t.DATA_MASK_100=4]="DATA_MASK_100",t[t.DATA_MASK_101=5]="DATA_MASK_101",t[t.DATA_MASK_110=6]="DATA_MASK_110",t[t.DATA_MASK_111=7]="DATA_MASK_111"}(H||(H={}));class Ee{constructor(t,e){this.value=t,this.isMasked=e}unmaskBitMatrix(t,e){for(let r=0;r<e;r++)for(let n=0;n<e;n++)this.isMasked(r,n)&&t.flip(n,r)}}Ee.values=new Map([[H.DATA_MASK_000,new Ee(H.DATA_MASK_000,((t,e)=>0==(t+e&1)))],[H.DATA_MASK_001,new Ee(H.DATA_MASK_001,((t,e)=>0==(1&t)))],[H.DATA_MASK_010,new Ee(H.DATA_MASK_010,((t,e)=>e%3==0))],[H.DATA_MASK_011,new Ee(H.DATA_MASK_011,((t,e)=>(t+e)%3==0))],[H.DATA_MASK_100,new Ee(H.DATA_MASK_100,((t,e)=>0==(Math.floor(t/2)+Math.floor(e/3)&1)))],[H.DATA_MASK_101,new Ee(H.DATA_MASK_101,((t,e)=>t*e%6==0))],[H.DATA_MASK_110,new Ee(H.DATA_MASK_110,((t,e)=>t*e%6<3))],[H.DATA_MASK_111,new Ee(H.DATA_MASK_111,((t,e)=>0==(t+e+t*e%3&1)))]]);class me{constructor(t){const e=t.getHeight();if(e<21||1!=(3&e))throw new E;this.bitMatrix=t}readFormatInformation(){if(null!==this.parsedFormatInfo&&void 0!==this.parsedFormatInfo)return this.parsedFormatInfo;let t=0;for(let e=0;e<6;e++)t=this.copyBit(e,8,t);t=this.copyBit(7,8,t),t=this.copyBit(8,8,t),t=this.copyBit(8,7,t);for(let e=5;e>=0;e--)t=this.copyBit(8,e,t);const e=this.bitMatrix.getHeight();let r=0;const n=e-7;for(let t=e-1;t>=n;t--)r=this.copyBit(8,t,r);for(let t=e-8;t<e;t++)r=this.copyBit(t,8,r);if(this.parsedFormatInfo=fe.decodeFormatInformation(t,r),null!==this.parsedFormatInfo)return this.parsedFormatInfo;throw new E}readVersion(){if(null!==this.parsedVersion&&void 0!==this.parsedVersion)return this.parsedVersion;const t=this.bitMatrix.getHeight(),e=Math.floor((t-17)/4);if(e<=6)return Ce.getVersionForNumber(e);let r=0;const n=t-11;for(let e=5;e>=0;e--)for(let i=t-9;i>=n;i--)r=this.copyBit(i,e,r);let i=Ce.decodeVersionInformation(r);if(null!==i&&i.getDimensionForVersion()===t)return this.parsedVersion=i,i;r=0;for(let e=5;e>=0;e--)for(let i=t-9;i>=n;i--)r=this.copyBit(e,i,r);if(i=Ce.decodeVersionInformation(r),null!==i&&i.getDimensionForVersion()===t)return this.parsedVersion=i,i;throw new E}copyBit(t,e,r){return(this.isMirror?this.bitMatrix.get(e,t):this.bitMatrix.get(t,e))?r<<1|1:r<<1}readCodewords(){const t=this.readFormatInformation(),e=this.readVersion(),r=Ee.values.get(t.getDataMask()),n=this.bitMatrix.getHeight();r.unmaskBitMatrix(this.bitMatrix,n);const i=e.buildFunctionPattern();let s=!0;const o=new Uint8Array(e.getTotalCodewords());let a=0,l=0,h=0;for(let t=n-1;t>0;t-=2){6===t&&t--;for(let e=0;e<n;e++){const r=s?n-1-e:e;for(let e=0;e<2;e++)i.get(t-e,r)||(h++,l<<=1,this.bitMatrix.get(t-e,r)&&(l|=1),8===h&&(o[a++]=l,h=0,l=0))}s=!s}if(a!==e.getTotalCodewords())throw new E;return o}remask(){if(null===this.parsedFormatInfo)return;const t=Ee.values[this.parsedFormatInfo.getDataMask()],e=this.bitMatrix.getHeight();t.unmaskBitMatrix(this.bitMatrix,e)}setMirror(t){this.parsedVersion=null,this.parsedFormatInfo=null,this.isMirror=t}mirror(){const t=this.bitMatrix;for(let e=0,r=t.getWidth();e<r;e++)for(let r=e+1,n=t.getHeight();r<n;r++)t.get(e,r)!==t.get(r,e)&&(t.flip(r,e),t.flip(e,r))}}class _e{constructor(t,e){this.numDataCodewords=t,this.codewords=e}static getDataBlocks(t,e,r){if(t.length!==e.getTotalCodewords())throw new o;const n=e.getECBlocksForLevel(r);let i=0;const s=n.getECBlocks();for(const t of s)i+=t.getCount();const a=new Array(i);let l=0;for(const t of s)for(let e=0;e<t.getCount();e++){const e=t.getDataCodewords(),r=n.getECCodewordsPerBlock()+e;a[l++]=new _e(e,new Uint8Array(r))}const h=a[0].codewords.length;let c=a.length-1;for(;c>=0;){if(a[c].codewords.length===h)break;c--}c++;const u=h-n.getECCodewordsPerBlock();let d=0;for(let e=0;e<u;e++)for(let r=0;r<l;r++)a[r].codewords[e]=t[d++];for(let e=c;e<l;e++)a[e].codewords[u]=t[d++];const g=a[0].codewords.length;for(let e=u;e<g;e++)for(let r=0;r<l;r++){const n=r<c?e:e+1;a[r].codewords[n]=t[d++]}return a}getNumDataCodewords(){return this.numDataCodewords}getCodewords(){return this.codewords}}!function(t){t[t.TERMINATOR=0]="TERMINATOR",t[t.NUMERIC=1]="NUMERIC",t[t.ALPHANUMERIC=2]="ALPHANUMERIC",t[t.STRUCTURED_APPEND=3]="STRUCTURED_APPEND",t[t.BYTE=4]="BYTE",t[t.ECI=5]="ECI",t[t.KANJI=6]="KANJI",t[t.FNC1_FIRST_POSITION=7]="FNC1_FIRST_POSITION",t[t.FNC1_SECOND_POSITION=8]="FNC1_SECOND_POSITION",t[t.HANZI=9]="HANZI"}(G||(G={}));class Ie{constructor(t,e,r,n){this.value=t,this.stringValue=e,this.characterCountBitsForVersions=r,this.bits=n,Ie.FOR_BITS.set(n,this),Ie.FOR_VALUE.set(t,this)}static forBits(t){const e=Ie.FOR_BITS.get(t);if(void 0===e)throw new o;return e}getCharacterCountBits(t){const e=t.getVersionNumber();let r;return r=e<=9?0:e<=26?1:2,this.characterCountBitsForVersions[r]}getValue(){return this.value}getBits(){return this.bits}equals(t){if(!(t instanceof Ie))return!1;const e=t;return this.value===e.value}toString(){return this.stringValue}}Ie.FOR_BITS=new Map,Ie.FOR_VALUE=new Map,Ie.TERMINATOR=new Ie(G.TERMINATOR,"TERMINATOR",Int32Array.from([0,0,0]),0),Ie.NUMERIC=new Ie(G.NUMERIC,"NUMERIC",Int32Array.from([10,12,14]),1),Ie.ALPHANUMERIC=new Ie(G.ALPHANUMERIC,"ALPHANUMERIC",Int32Array.from([9,11,13]),2),Ie.STRUCTURED_APPEND=new Ie(G.STRUCTURED_APPEND,"STRUCTURED_APPEND",Int32Array.from([0,0,0]),3),Ie.BYTE=new Ie(G.BYTE,"BYTE",Int32Array.from([8,16,16]),4),Ie.ECI=new Ie(G.ECI,"ECI",Int32Array.from([0,0,0]),7),Ie.KANJI=new Ie(G.KANJI,"KANJI",Int32Array.from([8,10,12]),8),Ie.FNC1_FIRST_POSITION=new Ie(G.FNC1_FIRST_POSITION,"FNC1_FIRST_POSITION",Int32Array.from([0,0,0]),5),Ie.FNC1_SECOND_POSITION=new Ie(G.FNC1_SECOND_POSITION,"FNC1_SECOND_POSITION",Int32Array.from([0,0,0]),9),Ie.HANZI=new Ie(G.HANZI,"HANZI",Int32Array.from([8,10,12]),13);class Se{static decode(t,e,r,n){const i=new le(t);let s=new p;const o=new Array;let a=-1,l=-1;try{let t,r=null,h=!1;do{if(i.available()<4)t=Ie.TERMINATOR;else{const e=i.readBits(4);t=Ie.forBits(e)}switch(t){case Ie.TERMINATOR:break;case Ie.FNC1_FIRST_POSITION:case Ie.FNC1_SECOND_POSITION:h=!0;break;case Ie.STRUCTURED_APPEND:if(i.available()<16)throw new E;a=i.readBits(8),l=i.readBits(8);break;case Ie.ECI:const c=Se.parseECIValue(i);if(r=m.getCharacterSetECIByValue(c),null===r)throw new E;break;case Ie.HANZI:const u=i.readBits(4),d=i.readBits(t.getCharacterCountBits(e));u===Se.GB2312_SUBSET&&Se.decodeHanziSegment(i,s,d);break;default:const g=i.readBits(t.getCharacterCountBits(e));switch(t){case Ie.NUMERIC:Se.decodeNumericSegment(i,s,g);break;case Ie.ALPHANUMERIC:Se.decodeAlphanumericSegment(i,s,g,h);break;case Ie.BYTE:Se.decodeByteSegment(i,s,g,r,o,n);break;case Ie.KANJI:Se.decodeKanjiSegment(i,s,g);break;default:throw new E}}}while(t!==Ie.TERMINATOR)}catch(t){throw new E}return new z(t,s.toString(),0===o.length?null:o,null===r?null:r.toString(),a,l)}static decodeHanziSegment(t,e,r){if(13*r>t.available())throw new E;const n=new Uint8Array(2*r);let i=0;for(;r>0;){const e=t.readBits(13);let s=e/96<<8&4294967295|e%96;s+=s<959?41377:42657,n[i]=s>>8&255,n[i+1]=255&s,i+=2,r--}try{e.append(I.decode(n,S.GB2312))}catch(t){throw new E(t)}}static decodeKanjiSegment(t,e,r){if(13*r>t.available())throw new E;const n=new Uint8Array(2*r);let i=0;for(;r>0;){const e=t.readBits(13);let s=e/192<<8&4294967295|e%192;s+=s<7936?33088:49472,n[i]=s>>8,n[i+1]=s,i+=2,r--}try{e.append(I.decode(n,S.SHIFT_JIS))}catch(t){throw new E(t)}}static decodeByteSegment(t,e,r,n,i,s){if(8*r>t.available())throw new E;const o=new Uint8Array(r);for(let e=0;e<r;e++)o[e]=t.readBits(8);let a;a=null===n?S.guessEncoding(o,s):n.getName();try{e.append(I.decode(o,a))}catch(t){throw new E(t)}i.push(o)}static toAlphaNumericChar(t){if(t>=Se.ALPHANUMERIC_CHARS.length)throw new E;return Se.ALPHANUMERIC_CHARS[t]}static decodeAlphanumericSegment(t,e,r,n){const i=e.length();for(;r>1;){if(t.available()<11)throw new E;const n=t.readBits(11);e.append(Se.toAlphaNumericChar(Math.floor(n/45))),e.append(Se.toAlphaNumericChar(n%45)),r-=2}if(1===r){if(t.available()<6)throw new E;e.append(Se.toAlphaNumericChar(t.readBits(6)))}if(n)for(let t=i;t<e.length();t++)"%"===e.charAt(t)&&(t<e.length()-1&&"%"===e.charAt(t+1)?e.deleteCharAt(t+1):e.setCharAt(t,String.fromCharCode(29)))}static decodeNumericSegment(t,e,r){for(;r>=3;){if(t.available()<10)throw new E;const n=t.readBits(10);if(n>=1e3)throw new E;e.append(Se.toAlphaNumericChar(Math.floor(n/100))),e.append(Se.toAlphaNumericChar(Math.floor(n/10)%10)),e.append(Se.toAlphaNumericChar(n%10)),r-=3}if(2===r){if(t.available()<7)throw new E;const r=t.readBits(7);if(r>=100)throw new E;e.append(Se.toAlphaNumericChar(Math.floor(r/10))),e.append(Se.toAlphaNumericChar(r%10))}else if(1===r){if(t.available()<4)throw new E;const r=t.readBits(4);if(r>=10)throw new E;e.append(Se.toAlphaNumericChar(r))}}static parseECIValue(t){const e=t.readBits(8);if(0==(128&e))return 127&e;if(128==(192&e)){return(63&e)<<8&4294967295|t.readBits(8)}if(192==(224&e)){return(31&e)<<16&4294967295|t.readBits(16)}throw new E}}Se.ALPHANUMERIC_CHARS="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:",Se.GB2312_SUBSET=1;class pe{constructor(t){this.mirrored=t}isMirrored(){return this.mirrored}applyMirroredCorrection(t){if(!this.mirrored||null===t||t.length<3)return;const e=t[0];t[0]=t[2],t[2]=e}}class Te{constructor(){this.rsDecoder=new J(q.QR_CODE_FIELD_256)}decodeBooleanArray(t,e){return this.decodeBitMatrix(T.parseFromBooleanArray(t),e)}decodeBitMatrix(t,e){const r=new me(t);let n=null;try{return this.decodeBitMatrixParser(r,e)}catch(t){n=t}try{r.remask(),r.setMirror(!0),r.readVersion(),r.readFormatInformation(),r.mirror();const t=this.decodeBitMatrixParser(r,e);return t.setOther(new pe(!0)),t}catch(t){if(null!==n)throw n;throw t}}decodeBitMatrixParser(t,e){const r=t.readVersion(),n=t.readFormatInformation().getErrorCorrectionLevel(),i=t.readCodewords(),s=_e.getDataBlocks(i,r,n);let o=0;for(const t of s)o+=t.getNumDataCodewords();const a=new Uint8Array(o);let l=0;for(const t of s){const e=t.getCodewords(),r=t.getNumDataCodewords();this.correctErrors(e,r);for(let t=0;t<r;t++)a[l++]=e[t]}return Se.decode(a,r,n,e)}correctErrors(t,e){const r=new Int32Array(t);try{this.rsDecoder.decode(r,t.length-e)}catch(t){throw new l}for(let n=0;n<e;n++)t[n]=r[n]}}class Re extends rt{constructor(t,e,r){super(t,e),this.estimatedModuleSize=r}aboutEquals(t,e,r){if(Math.abs(e-this.getY())<=t&&Math.abs(r-this.getX())<=t){const e=Math.abs(t-this.estimatedModuleSize);return e<=1||e<=this.estimatedModuleSize}return!1}combineEstimate(t,e,r){const n=(this.getX()+e)/2,i=(this.getY()+t)/2,s=(this.estimatedModuleSize+r)/2;return new Re(n,i,s)}}class Ne{constructor(t,e,r,n,i,s,o){this.image=t,this.startX=e,this.startY=r,this.width=n,this.height=i,this.moduleSize=s,this.resultPointCallback=o,this.possibleCenters=[],this.crossCheckStateCount=new Int32Array(3)}find(){const t=this.startX,e=this.height,r=t+this.width,n=this.startY+e/2,i=new Int32Array(3),s=this.image;for(let o=0;o<e;o++){const e=n+(0==(1&o)?Math.floor((o+1)/2):-Math.floor((o+1)/2));i[0]=0,i[1]=0,i[2]=0;let a=t;for(;a<r&&!s.get(a,e);)a++;let l=0;for(;a<r;){if(s.get(a,e))if(1===l)i[1]++;else if(2===l){if(this.foundPatternCross(i)){const t=this.handlePossibleCenter(i,e,a);if(null!==t)return t}i[0]=i[2],i[1]=1,i[2]=0,l=1}else i[++l]++;else 1===l&&l++,i[l]++;a++}if(this.foundPatternCross(i)){const t=this.handlePossibleCenter(i,e,r);if(null!==t)return t}}if(0!==this.possibleCenters.length)return this.possibleCenters[0];throw new R}static centerFromEnd(t,e){return e-t[2]-t[1]/2}foundPatternCross(t){const e=this.moduleSize,r=e/2;for(let n=0;n<3;n++)if(Math.abs(e-t[n])>=r)return!1;return!0}crossCheckVertical(t,e,r,n){const i=this.image,s=i.getHeight(),o=this.crossCheckStateCount;o[0]=0,o[1]=0,o[2]=0;let a=t;for(;a>=0&&i.get(e,a)&&o[1]<=r;)o[1]++,a--;if(a<0||o[1]>r)return NaN;for(;a>=0&&!i.get(e,a)&&o[0]<=r;)o[0]++,a--;if(o[0]>r)return NaN;for(a=t+1;a<s&&i.get(e,a)&&o[1]<=r;)o[1]++,a++;if(a===s||o[1]>r)return NaN;for(;a<s&&!i.get(e,a)&&o[2]<=r;)o[2]++,a++;if(o[2]>r)return NaN;const l=o[0]+o[1]+o[2];return 5*Math.abs(l-n)>=2*n?NaN:this.foundPatternCross(o)?Ne.centerFromEnd(o,a):NaN}handlePossibleCenter(t,e,r){const n=t[0]+t[1]+t[2],i=Ne.centerFromEnd(t,r),s=this.crossCheckVertical(e,i,2*t[1],n);if(!isNaN(s)){const e=(t[0]+t[1]+t[2])/3;for(const t of this.possibleCenters)if(t.aboutEquals(e,s,i))return t.combineEstimate(s,i,e);const r=new Re(i,s,e);this.possibleCenters.push(r),null!==this.resultPointCallback&&void 0!==this.resultPointCallback&&this.resultPointCallback.foundPossibleResultPoint(r)}return null}}class ye extends rt{constructor(t,e,r,n){super(t,e),this.estimatedModuleSize=r,this.count=n,void 0===n&&(this.count=1)}getEstimatedModuleSize(){return this.estimatedModuleSize}getCount(){return this.count}aboutEquals(t,e,r){if(Math.abs(e-this.getY())<=t&&Math.abs(r-this.getX())<=t){const e=Math.abs(t-this.estimatedModuleSize);return e<=1||e<=this.estimatedModuleSize}return!1}combineEstimate(t,e,r){const n=this.count+1,i=(this.count*this.getX()+e)/n,s=(this.count*this.getY()+t)/n,o=(this.count*this.estimatedModuleSize+r)/n;return new ye(i,s,o,n)}}class De{constructor(t){this.bottomLeft=t[0],this.topLeft=t[1],this.topRight=t[2]}getBottomLeft(){return this.bottomLeft}getTopLeft(){return this.topLeft}getTopRight(){return this.topRight}}class Oe{constructor(t,e){this.image=t,this.resultPointCallback=e,this.possibleCenters=[],this.crossCheckStateCount=new Int32Array(5),this.resultPointCallback=e}getImage(){return this.image}getPossibleCenters(){return this.possibleCenters}find(t){const e=null!=t&&void 0!==t.get(C.TRY_HARDER),r=null!=t&&void 0!==t.get(C.PURE_BARCODE),n=this.image,i=n.getHeight(),s=n.getWidth();let o=Math.floor(3*i/(4*Oe.MAX_MODULES));(o<Oe.MIN_SKIP||e)&&(o=Oe.MIN_SKIP);let a=!1;const l=new Int32Array(5);for(let t=o-1;t<i&&!a;t+=o){l[0]=0,l[1]=0,l[2]=0,l[3]=0,l[4]=0;let e=0;for(let i=0;i<s;i++)if(n.get(i,t))1==(1&e)&&e++,l[e]++;else if(0==(1&e))if(4===e)if(Oe.foundPatternCross(l)){if(!0!==this.handlePossibleCenter(l,t,i,r)){l[0]=l[2],l[1]=l[3],l[2]=l[4],l[3]=1,l[4]=0,e=3;continue}if(o=2,!0===this.hasSkipped)a=this.haveMultiplyConfirmedCenters();else{const e=this.findRowSkip();e>l[2]&&(t+=e-l[2]-o,i=s-1)}e=0,l[0]=0,l[1]=0,l[2]=0,l[3]=0,l[4]=0}else l[0]=l[2],l[1]=l[3],l[2]=l[4],l[3]=1,l[4]=0,e=3;else l[++e]++;else l[e]++;if(Oe.foundPatternCross(l)){!0===this.handlePossibleCenter(l,t,s,r)&&(o=l[0],this.hasSkipped&&(a=this.haveMultiplyConfirmedCenters()))}}const h=this.selectBestPatterns();return rt.orderBestPatterns(h),new De(h)}static centerFromEnd(t,e){return e-t[4]-t[3]-t[2]/2}static foundPatternCross(t){let e=0;for(let r=0;r<5;r++){const n=t[r];if(0===n)return!1;e+=n}if(e<7)return!1;const r=e/7,n=r/2;return Math.abs(r-t[0])<n&&Math.abs(r-t[1])<n&&Math.abs(3*r-t[2])<3*n&&Math.abs(r-t[3])<n&&Math.abs(r-t[4])<n}getCrossCheckStateCount(){const t=this.crossCheckStateCount;return t[0]=0,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t}crossCheckDiagonal(t,e,r,n){const i=this.getCrossCheckStateCount();let s=0;const o=this.image;for(;t>=s&&e>=s&&o.get(e-s,t-s);)i[2]++,s++;if(t<s||e<s)return!1;for(;t>=s&&e>=s&&!o.get(e-s,t-s)&&i[1]<=r;)i[1]++,s++;if(t<s||e<s||i[1]>r)return!1;for(;t>=s&&e>=s&&o.get(e-s,t-s)&&i[0]<=r;)i[0]++,s++;if(i[0]>r)return!1;const a=o.getHeight(),l=o.getWidth();for(s=1;t+s<a&&e+s<l&&o.get(e+s,t+s);)i[2]++,s++;if(t+s>=a||e+s>=l)return!1;for(;t+s<a&&e+s<l&&!o.get(e+s,t+s)&&i[3]<r;)i[3]++,s++;if(t+s>=a||e+s>=l||i[3]>=r)return!1;for(;t+s<a&&e+s<l&&o.get(e+s,t+s)&&i[4]<r;)i[4]++,s++;if(i[4]>=r)return!1;const h=i[0]+i[1]+i[2]+i[3]+i[4];return Math.abs(h-n)<2*n&&Oe.foundPatternCross(i)}crossCheckVertical(t,e,r,n){const i=this.image,s=i.getHeight(),o=this.getCrossCheckStateCount();let a=t;for(;a>=0&&i.get(e,a);)o[2]++,a--;if(a<0)return NaN;for(;a>=0&&!i.get(e,a)&&o[1]<=r;)o[1]++,a--;if(a<0||o[1]>r)return NaN;for(;a>=0&&i.get(e,a)&&o[0]<=r;)o[0]++,a--;if(o[0]>r)return NaN;for(a=t+1;a<s&&i.get(e,a);)o[2]++,a++;if(a===s)return NaN;for(;a<s&&!i.get(e,a)&&o[3]<r;)o[3]++,a++;if(a===s||o[3]>=r)return NaN;for(;a<s&&i.get(e,a)&&o[4]<r;)o[4]++,a++;if(o[4]>=r)return NaN;const l=o[0]+o[1]+o[2]+o[3]+o[4];return 5*Math.abs(l-n)>=2*n?NaN:Oe.foundPatternCross(o)?Oe.centerFromEnd(o,a):NaN}crossCheckHorizontal(t,e,r,n){const i=this.image,s=i.getWidth(),o=this.getCrossCheckStateCount();let a=t;for(;a>=0&&i.get(a,e);)o[2]++,a--;if(a<0)return NaN;for(;a>=0&&!i.get(a,e)&&o[1]<=r;)o[1]++,a--;if(a<0||o[1]>r)return NaN;for(;a>=0&&i.get(a,e)&&o[0]<=r;)o[0]++,a--;if(o[0]>r)return NaN;for(a=t+1;a<s&&i.get(a,e);)o[2]++,a++;if(a===s)return NaN;for(;a<s&&!i.get(a,e)&&o[3]<r;)o[3]++,a++;if(a===s||o[3]>=r)return NaN;for(;a<s&&i.get(a,e)&&o[4]<r;)o[4]++,a++;if(o[4]>=r)return NaN;const l=o[0]+o[1]+o[2]+o[3]+o[4];return 5*Math.abs(l-n)>=n?NaN:Oe.foundPatternCross(o)?Oe.centerFromEnd(o,a):NaN}handlePossibleCenter(t,e,r,n){const i=t[0]+t[1]+t[2]+t[3]+t[4];let s=Oe.centerFromEnd(t,r),o=this.crossCheckVertical(e,Math.floor(s),t[2],i);if(!isNaN(o)&&(s=this.crossCheckHorizontal(Math.floor(s),Math.floor(o),t[2],i),!isNaN(s)&&(!n||this.crossCheckDiagonal(Math.floor(o),Math.floor(s),t[2],i)))){const t=i/7;let e=!1;const r=this.possibleCenters;for(let n=0,i=r.length;n<i;n++){const i=r[n];if(i.aboutEquals(t,o,s)){r[n]=i.combineEstimate(o,s,t),e=!0;break}}if(!e){const e=new ye(s,o,t);r.push(e),null!==this.resultPointCallback&&void 0!==this.resultPointCallback&&this.resultPointCallback.foundPossibleResultPoint(e)}return!0}return!1}findRowSkip(){if(this.possibleCenters.length<=1)return 0;let t=null;for(const e of this.possibleCenters)if(e.getCount()>=Oe.CENTER_QUORUM){if(null!=t)return this.hasSkipped=!0,Math.floor((Math.abs(t.getX()-e.getX())-Math.abs(t.getY()-e.getY()))/2);t=e}return 0}haveMultiplyConfirmedCenters(){let t=0,e=0;const r=this.possibleCenters.length;for(const r of this.possibleCenters)r.getCount()>=Oe.CENTER_QUORUM&&(t++,e+=r.getEstimatedModuleSize());if(t<3)return!1;const n=e/r;let i=0;for(const t of this.possibleCenters)i+=Math.abs(t.getEstimatedModuleSize()-n);return i<=.05*e}selectBestPatterns(){const t=this.possibleCenters.length;if(t<3)throw new R;const e=this.possibleCenters;let r;if(t>3){let n=0,i=0;for(const t of this.possibleCenters){const e=t.getEstimatedModuleSize();n+=e,i+=e*e}r=n/t;let s=Math.sqrt(i/t-r*r);e.sort(((t,e)=>{const n=Math.abs(e.getEstimatedModuleSize()-r),i=Math.abs(t.getEstimatedModuleSize()-r);return n<i?-1:n>i?1:0}));const o=Math.max(.2*r,s);for(let t=0;t<e.length&&e.length>3;t++){const n=e[t];Math.abs(n.getEstimatedModuleSize()-r)>o&&(e.splice(t,1),t--)}}if(e.length>3){let t=0;for(const r of e)t+=r.getEstimatedModuleSize();r=t/e.length,e.sort(((t,e)=>{if(e.getCount()===t.getCount()){const n=Math.abs(e.getEstimatedModuleSize()-r),i=Math.abs(t.getEstimatedModuleSize()-r);return n<i?1:n>i?-1:0}return e.getCount()-t.getCount()})),e.splice(3)}return[e[0],e[1],e[2]]}}Oe.CENTER_QUORUM=2,Oe.MIN_SKIP=3,Oe.MAX_MODULES=57;class Me{constructor(t){this.image=t}getImage(){return this.image}getResultPointCallback(){return this.resultPointCallback}detect(t){this.resultPointCallback=null==t?null:t.get(C.NEED_RESULT_POINT_CALLBACK);const e=new Oe(this.image,this.resultPointCallback).find(t);return this.processFinderPatternInfo(e)}processFinderPatternInfo(t){const e=t.getTopLeft(),r=t.getTopRight(),n=t.getBottomLeft(),i=this.calculateModuleSize(e,r,n);if(i<1)throw new R("No pattern found in proccess finder.");const s=Me.computeDimension(e,r,n,i),o=Ce.getProvisionalVersionForDimension(s),a=o.getDimensionForVersion()-7;let l=null;if(o.getAlignmentPatternCenters().length>0){const t=r.getX()-e.getX()+n.getX(),s=r.getY()-e.getY()+n.getY(),o=1-3/a,h=Math.floor(e.getX()+o*(t-e.getX())),c=Math.floor(e.getY()+o*(s-e.getY()));for(let t=4;t<=16;t<<=1)try{l=this.findAlignmentInRegion(i,h,c,t);break}catch(t){if(!(t instanceof R))throw t}}const h=Me.createTransform(e,r,n,l,s),c=Me.sampleGrid(this.image,h,s);let u;return u=null===l?[n,e,r]:[n,e,r,l],new nt(c,u)}static createTransform(t,e,r,n,i){const s=i-3.5;let o,a,l,h;return null!==n?(o=n.getX(),a=n.getY(),l=s-3,h=l):(o=e.getX()-t.getX()+r.getX(),a=e.getY()-t.getY()+r.getY(),l=s,h=s),at.quadrilateralToQuadrilateral(3.5,3.5,s,3.5,l,h,3.5,s,t.getX(),t.getY(),e.getX(),e.getY(),o,a,r.getX(),r.getY())}static sampleGrid(t,e,r){return ht.getInstance().sampleGridWithTransform(t,r,r,e)}static computeDimension(t,e,r,n){const i=tt.round(rt.distance(t,e)/n),s=tt.round(rt.distance(t,r)/n);let o=Math.floor((i+s)/2)+7;switch(3&o){case 0:o++;break;case 2:o--;break;case 3:throw new R("Dimensions could be not found.")}return o}calculateModuleSize(t,e,r){return(this.calculateModuleSizeOneWay(t,e)+this.calculateModuleSizeOneWay(t,r))/2}calculateModuleSizeOneWay(t,e){const r=this.sizeOfBlackWhiteBlackRunBothWays(Math.floor(t.getX()),Math.floor(t.getY()),Math.floor(e.getX()),Math.floor(e.getY())),n=this.sizeOfBlackWhiteBlackRunBothWays(Math.floor(e.getX()),Math.floor(e.getY()),Math.floor(t.getX()),Math.floor(t.getY()));return isNaN(r)?n/7:isNaN(n)?r/7:(r+n)/14}sizeOfBlackWhiteBlackRunBothWays(t,e,r,n){let i=this.sizeOfBlackWhiteBlackRun(t,e,r,n),s=1,o=t-(r-t);o<0?(s=t/(t-o),o=0):o>=this.image.getWidth()&&(s=(this.image.getWidth()-1-t)/(o-t),o=this.image.getWidth()-1);let a=Math.floor(e-(n-e)*s);return s=1,a<0?(s=e/(e-a),a=0):a>=this.image.getHeight()&&(s=(this.image.getHeight()-1-e)/(a-e),a=this.image.getHeight()-1),o=Math.floor(t+(o-t)*s),i+=this.sizeOfBlackWhiteBlackRun(t,e,o,a),i-1}sizeOfBlackWhiteBlackRun(t,e,r,n){const i=Math.abs(n-e)>Math.abs(r-t);if(i){let i=t;t=e,e=i,i=r,r=n,n=i}const s=Math.abs(r-t),o=Math.abs(n-e);let a=-s/2;const l=t<r?1:-1,h=e<n?1:-1;let c=0;const u=r+l;for(let r=t,d=e;r!==u;r+=l){const l=i?d:r,u=i?r:d;if(1===c===this.image.get(l,u)){if(2===c)return tt.distance(r,d,t,e);c++}if(a+=o,a>0){if(d===n)break;d+=h,a-=s}}return 2===c?tt.distance(r+l,n,t,e):NaN}findAlignmentInRegion(t,e,r,n){const i=Math.floor(n*t),s=Math.max(0,e-i),o=Math.min(this.image.getWidth()-1,e+i);if(o-s<3*t)throw new R("Alignment top exceeds estimated module size.");const a=Math.max(0,r-i),l=Math.min(this.image.getHeight()-1,r+i);if(l-a<3*t)throw new R("Alignment bottom exceeds estimated module size.");return new Ne(this.image,s,a,o-s,l-a,t,this.resultPointCallback).find()}}class Be{constructor(){this.decoder=new Te}getDecoder(){return this.decoder}decode(t,e){let r,n;if(null!=e&&void 0!==e.get(C.PURE_BARCODE)){const i=Be.extractPureBits(t.getBlackMatrix());r=this.decoder.decodeBitMatrix(i,e),n=Be.NO_POINTS}else{const i=new Me(t.getBlackMatrix()).detect(e);r=this.decoder.decodeBitMatrix(i.getBits(),e),n=i.getPoints()}r.getOther()instanceof pe&&r.getOther().applyMirroredCorrection(n);const i=new F(r.getText(),r.getRawBytes(),void 0,n,k.QR_CODE,void 0),s=r.getByteSegments();null!==s&&i.putMetadata(W.BYTE_SEGMENTS,s);const o=r.getECLevel();return null!==o&&i.putMetadata(W.ERROR_CORRECTION_LEVEL,o),r.hasStructuredAppend()&&(i.putMetadata(W.STRUCTURED_APPEND_SEQUENCE,r.getStructuredAppendSequenceNumber()),i.putMetadata(W.STRUCTURED_APPEND_PARITY,r.getStructuredAppendParity())),i}reset(){}static extractPureBits(t){const e=t.getTopLeftOnBit(),r=t.getBottomRightOnBit();if(null===e||null===r)throw new R;const n=this.moduleSize(e,t);let i=e[1],s=r[1],o=e[0],a=r[0];if(o>=a||i>=s)throw new R;if(s-i!=a-o&&(a=o+(s-i),a>=t.getWidth()))throw new R;const l=Math.round((a-o+1)/n),h=Math.round((s-i+1)/n);if(l<=0||h<=0)throw new R;if(h!==l)throw new R;const c=Math.floor(n/2);i+=c,o+=c;const u=o+Math.floor((l-1)*n)-a;if(u>0){if(u>c)throw new R;o-=u}const d=i+Math.floor((h-1)*n)-s;if(d>0){if(d>c)throw new R;i-=d}const g=new T(l,h);for(let e=0;e<h;e++){const r=i+Math.floor(e*n);for(let i=0;i<l;i++)t.get(o+Math.floor(i*n),r)&&g.set(i,e)}return g}static moduleSize(t,e){const r=e.getHeight(),n=e.getWidth();let i=t[0],s=t[1],o=!0,a=0;for(;i<n&&s<r;){if(o!==e.get(i,s)){if(5==++a)break;o=!o}i++,s++}if(i===n||s===r)throw new R;return(i-t[0])/7}}Be.NO_POINTS=new Array;class be{PDF417Common(){}static getBitCountSum(t){return tt.sum(t)}static toIntArray(t){if(null==t||!t.length)return be.EMPTY_INT_ARRAY;const e=new Int32Array(t.length);let r=0;for(const n of t)e[r++]=n;return e}static getCodeword(t){const e=g.binarySearch(be.SYMBOL_TABLE,262143&t);return e<0?-1:(be.CODEWORD_TABLE[e]-1)%be.NUMBER_OF_CODEWORDS}}be.NUMBER_OF_CODEWORDS=929,be.MAX_CODEWORDS_IN_BARCODE=be.NUMBER_OF_CODEWORDS-1,be.MIN_ROWS_IN_BARCODE=3,be.MAX_ROWS_IN_BARCODE=90,be.MODULES_IN_CODEWORD=17,be.MODULES_IN_STOP_PATTERN=18,be.BARS_IN_MODULE=8,be.EMPTY_INT_ARRAY=new Int32Array([]),be.SYMBOL_TABLE=Int32Array.from([66142,66170,66206,66236,66290,66292,66350,66382,66396,66454,66470,66476,66594,66600,66614,66626,66628,66632,66640,66654,66662,66668,66682,66690,66718,66720,66748,66758,66776,66798,66802,66804,66820,66824,66832,66846,66848,66876,66880,66936,66950,66956,66968,66992,67006,67022,67036,67042,67044,67048,67062,67118,67150,67164,67214,67228,67256,67294,67322,67350,67366,67372,67398,67404,67416,67438,67474,67476,67490,67492,67496,67510,67618,67624,67650,67656,67664,67678,67686,67692,67706,67714,67716,67728,67742,67744,67772,67782,67788,67800,67822,67826,67828,67842,67848,67870,67872,67900,67904,67960,67974,67992,68016,68030,68046,68060,68066,68068,68072,68086,68104,68112,68126,68128,68156,68160,68216,68336,68358,68364,68376,68400,68414,68448,68476,68494,68508,68536,68546,68548,68552,68560,68574,68582,68588,68654,68686,68700,68706,68708,68712,68726,68750,68764,68792,68802,68804,68808,68816,68830,68838,68844,68858,68878,68892,68920,68976,68990,68994,68996,69e3,69008,69022,69024,69052,69062,69068,69080,69102,69106,69108,69142,69158,69164,69190,69208,69230,69254,69260,69272,69296,69310,69326,69340,69386,69394,69396,69410,69416,69430,69442,69444,69448,69456,69470,69478,69484,69554,69556,69666,69672,69698,69704,69712,69726,69754,69762,69764,69776,69790,69792,69820,69830,69836,69848,69870,69874,69876,69890,69918,69920,69948,69952,70008,70022,70040,70064,70078,70094,70108,70114,70116,70120,70134,70152,70174,70176,70264,70384,70412,70448,70462,70496,70524,70542,70556,70584,70594,70600,70608,70622,70630,70636,70664,70672,70686,70688,70716,70720,70776,70896,71136,71180,71192,71216,71230,71264,71292,71360,71416,71452,71480,71536,71550,71554,71556,71560,71568,71582,71584,71612,71622,71628,71640,71662,71726,71732,71758,71772,71778,71780,71784,71798,71822,71836,71864,71874,71880,71888,71902,71910,71916,71930,71950,71964,71992,72048,72062,72066,72068,72080,72094,72096,72124,72134,72140,72152,72174,72178,72180,72206,72220,72248,72304,72318,72416,72444,72456,72464,72478,72480,72508,72512,72568,72588,72600,72624,72638,72654,72668,72674,72676,72680,72694,72726,72742,72748,72774,72780,72792,72814,72838,72856,72880,72894,72910,72924,72930,72932,72936,72950,72966,72972,72984,73008,73022,73056,73084,73102,73116,73144,73156,73160,73168,73182,73190,73196,73210,73226,73234,73236,73250,73252,73256,73270,73282,73284,73296,73310,73318,73324,73346,73348,73352,73360,73374,73376,73404,73414,73420,73432,73454,73498,73518,73522,73524,73550,73564,73570,73572,73576,73590,73800,73822,73858,73860,73872,73886,73888,73916,73944,73970,73972,73992,74014,74016,74044,74048,74104,74118,74136,74160,74174,74210,74212,74216,74230,74244,74256,74270,74272,74360,74480,74502,74508,74544,74558,74592,74620,74638,74652,74680,74690,74696,74704,74726,74732,74782,74784,74812,74992,75232,75288,75326,75360,75388,75456,75512,75576,75632,75646,75650,75652,75664,75678,75680,75708,75718,75724,75736,75758,75808,75836,75840,75896,76016,76256,76736,76824,76848,76862,76896,76924,76992,77048,77296,77340,77368,77424,77438,77536,77564,77572,77576,77584,77600,77628,77632,77688,77702,77708,77720,77744,77758,77774,77788,77870,77902,77916,77922,77928,77966,77980,78008,78018,78024,78032,78046,78060,78074,78094,78136,78192,78206,78210,78212,78224,78238,78240,78268,78278,78284,78296,78322,78324,78350,78364,78448,78462,78560,78588,78600,78622,78624,78652,78656,78712,78726,78744,78768,78782,78798,78812,78818,78820,78824,78838,78862,78876,78904,78960,78974,79072,79100,79296,79352,79368,79376,79390,79392,79420,79424,79480,79600,79628,79640,79664,79678,79712,79740,79772,79800,79810,79812,79816,79824,79838,79846,79852,79894,79910,79916,79942,79948,79960,79982,79988,80006,80024,80048,80062,80078,80092,80098,80100,80104,80134,80140,80176,80190,80224,80252,80270,80284,80312,80328,80336,80350,80358,80364,80378,80390,80396,80408,80432,80446,80480,80508,80576,80632,80654,80668,80696,80752,80766,80776,80784,80798,80800,80828,80844,80856,80878,80882,80884,80914,80916,80930,80932,80936,80950,80962,80968,80976,80990,80998,81004,81026,81028,81040,81054,81056,81084,81094,81100,81112,81134,81154,81156,81160,81168,81182,81184,81212,81216,81272,81286,81292,81304,81328,81342,81358,81372,81380,81384,81398,81434,81454,81458,81460,81486,81500,81506,81508,81512,81526,81550,81564,81592,81602,81604,81608,81616,81630,81638,81644,81702,81708,81722,81734,81740,81752,81774,81778,81780,82050,82078,82080,82108,82180,82184,82192,82206,82208,82236,82240,82296,82316,82328,82352,82366,82402,82404,82408,82440,82448,82462,82464,82492,82496,82552,82672,82694,82700,82712,82736,82750,82784,82812,82830,82882,82884,82888,82896,82918,82924,82952,82960,82974,82976,83004,83008,83064,83184,83424,83468,83480,83504,83518,83552,83580,83648,83704,83740,83768,83824,83838,83842,83844,83848,83856,83872,83900,83910,83916,83928,83950,83984,84e3,84028,84032,84088,84208,84448,84928,85040,85054,85088,85116,85184,85240,85488,85560,85616,85630,85728,85756,85764,85768,85776,85790,85792,85820,85824,85880,85894,85900,85912,85936,85966,85980,86048,86080,86136,86256,86496,86976,88160,88188,88256,88312,88560,89056,89200,89214,89312,89340,89536,89592,89608,89616,89632,89664,89720,89840,89868,89880,89904,89952,89980,89998,90012,90040,90190,90204,90254,90268,90296,90306,90308,90312,90334,90382,90396,90424,90480,90494,90500,90504,90512,90526,90528,90556,90566,90572,90584,90610,90612,90638,90652,90680,90736,90750,90848,90876,90884,90888,90896,90910,90912,90940,90944,91e3,91014,91020,91032,91056,91070,91086,91100,91106,91108,91112,91126,91150,91164,91192,91248,91262,91360,91388,91584,91640,91664,91678,91680,91708,91712,91768,91888,91928,91952,91966,92e3,92028,92046,92060,92088,92098,92100,92104,92112,92126,92134,92140,92188,92216,92272,92384,92412,92608,92664,93168,93200,93214,93216,93244,93248,93304,93424,93664,93720,93744,93758,93792,93820,93888,93944,93980,94008,94064,94078,94084,94088,94096,94110,94112,94140,94150,94156,94168,94246,94252,94278,94284,94296,94318,94342,94348,94360,94384,94398,94414,94428,94440,94470,94476,94488,94512,94526,94560,94588,94606,94620,94648,94658,94660,94664,94672,94686,94694,94700,94714,94726,94732,94744,94768,94782,94816,94844,94912,94968,94990,95004,95032,95088,95102,95112,95120,95134,95136,95164,95180,95192,95214,95218,95220,95244,95256,95280,95294,95328,95356,95424,95480,95728,95758,95772,95800,95856,95870,95968,95996,96008,96016,96030,96032,96060,96064,96120,96152,96176,96190,96220,96226,96228,96232,96290,96292,96296,96310,96322,96324,96328,96336,96350,96358,96364,96386,96388,96392,96400,96414,96416,96444,96454,96460,96472,96494,96498,96500,96514,96516,96520,96528,96542,96544,96572,96576,96632,96646,96652,96664,96688,96702,96718,96732,96738,96740,96744,96758,96772,96776,96784,96798,96800,96828,96832,96888,97008,97030,97036,97048,97072,97086,97120,97148,97166,97180,97208,97220,97224,97232,97246,97254,97260,97326,97330,97332,97358,97372,97378,97380,97384,97398,97422,97436,97464,97474,97476,97480,97488,97502,97510,97516,97550,97564,97592,97648,97666,97668,97672,97680,97694,97696,97724,97734,97740,97752,97774,97830,97836,97850,97862,97868,97880,97902,97906,97908,97926,97932,97944,97968,97998,98012,98018,98020,98024,98038,98618,98674,98676,98838,98854,98874,98892,98904,98926,98930,98932,98968,99006,99042,99044,99048,99062,99166,99194,99246,99286,99350,99366,99372,99386,99398,99416,99438,99442,99444,99462,99504,99518,99534,99548,99554,99556,99560,99574,99590,99596,99608,99632,99646,99680,99708,99726,99740,99768,99778,99780,99784,99792,99806,99814,99820,99834,99858,99860,99874,99880,99894,99906,99920,99934,99962,99970,99972,99976,99984,99998,1e5,100028,100038,100044,100056,100078,100082,100084,100142,100174,100188,100246,100262,100268,100306,100308,100390,100396,100410,100422,100428,100440,100462,100466,100468,100486,100504,100528,100542,100558,100572,100578,100580,100584,100598,100620,100656,100670,100704,100732,100750,100792,100802,100808,100816,100830,100838,100844,100858,100888,100912,100926,100960,100988,101056,101112,101148,101176,101232,101246,101250,101252,101256,101264,101278,101280,101308,101318,101324,101336,101358,101362,101364,101410,101412,101416,101430,101442,101448,101456,101470,101478,101498,101506,101508,101520,101534,101536,101564,101580,101618,101620,101636,101640,101648,101662,101664,101692,101696,101752,101766,101784,101838,101858,101860,101864,101934,101938,101940,101966,101980,101986,101988,101992,102030,102044,102072,102082,102084,102088,102096,102138,102166,102182,102188,102214,102220,102232,102254,102282,102290,102292,102306,102308,102312,102326,102444,102458,102470,102476,102488,102514,102516,102534,102552,102576,102590,102606,102620,102626,102632,102646,102662,102668,102704,102718,102752,102780,102798,102812,102840,102850,102856,102864,102878,102886,102892,102906,102936,102974,103008,103036,103104,103160,103224,103280,103294,103298,103300,103312,103326,103328,103356,103366,103372,103384,103406,103410,103412,103472,103486,103520,103548,103616,103672,103920,103992,104048,104062,104160,104188,104194,104196,104200,104208,104224,104252,104256,104312,104326,104332,104344,104368,104382,104398,104412,104418,104420,104424,104482,104484,104514,104520,104528,104542,104550,104570,104578,104580,104592,104606,104608,104636,104652,104690,104692,104706,104712,104734,104736,104764,104768,104824,104838,104856,104910,104930,104932,104936,104968,104976,104990,104992,105020,105024,105080,105200,105240,105278,105312,105372,105410,105412,105416,105424,105446,105518,105524,105550,105564,105570,105572,105576,105614,105628,105656,105666,105672,105680,105702,105722,105742,105756,105784,105840,105854,105858,105860,105864,105872,105888,105932,105970,105972,106006,106022,106028,106054,106060,106072,106100,106118,106124,106136,106160,106174,106190,106210,106212,106216,106250,106258,106260,106274,106276,106280,106306,106308,106312,106320,106334,106348,106394,106414,106418,106420,106566,106572,106610,106612,106630,106636,106648,106672,106686,106722,106724,106728,106742,106758,106764,106776,106800,106814,106848,106876,106894,106908,106936,106946,106948,106952,106960,106974,106982,106988,107032,107056,107070,107104,107132,107200,107256,107292,107320,107376,107390,107394,107396,107400,107408,107422,107424,107452,107462,107468,107480,107502,107506,107508,107544,107568,107582,107616,107644,107712,107768,108016,108060,108088,108144,108158,108256,108284,108290,108292,108296,108304,108318,108320,108348,108352,108408,108422,108428,108440,108464,108478,108494,108508,108514,108516,108520,108592,108640,108668,108736,108792,109040,109536,109680,109694,109792,109820,110016,110072,110084,110088,110096,110112,110140,110144,110200,110320,110342,110348,110360,110384,110398,110432,110460,110478,110492,110520,110532,110536,110544,110558,110658,110686,110714,110722,110724,110728,110736,110750,110752,110780,110796,110834,110836,110850,110852,110856,110864,110878,110880,110908,110912,110968,110982,111e3,111054,111074,111076,111080,111108,111112,111120,111134,111136,111164,111168,111224,111344,111372,111422,111456,111516,111554,111556,111560,111568,111590,111632,111646,111648,111676,111680,111736,111856,112096,112152,112224,112252,112320,112440,112514,112516,112520,112528,112542,112544,112588,112686,112718,112732,112782,112796,112824,112834,112836,112840,112848,112870,112890,112910,112924,112952,113008,113022,113026,113028,113032,113040,113054,113056,113100,113138,113140,113166,113180,113208,113264,113278,113376,113404,113416,113424,113440,113468,113472,113560,113614,113634,113636,113640,113686,113702,113708,113734,113740,113752,113778,113780,113798,113804,113816,113840,113854,113870,113890,113892,113896,113926,113932,113944,113968,113982,114016,114044,114076,114114,114116,114120,114128,114150,114170,114194,114196,114210,114212,114216,114242,114244,114248,114256,114270,114278,114306,114308,114312,114320,114334,114336,114364,114380,114420,114458,114478,114482,114484,114510,114524,114530,114532,114536,114842,114866,114868,114970,114994,114996,115042,115044,115048,115062,115130,115226,115250,115252,115278,115292,115298,115300,115304,115318,115342,115394,115396,115400,115408,115422,115430,115436,115450,115478,115494,115514,115526,115532,115570,115572,115738,115758,115762,115764,115790,115804,115810,115812,115816,115830,115854,115868,115896,115906,115912,115920,115934,115942,115948,115962,115996,116024,116080,116094,116098,116100,116104,116112,116126,116128,116156,116166,116172,116184,116206,116210,116212,116246,116262,116268,116282,116294,116300,116312,116334,116338,116340,116358,116364,116376,116400,116414,116430,116444,116450,116452,116456,116498,116500,116514,116520,116534,116546,116548,116552,116560,116574,116582,116588,116602,116654,116694,116714,116762,116782,116786,116788,116814,116828,116834,116836,116840,116854,116878,116892,116920,116930,116936,116944,116958,116966,116972,116986,117006,117048,117104,117118,117122,117124,117136,117150,117152,117180,117190,117196,117208,117230,117234,117236,117304,117360,117374,117472,117500,117506,117508,117512,117520,117536,117564,117568,117624,117638,117644,117656,117680,117694,117710,117724,117730,117732,117736,117750,117782,117798,117804,117818,117830,117848,117874,117876,117894,117936,117950,117966,117986,117988,117992,118022,118028,118040,118064,118078,118112,118140,118172,118210,118212,118216,118224,118238,118246,118266,118306,118312,118338,118352,118366,118374,118394,118402,118404,118408,118416,118430,118432,118460,118476,118514,118516,118574,118578,118580,118606,118620,118626,118628,118632,118678,118694,118700,118730,118738,118740,118830,118834,118836,118862,118876,118882,118884,118888,118902,118926,118940,118968,118978,118980,118984,118992,119006,119014,119020,119034,119068,119096,119152,119166,119170,119172,119176,119184,119198,119200,119228,119238,119244,119256,119278,119282,119284,119324,119352,119408,119422,119520,119548,119554,119556,119560,119568,119582,119584,119612,119616,119672,119686,119692,119704,119728,119742,119758,119772,119778,119780,119784,119798,119920,119934,120032,120060,120256,120312,120324,120328,120336,120352,120384,120440,120560,120582,120588,120600,120624,120638,120672,120700,120718,120732,120760,120770,120772,120776,120784,120798,120806,120812,120870,120876,120890,120902,120908,120920,120946,120948,120966,120972,120984,121008,121022,121038,121058,121060,121064,121078,121100,121112,121136,121150,121184,121212,121244,121282,121284,121288,121296,121318,121338,121356,121368,121392,121406,121440,121468,121536,121592,121656,121730,121732,121736,121744,121758,121760,121804,121842,121844,121890,121922,121924,121928,121936,121950,121958,121978,121986,121988,121992,122e3,122014,122016,122044,122060,122098,122100,122116,122120,122128,122142,122144,122172,122176,122232,122246,122264,122318,122338,122340,122344,122414,122418,122420,122446,122460,122466,122468,122472,122510,122524,122552,122562,122564,122568,122576,122598,122618,122646,122662,122668,122694,122700,122712,122738,122740,122762,122770,122772,122786,122788,122792,123018,123026,123028,123042,123044,123048,123062,123098,123146,123154,123156,123170,123172,123176,123190,123202,123204,123208,123216,123238,123244,123258,123290,123314,123316,123402,123410,123412,123426,123428,123432,123446,123458,123464,123472,123486,123494,123500,123514,123522,123524,123528,123536,123552,123580,123590,123596,123608,123630,123634,123636,123674,123698,123700,123740,123746,123748,123752,123834,123914,123922,123924,123938,123944,123958,123970,123976,123984,123998,124006,124012,124026,124034,124036,124048,124062,124064,124092,124102,124108,124120,124142,124146,124148,124162,124164,124168,124176,124190,124192,124220,124224,124280,124294,124300,124312,124336,124350,124366,124380,124386,124388,124392,124406,124442,124462,124466,124468,124494,124508,124514,124520,124558,124572,124600,124610,124612,124616,124624,124646,124666,124694,124710,124716,124730,124742,124748,124760,124786,124788,124818,124820,124834,124836,124840,124854,124946,124948,124962,124964,124968,124982,124994,124996,125e3,125008,125022,125030,125036,125050,125058,125060,125064,125072,125086,125088,125116,125126,125132,125144,125166,125170,125172,125186,125188,125192,125200,125216,125244,125248,125304,125318,125324,125336,125360,125374,125390,125404,125410,125412,125416,125430,125444,125448,125456,125472,125504,125560,125680,125702,125708,125720,125744,125758,125792,125820,125838,125852,125880,125890,125892,125896,125904,125918,125926,125932,125978,125998,126002,126004,126030,126044,126050,126052,126056,126094,126108,126136,126146,126148,126152,126160,126182,126202,126222,126236,126264,126320,126334,126338,126340,126344,126352,126366,126368,126412,126450,126452,126486,126502,126508,126522,126534,126540,126552,126574,126578,126580,126598,126604,126616,126640,126654,126670,126684,126690,126692,126696,126738,126754,126756,126760,126774,126786,126788,126792,126800,126814,126822,126828,126842,126894,126898,126900,126934,127126,127142,127148,127162,127178,127186,127188,127254,127270,127276,127290,127302,127308,127320,127342,127346,127348,127370,127378,127380,127394,127396,127400,127450,127510,127526,127532,127546,127558,127576,127598,127602,127604,127622,127628,127640,127664,127678,127694,127708,127714,127716,127720,127734,127754,127762,127764,127778,127784,127810,127812,127816,127824,127838,127846,127866,127898,127918,127922,127924,128022,128038,128044,128058,128070,128076,128088,128110,128114,128116,128134,128140,128152,128176,128190,128206,128220,128226,128228,128232,128246,128262,128268,128280,128304,128318,128352,128380,128398,128412,128440,128450,128452,128456,128464,128478,128486,128492,128506,128522,128530,128532,128546,128548,128552,128566,128578,128580,128584,128592,128606,128614,128634,128642,128644,128648,128656,128670,128672,128700,128716,128754,128756,128794,128814,128818,128820,128846,128860,128866,128868,128872,128886,128918,128934,128940,128954,128978,128980,129178,129198,129202,129204,129238,129258,129306,129326,129330,129332,129358,129372,129378,129380,129384,129398,129430,129446,129452,129466,129482,129490,129492,129562,129582,129586,129588,129614,129628,129634,129636,129640,129654,129678,129692,129720,129730,129732,129736,129744,129758,129766,129772,129814,129830,129836,129850,129862,129868,129880,129902,129906,129908,129930,129938,129940,129954,129956,129960,129974,130010]),be.CODEWORD_TABLE=Int32Array.from([2627,1819,2622,2621,1813,1812,2729,2724,2723,2779,2774,2773,902,896,908,868,865,861,859,2511,873,871,1780,835,2493,825,2491,842,837,844,1764,1762,811,810,809,2483,807,2482,806,2480,815,814,813,812,2484,817,816,1745,1744,1742,1746,2655,2637,2635,2626,2625,2623,2628,1820,2752,2739,2737,2728,2727,2725,2730,2785,2783,2778,2777,2775,2780,787,781,747,739,736,2413,754,752,1719,692,689,681,2371,678,2369,700,697,694,703,1688,1686,642,638,2343,631,2341,627,2338,651,646,643,2345,654,652,1652,1650,1647,1654,601,599,2322,596,2321,594,2319,2317,611,610,608,606,2324,603,2323,615,614,612,1617,1616,1614,1612,616,1619,1618,2575,2538,2536,905,901,898,909,2509,2507,2504,870,867,864,860,2512,875,872,1781,2490,2489,2487,2485,1748,836,834,832,830,2494,827,2492,843,841,839,845,1765,1763,2701,2676,2674,2653,2648,2656,2634,2633,2631,2629,1821,2638,2636,2770,2763,2761,2750,2745,2753,2736,2735,2733,2731,1848,2740,2738,2786,2784,591,588,576,569,566,2296,1590,537,534,526,2276,522,2274,545,542,539,548,1572,1570,481,2245,466,2242,462,2239,492,485,482,2249,496,494,1534,1531,1528,1538,413,2196,406,2191,2188,425,419,2202,415,2199,432,430,427,1472,1467,1464,433,1476,1474,368,367,2160,365,2159,362,2157,2155,2152,378,377,375,2166,372,2165,369,2162,383,381,379,2168,1419,1418,1416,1414,385,1411,384,1423,1422,1420,1424,2461,802,2441,2439,790,786,783,794,2409,2406,2403,750,742,738,2414,756,753,1720,2367,2365,2362,2359,1663,693,691,684,2373,680,2370,702,699,696,704,1690,1687,2337,2336,2334,2332,1624,2329,1622,640,637,2344,634,2342,630,2340,650,648,645,2346,655,653,1653,1651,1649,1655,2612,2597,2595,2571,2568,2565,2576,2534,2529,2526,1787,2540,2537,907,904,900,910,2503,2502,2500,2498,1768,2495,1767,2510,2508,2506,869,866,863,2513,876,874,1782,2720,2713,2711,2697,2694,2691,2702,2672,2670,2664,1828,2678,2675,2647,2646,2644,2642,1823,2639,1822,2654,2652,2650,2657,2771,1855,2765,2762,1850,1849,2751,2749,2747,2754,353,2148,344,342,336,2142,332,2140,345,1375,1373,306,2130,299,2128,295,2125,319,314,311,2132,1354,1352,1349,1356,262,257,2101,253,2096,2093,274,273,267,2107,263,2104,280,278,275,1316,1311,1308,1320,1318,2052,202,2050,2044,2040,219,2063,212,2060,208,2055,224,221,2066,1260,1258,1252,231,1248,229,1266,1264,1261,1268,155,1998,153,1996,1994,1991,1988,165,164,2007,162,2006,159,2003,2e3,172,171,169,2012,166,2010,1186,1184,1182,1179,175,1176,173,1192,1191,1189,1187,176,1194,1193,2313,2307,2305,592,589,2294,2292,2289,578,572,568,2297,580,1591,2272,2267,2264,1547,538,536,529,2278,525,2275,547,544,541,1574,1571,2237,2235,2229,1493,2225,1489,478,2247,470,2244,465,2241,493,488,484,2250,498,495,1536,1533,1530,1539,2187,2186,2184,2182,1432,2179,1430,2176,1427,414,412,2197,409,2195,405,2193,2190,426,424,421,2203,418,2201,431,429,1473,1471,1469,1466,434,1477,1475,2478,2472,2470,2459,2457,2454,2462,803,2437,2432,2429,1726,2443,2440,792,789,785,2401,2399,2393,1702,2389,1699,2411,2408,2405,745,741,2415,758,755,1721,2358,2357,2355,2353,1661,2350,1660,2347,1657,2368,2366,2364,2361,1666,690,687,2374,683,2372,701,698,705,1691,1689,2619,2617,2610,2608,2605,2613,2593,2588,2585,1803,2599,2596,2563,2561,2555,1797,2551,1795,2573,2570,2567,2577,2525,2524,2522,2520,1786,2517,1785,2514,1783,2535,2533,2531,2528,1788,2541,2539,906,903,911,2721,1844,2715,2712,1838,1836,2699,2696,2693,2703,1827,1826,1824,2673,2671,2669,2666,1829,2679,2677,1858,1857,2772,1854,1853,1851,1856,2766,2764,143,1987,139,1986,135,133,131,1984,128,1983,125,1981,138,137,136,1985,1133,1132,1130,112,110,1974,107,1973,104,1971,1969,122,121,119,117,1977,114,1976,124,1115,1114,1112,1110,1117,1116,84,83,1953,81,1952,78,1950,1948,1945,94,93,91,1959,88,1958,85,1955,99,97,95,1961,1086,1085,1083,1081,1078,100,1090,1089,1087,1091,49,47,1917,44,1915,1913,1910,1907,59,1926,56,1925,53,1922,1919,66,64,1931,61,1929,1042,1040,1038,71,1035,70,1032,68,1048,1047,1045,1043,1050,1049,12,10,1869,1867,1864,1861,21,1880,19,1877,1874,1871,28,1888,25,1886,22,1883,982,980,977,974,32,30,991,989,987,984,34,995,994,992,2151,2150,2147,2146,2144,356,355,354,2149,2139,2138,2136,2134,1359,343,341,338,2143,335,2141,348,347,346,1376,1374,2124,2123,2121,2119,1326,2116,1324,310,308,305,2131,302,2129,298,2127,320,318,316,313,2133,322,321,1355,1353,1351,1357,2092,2091,2089,2087,1276,2084,1274,2081,1271,259,2102,256,2100,252,2098,2095,272,269,2108,266,2106,281,279,277,1317,1315,1313,1310,282,1321,1319,2039,2037,2035,2032,1203,2029,1200,1197,207,2053,205,2051,201,2049,2046,2043,220,218,2064,215,2062,211,2059,228,226,223,2069,1259,1257,1254,232,1251,230,1267,1265,1263,2316,2315,2312,2311,2309,2314,2304,2303,2301,2299,1593,2308,2306,590,2288,2287,2285,2283,1578,2280,1577,2295,2293,2291,579,577,574,571,2298,582,581,1592,2263,2262,2260,2258,1545,2255,1544,2252,1541,2273,2271,2269,2266,1550,535,532,2279,528,2277,546,543,549,1575,1573,2224,2222,2220,1486,2217,1485,2214,1482,1479,2238,2236,2234,2231,1496,2228,1492,480,477,2248,473,2246,469,2243,490,487,2251,497,1537,1535,1532,2477,2476,2474,2479,2469,2468,2466,2464,1730,2473,2471,2453,2452,2450,2448,1729,2445,1728,2460,2458,2456,2463,805,804,2428,2427,2425,2423,1725,2420,1724,2417,1722,2438,2436,2434,2431,1727,2444,2442,793,791,788,795,2388,2386,2384,1697,2381,1696,2378,1694,1692,2402,2400,2398,2395,1703,2392,1701,2412,2410,2407,751,748,744,2416,759,757,1807,2620,2618,1806,1805,2611,2609,2607,2614,1802,1801,1799,2594,2592,2590,2587,1804,2600,2598,1794,1793,1791,1789,2564,2562,2560,2557,1798,2554,1796,2574,2572,2569,2578,1847,1846,2722,1843,1842,1840,1845,2716,2714,1835,1834,1832,1830,1839,1837,2700,2698,2695,2704,1817,1811,1810,897,862,1777,829,826,838,1760,1758,808,2481,1741,1740,1738,1743,2624,1818,2726,2776,782,740,737,1715,686,679,695,1682,1680,639,628,2339,647,644,1645,1643,1640,1648,602,600,597,595,2320,593,2318,609,607,604,1611,1610,1608,1606,613,1615,1613,2328,926,924,892,886,899,857,850,2505,1778,824,823,821,819,2488,818,2486,833,831,828,840,1761,1759,2649,2632,2630,2746,2734,2732,2782,2781,570,567,1587,531,527,523,540,1566,1564,476,467,463,2240,486,483,1524,1521,1518,1529,411,403,2192,399,2189,423,416,1462,1457,1454,428,1468,1465,2210,366,363,2158,360,2156,357,2153,376,373,370,2163,1410,1409,1407,1405,382,1402,380,1417,1415,1412,1421,2175,2174,777,774,771,784,732,725,722,2404,743,1716,676,674,668,2363,665,2360,685,1684,1681,626,624,622,2335,620,2333,617,2330,641,635,649,1646,1644,1642,2566,928,925,2530,2527,894,891,888,2501,2499,2496,858,856,854,851,1779,2692,2668,2665,2645,2643,2640,2651,2768,2759,2757,2744,2743,2741,2748,352,1382,340,337,333,1371,1369,307,300,296,2126,315,312,1347,1342,1350,261,258,250,2097,246,2094,271,268,264,1306,1301,1298,276,1312,1309,2115,203,2048,195,2045,191,2041,213,209,2056,1246,1244,1238,225,1234,222,1256,1253,1249,1262,2080,2079,154,1997,150,1995,147,1992,1989,163,160,2004,156,2001,1175,1174,1172,1170,1167,170,1164,167,1185,1183,1180,1177,174,1190,1188,2025,2024,2022,587,586,564,559,556,2290,573,1588,520,518,512,2268,508,2265,530,1568,1565,461,457,2233,450,2230,446,2226,479,471,489,1526,1523,1520,397,395,2185,392,2183,389,2180,2177,410,2194,402,422,1463,1461,1459,1456,1470,2455,799,2433,2430,779,776,773,2397,2394,2390,734,728,724,746,1717,2356,2354,2351,2348,1658,677,675,673,670,667,688,1685,1683,2606,2589,2586,2559,2556,2552,927,2523,2521,2518,2515,1784,2532,895,893,890,2718,2709,2707,2689,2687,2684,2663,2662,2660,2658,1825,2667,2769,1852,2760,2758,142,141,1139,1138,134,132,129,126,1982,1129,1128,1126,1131,113,111,108,105,1972,101,1970,120,118,115,1109,1108,1106,1104,123,1113,1111,82,79,1951,75,1949,72,1946,92,89,86,1956,1077,1076,1074,1072,98,1069,96,1084,1082,1079,1088,1968,1967,48,45,1916,42,1914,39,1911,1908,60,57,54,1923,50,1920,1031,1030,1028,1026,67,1023,65,1020,62,1041,1039,1036,1033,69,1046,1044,1944,1943,1941,11,9,1868,7,1865,1862,1859,20,1878,16,1875,13,1872,970,968,966,963,29,960,26,23,983,981,978,975,33,971,31,990,988,985,1906,1904,1902,993,351,2145,1383,331,330,328,326,2137,323,2135,339,1372,1370,294,293,291,289,2122,286,2120,283,2117,309,303,317,1348,1346,1344,245,244,242,2090,239,2088,236,2085,2082,260,2099,249,270,1307,1305,1303,1300,1314,189,2038,186,2036,183,2033,2030,2026,206,198,2047,194,216,1247,1245,1243,1240,227,1237,1255,2310,2302,2300,2286,2284,2281,565,563,561,558,575,1589,2261,2259,2256,2253,1542,521,519,517,514,2270,511,533,1569,1567,2223,2221,2218,2215,1483,2211,1480,459,456,453,2232,449,474,491,1527,1525,1522,2475,2467,2465,2451,2449,2446,801,800,2426,2424,2421,2418,1723,2435,780,778,775,2387,2385,2382,2379,1695,2375,1693,2396,735,733,730,727,749,1718,2616,2615,2604,2603,2601,2584,2583,2581,2579,1800,2591,2550,2549,2547,2545,1792,2542,1790,2558,929,2719,1841,2710,2708,1833,1831,2690,2688,2686,1815,1809,1808,1774,1756,1754,1737,1736,1734,1739,1816,1711,1676,1674,633,629,1638,1636,1633,1641,598,1605,1604,1602,1600,605,1609,1607,2327,887,853,1775,822,820,1757,1755,1584,524,1560,1558,468,464,1514,1511,1508,1519,408,404,400,1452,1447,1444,417,1458,1455,2208,364,361,358,2154,1401,1400,1398,1396,374,1393,371,1408,1406,1403,1413,2173,2172,772,726,723,1712,672,669,666,682,1678,1675,625,623,621,618,2331,636,632,1639,1637,1635,920,918,884,880,889,849,848,847,846,2497,855,852,1776,2641,2742,2787,1380,334,1367,1365,301,297,1340,1338,1335,1343,255,251,247,1296,1291,1288,265,1302,1299,2113,204,196,192,2042,1232,1230,1224,214,1220,210,1242,1239,1235,1250,2077,2075,151,148,1993,144,1990,1163,1162,1160,1158,1155,161,1152,157,1173,1171,1168,1165,168,1181,1178,2021,2020,2018,2023,585,560,557,1585,516,509,1562,1559,458,447,2227,472,1516,1513,1510,398,396,393,390,2181,386,2178,407,1453,1451,1449,1446,420,1460,2209,769,764,720,712,2391,729,1713,664,663,661,659,2352,656,2349,671,1679,1677,2553,922,919,2519,2516,885,883,881,2685,2661,2659,2767,2756,2755,140,1137,1136,130,127,1125,1124,1122,1127,109,106,102,1103,1102,1100,1098,116,1107,1105,1980,80,76,73,1947,1068,1067,1065,1063,90,1060,87,1075,1073,1070,1080,1966,1965,46,43,40,1912,36,1909,1019,1018,1016,1014,58,1011,55,1008,51,1029,1027,1024,1021,63,1037,1034,1940,1939,1937,1942,8,1866,4,1863,1,1860,956,954,952,949,946,17,14,969,967,964,961,27,957,24,979,976,972,1901,1900,1898,1896,986,1905,1903,350,349,1381,329,327,324,1368,1366,292,290,287,284,2118,304,1341,1339,1337,1345,243,240,237,2086,233,2083,254,1297,1295,1293,1290,1304,2114,190,187,184,2034,180,2031,177,2027,199,1233,1231,1229,1226,217,1223,1241,2078,2076,584,555,554,552,550,2282,562,1586,507,506,504,502,2257,499,2254,515,1563,1561,445,443,441,2219,438,2216,435,2212,460,454,475,1517,1515,1512,2447,798,797,2422,2419,770,768,766,2383,2380,2376,721,719,717,714,731,1714,2602,2582,2580,2548,2546,2543,923,921,2717,2706,2705,2683,2682,2680,1771,1752,1750,1733,1732,1731,1735,1814,1707,1670,1668,1631,1629,1626,1634,1599,1598,1596,1594,1603,1601,2326,1772,1753,1751,1581,1554,1552,1504,1501,1498,1509,1442,1437,1434,401,1448,1445,2206,1392,1391,1389,1387,1384,359,1399,1397,1394,1404,2171,2170,1708,1672,1669,619,1632,1630,1628,1773,1378,1363,1361,1333,1328,1336,1286,1281,1278,248,1292,1289,2111,1218,1216,1210,197,1206,193,1228,1225,1221,1236,2073,2071,1151,1150,1148,1146,152,1143,149,1140,145,1161,1159,1156,1153,158,1169,1166,2017,2016,2014,2019,1582,510,1556,1553,452,448,1506,1500,394,391,387,1443,1441,1439,1436,1450,2207,765,716,713,1709,662,660,657,1673,1671,916,914,879,878,877,882,1135,1134,1121,1120,1118,1123,1097,1096,1094,1092,103,1101,1099,1979,1059,1058,1056,1054,77,1051,74,1066,1064,1061,1071,1964,1963,1007,1006,1004,1002,999,41,996,37,1017,1015,1012,1009,52,1025,1022,1936,1935,1933,1938,942,940,938,935,932,5,2,955,953,950,947,18,943,15,965,962,958,1895,1894,1892,1890,973,1899,1897,1379,325,1364,1362,288,285,1334,1332,1330,241,238,234,1287,1285,1283,1280,1294,2112,188,185,181,178,2028,1219,1217,1215,1212,200,1209,1227,2074,2072,583,553,551,1583,505,503,500,513,1557,1555,444,442,439,436,2213,455,451,1507,1505,1502,796,763,762,760,767,711,710,708,706,2377,718,715,1710,2544,917,915,2681,1627,1597,1595,2325,1769,1749,1747,1499,1438,1435,2204,1390,1388,1385,1395,2169,2167,1704,1665,1662,1625,1623,1620,1770,1329,1282,1279,2109,1214,1207,1222,2068,2065,1149,1147,1144,1141,146,1157,1154,2013,2011,2008,2015,1579,1549,1546,1495,1487,1433,1431,1428,1425,388,1440,2205,1705,658,1667,1664,1119,1095,1093,1978,1057,1055,1052,1062,1962,1960,1005,1003,1e3,997,38,1013,1010,1932,1930,1927,1934,941,939,936,933,6,930,3,951,948,944,1889,1887,1884,1881,959,1893,1891,35,1377,1360,1358,1327,1325,1322,1331,1277,1275,1272,1269,235,1284,2110,1205,1204,1201,1198,182,1195,179,1213,2070,2067,1580,501,1551,1548,440,437,1497,1494,1490,1503,761,709,707,1706,913,912,2198,1386,2164,2161,1621,1766,2103,1208,2058,2054,1145,1142,2005,2002,1999,2009,1488,1429,1426,2200,1698,1659,1656,1975,1053,1957,1954,1001,998,1924,1921,1918,1928,937,934,931,1879,1876,1873,1870,945,1885,1882,1323,1273,1270,2105,1202,1199,1196,1211,2061,2057,1576,1543,1540,1484,1481,1478,1491,1700]);class Pe{constructor(t,e){this.bits=t,this.points=e}getBits(){return this.bits}getPoints(){return this.points}}class Le{static detectMultiple(t,e,r){let n=t.getBlackMatrix(),i=Le.detect(r,n);return i.length||(n=n.clone(),n.rotate180(),i=Le.detect(r,n)),new Pe(n,i)}static detect(t,e){const r=new Array;let n=0,i=0,s=!1;for(;n<e.getHeight();){const o=Le.findVertices(e,n,i);if(null!=o[0]||null!=o[3]){if(s=!0,r.push(o),!t)break;null!=o[2]?(i=Math.trunc(o[2].getX()),n=Math.trunc(o[2].getY())):(i=Math.trunc(o[4].getX()),n=Math.trunc(o[4].getY()))}else{if(!s)break;s=!1,i=0;for(const t of r)null!=t[1]&&(n=Math.trunc(Math.max(n,t[1].getY()))),null!=t[3]&&(n=Math.max(n,Math.trunc(t[3].getY())));n+=Le.ROW_STEP}}return r}static findVertices(t,e,r){const n=t.getHeight(),i=t.getWidth(),s=new Array(8);return Le.copyToResult(s,Le.findRowsWithPattern(t,n,i,e,r,Le.START_PATTERN),Le.INDEXES_START_PATTERN),null!=s[4]&&(r=Math.trunc(s[4].getX()),e=Math.trunc(s[4].getY())),Le.copyToResult(s,Le.findRowsWithPattern(t,n,i,e,r,Le.STOP_PATTERN),Le.INDEXES_STOP_PATTERN),s}static copyToResult(t,e,r){for(let n=0;n<r.length;n++)t[r[n]]=e[n]}static findRowsWithPattern(t,e,r,n,i,s){const o=new Array(4);let a=!1;const l=new Int32Array(s.length);for(;n<e;n+=Le.ROW_STEP){let e=Le.findGuardPattern(t,i,n,r,!1,s,l);if(null!=e){for(;n>0;){const o=Le.findGuardPattern(t,i,--n,r,!1,s,l);if(null==o){n++;break}e=o}o[0]=new rt(e[0],n),o[1]=new rt(e[1],n),a=!0;break}}let h=n+1;if(a){let n=0,i=Int32Array.from([Math.trunc(o[0].getX()),Math.trunc(o[1].getX())]);for(;h<e;h++){const e=Le.findGuardPattern(t,i[0],h,r,!1,s,l);if(null!=e&&Math.abs(i[0]-e[0])<Le.MAX_PATTERN_DRIFT&&Math.abs(i[1]-e[1])<Le.MAX_PATTERN_DRIFT)i=e,n=0;else{if(n>Le.SKIPPED_ROW_COUNT_MAX)break;n++}}h-=n+1,o[2]=new rt(i[0],h),o[3]=new rt(i[1],h)}return h-n<Le.BARCODE_MIN_HEIGHT&&g.fill(o,null),o}static findGuardPattern(t,e,r,n,i,s,o){g.fillWithin(o,0,o.length,0);let a=e,l=0;for(;t.get(a,r)&&a>0&&l++<Le.MAX_PIXEL_DRIFT;)a--;let h=a,u=0,d=s.length;for(let e=i;h<n;h++){if(t.get(h,r)!==e)o[u]++;else{if(u===d-1){if(Le.patternMatchVariance(o,s,Le.MAX_INDIVIDUAL_VARIANCE)<Le.MAX_AVG_VARIANCE)return new Int32Array([a,h]);a+=o[0]+o[1],c.arraycopy(o,2,o,0,u-1),o[u-1]=0,o[u]=0,u--}else u++;o[u]=1,e=!e}}return u===d-1&&Le.patternMatchVariance(o,s,Le.MAX_INDIVIDUAL_VARIANCE)<Le.MAX_AVG_VARIANCE?new Int32Array([a,h-1]):null}static patternMatchVariance(t,e,r){let n=t.length,i=0,s=0;for(let r=0;r<n;r++)i+=t[r],s+=e[r];if(i<s)return 1/0;let o=i/s;r*=o;let a=0;for(let i=0;i<n;i++){let n=t[i],s=e[i]*o,l=n>s?n-s:s-n;if(l>r)return 1/0;a+=l}return a/i}}Le.INDEXES_START_PATTERN=Int32Array.from([0,4,1,5]),Le.INDEXES_STOP_PATTERN=Int32Array.from([6,2,7,3]),Le.MAX_AVG_VARIANCE=.42,Le.MAX_INDIVIDUAL_VARIANCE=.8,Le.START_PATTERN=Int32Array.from([8,1,1,1,1,1,1,3]),Le.STOP_PATTERN=Int32Array.from([7,1,1,3,1,1,1,2,1]),Le.MAX_PIXEL_DRIFT=3,Le.MAX_PATTERN_DRIFT=5,Le.SKIPPED_ROW_COUNT_MAX=25,Le.ROW_STEP=5,Le.BARCODE_MIN_HEIGHT=10;class Fe{constructor(t,e){if(0===e.length)throw new o;this.field=t;let r=e.length;if(r>1&&0===e[0]){let t=1;for(;t<r&&0===e[t];)t++;t===r?this.coefficients=new Int32Array([0]):(this.coefficients=new Int32Array(r-t),c.arraycopy(e,t,this.coefficients,0,this.coefficients.length))}else this.coefficients=e}getCoefficients(){return this.coefficients}getDegree(){return this.coefficients.length-1}isZero(){return 0===this.coefficients[0]}getCoefficient(t){return this.coefficients[this.coefficients.length-1-t]}evaluateAt(t){if(0===t)return this.getCoefficient(0);if(1===t){let t=0;for(let e of this.coefficients)t=this.field.add(t,e);return t}let e=this.coefficients[0],r=this.coefficients.length;for(let n=1;n<r;n++)e=this.field.add(this.field.multiply(t,e),this.coefficients[n]);return e}add(t){if(!this.field.equals(t.field))throw new o("ModulusPolys do not have same ModulusGF field");if(this.isZero())return t;if(t.isZero())return this;let e=this.coefficients,r=t.coefficients;if(e.length>r.length){let t=e;e=r,r=t}let n=new Int32Array(r.length),i=r.length-e.length;c.arraycopy(r,0,n,0,i);for(let t=i;t<r.length;t++)n[t]=this.field.add(e[t-i],r[t]);return new Fe(this.field,n)}subtract(t){if(!this.field.equals(t.field))throw new o("ModulusPolys do not have same ModulusGF field");return t.isZero()?this:this.add(t.negative())}multiply(t){return t instanceof Fe?this.multiplyOther(t):this.multiplyScalar(t)}multiplyOther(t){if(!this.field.equals(t.field))throw new o("ModulusPolys do not have same ModulusGF field");if(this.isZero()||t.isZero())return new Fe(this.field,new Int32Array([0]));let e=this.coefficients,r=e.length,n=t.coefficients,i=n.length,s=new Int32Array(r+i-1);for(let t=0;t<r;t++){let r=e[t];for(let e=0;e<i;e++)s[t+e]=this.field.add(s[t+e],this.field.multiply(r,n[e]))}return new Fe(this.field,s)}negative(){let t=this.coefficients.length,e=new Int32Array(t);for(let r=0;r<t;r++)e[r]=this.field.subtract(0,this.coefficients[r]);return new Fe(this.field,e)}multiplyScalar(t){if(0===t)return new Fe(this.field,new Int32Array([0]));if(1===t)return this;let e=this.coefficients.length,r=new Int32Array(e);for(let n=0;n<e;n++)r[n]=this.field.multiply(this.coefficients[n],t);return new Fe(this.field,r)}multiplyByMonomial(t,e){if(t<0)throw new o;if(0===e)return new Fe(this.field,new Int32Array([0]));let r=this.coefficients.length,n=new Int32Array(r+t);for(let t=0;t<r;t++)n[t]=this.field.multiply(this.coefficients[t],e);return new Fe(this.field,n)}toString(){let t=new p;for(let e=this.getDegree();e>=0;e--){let r=this.getCoefficient(e);0!==r&&(r<0?(t.append(" - "),r=-r):t.length()>0&&t.append(" + "),0!==e&&1===r||t.append(r),0!==e&&(1===e?t.append("x"):(t.append("x^"),t.append(e))))}return t.toString()}}class ve{add(t,e){return(t+e)%this.modulus}subtract(t,e){return(this.modulus+t-e)%this.modulus}exp(t){return this.expTable[t]}log(t){if(0===t)throw new o;return this.logTable[t]}inverse(t){if(0===t)throw new K;return this.expTable[this.modulus-this.logTable[t]-1]}multiply(t,e){return 0===t||0===e?0:this.expTable[(this.logTable[t]+this.logTable[e])%(this.modulus-1)]}getSize(){return this.modulus}equals(t){return t===this}}class ke extends ve{constructor(t,e){super(),this.modulus=t,this.expTable=new Int32Array(t),this.logTable=new Int32Array(t);let r=1;for(let n=0;n<t;n++)this.expTable[n]=r,r=r*e%t;for(let e=0;e<t-1;e++)this.logTable[this.expTable[e]]=e;this.zero=new Fe(this,new Int32Array([0])),this.one=new Fe(this,new Int32Array([1]))}getZero(){return this.zero}getOne(){return this.one}buildMonomial(t,e){if(t<0)throw new o;if(0===e)return this.zero;let r=new Int32Array(t+1);return r[0]=e,new Fe(this,r)}}ke.PDF417_GF=new ke(be.NUMBER_OF_CODEWORDS,3);class xe{constructor(){this.field=ke.PDF417_GF}decode(t,e,r){let n=new Fe(this.field,t),i=new Int32Array(e),s=!1;for(let t=e;t>0;t--){let r=n.evaluateAt(this.field.exp(t));i[e-t]=r,0!==r&&(s=!0)}if(!s)return 0;let o=this.field.getOne();if(null!=r)for(const e of r){let r=this.field.exp(t.length-1-e),n=new Fe(this.field,new Int32Array([this.field.subtract(0,r),1]));o=o.multiply(n)}let a=new Fe(this.field,i),h=this.runEuclideanAlgorithm(this.field.buildMonomial(e,1),a,e),c=h[0],u=h[1],d=this.findErrorLocations(c),g=this.findErrorMagnitudes(u,c,d);for(let e=0;e<d.length;e++){let r=t.length-1-this.field.log(d[e]);if(r<0)throw l.getChecksumInstance();t[r]=this.field.subtract(t[r],g[e])}return d.length}runEuclideanAlgorithm(t,e,r){if(t.getDegree()<e.getDegree()){let r=t;t=e,e=r}let n=t,i=e,s=this.field.getZero(),o=this.field.getOne();for(;i.getDegree()>=Math.round(r/2);){let t=n,e=s;if(n=i,s=o,n.isZero())throw l.getChecksumInstance();i=t;let r=this.field.getZero(),a=n.getCoefficient(n.getDegree()),h=this.field.inverse(a);for(;i.getDegree()>=n.getDegree()&&!i.isZero();){let t=i.getDegree()-n.getDegree(),e=this.field.multiply(i.getCoefficient(i.getDegree()),h);r=r.add(this.field.buildMonomial(t,e)),i=i.subtract(n.multiplyByMonomial(t,e))}o=r.multiply(s).subtract(e).negative()}let a=o.getCoefficient(0);if(0===a)throw l.getChecksumInstance();let h=this.field.inverse(a);return[o.multiply(h),i.multiply(h)]}findErrorLocations(t){let e=t.getDegree(),r=new Int32Array(e),n=0;for(let i=1;i<this.field.getSize()&&n<e;i++)0===t.evaluateAt(i)&&(r[n]=this.field.inverse(i),n++);if(n!==e)throw l.getChecksumInstance();return r}findErrorMagnitudes(t,e,r){let n=e.getDegree(),i=new Int32Array(n);for(let t=1;t<=n;t++)i[n-t]=this.field.multiply(t,e.getCoefficient(t));let s=new Fe(this.field,i),o=r.length,a=new Int32Array(o);for(let e=0;e<o;e++){let n=this.field.inverse(r[e]),i=this.field.subtract(0,t.evaluateAt(n)),o=this.field.inverse(s.evaluateAt(n));a[e]=this.field.multiply(i,o)}return a}}class Ve{constructor(t,e,r,n,i){t instanceof Ve?this.constructor_2(t):this.constructor_1(t,e,r,n,i)}constructor_1(t,e,r,n,i){const s=null==e||null==r,o=null==n||null==i;if(s&&o)throw new R;s?(e=new rt(0,n.getY()),r=new rt(0,i.getY())):o&&(n=new rt(t.getWidth()-1,e.getY()),i=new rt(t.getWidth()-1,r.getY())),this.image=t,this.topLeft=e,this.bottomLeft=r,this.topRight=n,this.bottomRight=i,this.minX=Math.trunc(Math.min(e.getX(),r.getX())),this.maxX=Math.trunc(Math.max(n.getX(),i.getX())),this.minY=Math.trunc(Math.min(e.getY(),n.getY())),this.maxY=Math.trunc(Math.max(r.getY(),i.getY()))}constructor_2(t){this.image=t.image,this.topLeft=t.getTopLeft(),this.bottomLeft=t.getBottomLeft(),this.topRight=t.getTopRight(),this.bottomRight=t.getBottomRight(),this.minX=t.getMinX(),this.maxX=t.getMaxX(),this.minY=t.getMinY(),this.maxY=t.getMaxY()}static merge(t,e){return null==t?e:null==e?t:new Ve(t.image,t.topLeft,t.bottomLeft,e.topRight,e.bottomRight)}addMissingRows(t,e,r){let n=this.topLeft,i=this.bottomLeft,s=this.topRight,o=this.bottomRight;if(t>0){let e=r?this.topLeft:this.topRight,i=Math.trunc(e.getY()-t);i<0&&(i=0);let o=new rt(e.getX(),i);r?n=o:s=o}if(e>0){let t=r?this.bottomLeft:this.bottomRight,n=Math.trunc(t.getY()+e);n>=this.image.getHeight()&&(n=this.image.getHeight()-1);let s=new rt(t.getX(),n);r?i=s:o=s}return new Ve(this.image,n,i,s,o)}getMinX(){return this.minX}getMaxX(){return this.maxX}getMinY(){return this.minY}getMaxY(){return this.maxY}getTopLeft(){return this.topLeft}getTopRight(){return this.topRight}getBottomLeft(){return this.bottomLeft}getBottomRight(){return this.bottomRight}}class Ue{constructor(t,e,r,n){this.columnCount=t,this.errorCorrectionLevel=n,this.rowCountUpperPart=e,this.rowCountLowerPart=r,this.rowCount=e+r}getColumnCount(){return this.columnCount}getErrorCorrectionLevel(){return this.errorCorrectionLevel}getRowCount(){return this.rowCount}getRowCountUpperPart(){return this.rowCountUpperPart}getRowCountLowerPart(){return this.rowCountLowerPart}}class He{constructor(){this.buffer=""}static form(t,e){let r=-1;return t.replace(/%(-)?(0?[0-9]+)?([.][0-9]+)?([#][0-9]+)?([scfpexd%])/g,(function(t,n,i,s,o,a){if("%%"===t)return"%";if(void 0===e[++r])return;t=s?parseInt(s.substr(1)):void 0;let l,h=o?parseInt(o.substr(1)):void 0;switch(a){case"s":l=e[r];break;case"c":l=e[r][0];break;case"f":l=parseFloat(e[r]).toFixed(t);break;case"p":l=parseFloat(e[r]).toPrecision(t);break;case"e":l=parseFloat(e[r]).toExponential(t);break;case"x":l=parseInt(e[r]).toString(h||16);break;case"d":l=parseFloat(parseInt(e[r],h||10).toPrecision(t)).toFixed(0)}l="object"==typeof l?JSON.stringify(l):(+l).toString(h);let c=parseInt(i),u=i&&i[0]+""=="0"?"0":" ";for(;l.length<c;)l=void 0!==n?l+u:u+l;return l}))}format(t,...e){this.buffer+=He.form(t,e)}toString(){return this.buffer}}class Ge{constructor(t){this.boundingBox=new Ve(t),this.codewords=new Array(t.getMaxY()-t.getMinY()+1)}getCodewordNearby(t){let e=this.getCodeword(t);if(null!=e)return e;for(let r=1;r<Ge.MAX_NEARBY_DISTANCE;r++){let n=this.imageRowToCodewordIndex(t)-r;if(n>=0&&(e=this.codewords[n],null!=e))return e;if(n=this.imageRowToCodewordIndex(t)+r,n<this.codewords.length&&(e=this.codewords[n],null!=e))return e}return null}imageRowToCodewordIndex(t){return t-this.boundingBox.getMinY()}setCodeword(t,e){this.codewords[this.imageRowToCodewordIndex(t)]=e}getCodeword(t){return this.codewords[this.imageRowToCodewordIndex(t)]}getBoundingBox(){return this.boundingBox}getCodewords(){return this.codewords}toString(){const t=new He;let e=0;for(const r of this.codewords)null!=r?t.format("%3d: %3d|%3d%n",e++,r.getRowNumber(),r.getValue()):t.format("%3d: | %n",e++);return t.toString()}}Ge.MAX_NEARBY_DISTANCE=5;class Xe{constructor(){this.values=new Map}setValue(t){t=Math.trunc(t);let e=this.values.get(t);null==e&&(e=0),e++,this.values.set(t,e)}getValue(){let t=-1,e=new Array;for(const[r,n]of this.values.entries()){const i={getKey:()=>r,getValue:()=>n};i.getValue()>t?(t=i.getValue(),e=[],e.push(i.getKey())):i.getValue()===t&&e.push(i.getKey())}return be.toIntArray(e)}getConfidence(t){return this.values.get(t)}}class We extends Ge{constructor(t,e){super(t),this._isLeft=e}setRowNumbers(){for(let t of this.getCodewords())null!=t&&t.setRowNumberAsRowIndicatorColumn()}adjustCompleteIndicatorColumnRowNumbers(t){let e=this.getCodewords();this.setRowNumbers(),this.removeIncorrectCodewords(e,t);let r=this.getBoundingBox(),n=this._isLeft?r.getTopLeft():r.getTopRight(),i=this._isLeft?r.getBottomLeft():r.getBottomRight(),s=this.imageRowToCodewordIndex(Math.trunc(n.getY())),o=this.imageRowToCodewordIndex(Math.trunc(i.getY())),a=-1,l=1,h=0;for(let r=s;r<o;r++){if(null==e[r])continue;let n=e[r],i=n.getRowNumber()-a;if(0===i)h++;else if(1===i)l=Math.max(l,h),h=1,a=n.getRowNumber();else if(i<0||n.getRowNumber()>=t.getRowCount()||i>r)e[r]=null;else{let t;t=l>2?(l-2)*i:i;let s=t>=r;for(let n=1;n<=t&&!s;n++)s=null!=e[r-n];s?e[r]=null:(a=n.getRowNumber(),h=1)}}}getRowHeights(){let t=this.getBarcodeMetadata();if(null==t)return null;this.adjustIncompleteIndicatorColumnRowNumbers(t);let e=new Int32Array(t.getRowCount());for(let t of this.getCodewords())if(null!=t){let r=t.getRowNumber();if(r>=e.length)continue;e[r]++}return e}adjustIncompleteIndicatorColumnRowNumbers(t){let e=this.getBoundingBox(),r=this._isLeft?e.getTopLeft():e.getTopRight(),n=this._isLeft?e.getBottomLeft():e.getBottomRight(),i=this.imageRowToCodewordIndex(Math.trunc(r.getY())),s=this.imageRowToCodewordIndex(Math.trunc(n.getY())),o=this.getCodewords(),a=-1;for(let e=i;e<s;e++){if(null==o[e])continue;let r=o[e];r.setRowNumberAsRowIndicatorColumn();let n=r.getRowNumber()-a;0===n||(1===n?a=r.getRowNumber():r.getRowNumber()>=t.getRowCount()?o[e]=null:a=r.getRowNumber())}}getBarcodeMetadata(){let t=this.getCodewords(),e=new Xe,r=new Xe,n=new Xe,i=new Xe;for(let s of t){if(null==s)continue;s.setRowNumberAsRowIndicatorColumn();let t=s.getValue()%30,o=s.getRowNumber();switch(this._isLeft||(o+=2),o%3){case 0:r.setValue(3*t+1);break;case 1:i.setValue(t/3),n.setValue(t%3);break;case 2:e.setValue(t+1)}}if(0===e.getValue().length||0===r.getValue().length||0===n.getValue().length||0===i.getValue().length||e.getValue()[0]<1||r.getValue()[0]+n.getValue()[0]<be.MIN_ROWS_IN_BARCODE||r.getValue()[0]+n.getValue()[0]>be.MAX_ROWS_IN_BARCODE)return null;let s=new Ue(e.getValue()[0],r.getValue()[0],n.getValue()[0],i.getValue()[0]);return this.removeIncorrectCodewords(t,s),s}removeIncorrectCodewords(t,e){for(let r=0;r<t.length;r++){let n=t[r];if(null==t[r])continue;let i=n.getValue()%30,s=n.getRowNumber();if(s>e.getRowCount())t[r]=null;else switch(this._isLeft||(s+=2),s%3){case 0:3*i+1!==e.getRowCountUpperPart()&&(t[r]=null);break;case 1:Math.trunc(i/3)===e.getErrorCorrectionLevel()&&i%3===e.getRowCountLowerPart()||(t[r]=null);break;case 2:i+1!==e.getColumnCount()&&(t[r]=null)}}}isLeft(){return this._isLeft}toString(){return"IsLeft: "+this._isLeft+"\n"+super.toString()}}class ze{constructor(t,e){this.ADJUST_ROW_NUMBER_SKIP=2,this.barcodeMetadata=t,this.barcodeColumnCount=t.getColumnCount(),this.boundingBox=e,this.detectionResultColumns=new Array(this.barcodeColumnCount+2)}getDetectionResultColumns(){this.adjustIndicatorColumnRowNumbers(this.detectionResultColumns[0]),this.adjustIndicatorColumnRowNumbers(this.detectionResultColumns[this.barcodeColumnCount+1]);let t,e=be.MAX_CODEWORDS_IN_BARCODE;do{t=e,e=this.adjustRowNumbersAndGetCount()}while(e>0&&e<t);return this.detectionResultColumns}adjustIndicatorColumnRowNumbers(t){null!=t&&t.adjustCompleteIndicatorColumnRowNumbers(this.barcodeMetadata)}adjustRowNumbersAndGetCount(){let t=this.adjustRowNumbersByRow();if(0===t)return 0;for(let t=1;t<this.barcodeColumnCount+1;t++){let e=this.detectionResultColumns[t].getCodewords();for(let r=0;r<e.length;r++)null!=e[r]&&(e[r].hasValidRowNumber()||this.adjustRowNumbers(t,r,e))}return t}adjustRowNumbersByRow(){return this.adjustRowNumbersFromBothRI(),this.adjustRowNumbersFromLRI()+this.adjustRowNumbersFromRRI()}adjustRowNumbersFromBothRI(){if(null==this.detectionResultColumns[0]||null==this.detectionResultColumns[this.barcodeColumnCount+1])return;let t=this.detectionResultColumns[0].getCodewords(),e=this.detectionResultColumns[this.barcodeColumnCount+1].getCodewords();for(let r=0;r<t.length;r++)if(null!=t[r]&&null!=e[r]&&t[r].getRowNumber()===e[r].getRowNumber())for(let e=1;e<=this.barcodeColumnCount;e++){let n=this.detectionResultColumns[e].getCodewords()[r];null!=n&&(n.setRowNumber(t[r].getRowNumber()),n.hasValidRowNumber()||(this.detectionResultColumns[e].getCodewords()[r]=null))}}adjustRowNumbersFromRRI(){if(null==this.detectionResultColumns[this.barcodeColumnCount+1])return 0;let t=0,e=this.detectionResultColumns[this.barcodeColumnCount+1].getCodewords();for(let r=0;r<e.length;r++){if(null==e[r])continue;let n=e[r].getRowNumber(),i=0;for(let e=this.barcodeColumnCount+1;e>0&&i<this.ADJUST_ROW_NUMBER_SKIP;e--){let s=this.detectionResultColumns[e].getCodewords()[r];null!=s&&(i=ze.adjustRowNumberIfValid(n,i,s),s.hasValidRowNumber()||t++)}}return t}adjustRowNumbersFromLRI(){if(null==this.detectionResultColumns[0])return 0;let t=0,e=this.detectionResultColumns[0].getCodewords();for(let r=0;r<e.length;r++){if(null==e[r])continue;let n=e[r].getRowNumber(),i=0;for(let e=1;e<this.barcodeColumnCount+1&&i<this.ADJUST_ROW_NUMBER_SKIP;e++){let s=this.detectionResultColumns[e].getCodewords()[r];null!=s&&(i=ze.adjustRowNumberIfValid(n,i,s),s.hasValidRowNumber()||t++)}}return t}static adjustRowNumberIfValid(t,e,r){return null==r||r.hasValidRowNumber()||(r.isValidRowNumber(t)?(r.setRowNumber(t),e=0):++e),e}adjustRowNumbers(t,e,r){if(null==this.detectionResultColumns[t-1])return;let n=r[e],i=this.detectionResultColumns[t-1].getCodewords(),s=i;null!=this.detectionResultColumns[t+1]&&(s=this.detectionResultColumns[t+1].getCodewords());let o=new Array(14);o[2]=i[e],o[3]=s[e],e>0&&(o[0]=r[e-1],o[4]=i[e-1],o[5]=s[e-1]),e>1&&(o[8]=r[e-2],o[10]=i[e-2],o[11]=s[e-2]),e<r.length-1&&(o[1]=r[e+1],o[6]=i[e+1],o[7]=s[e+1]),e<r.length-2&&(o[9]=r[e+2],o[12]=i[e+2],o[13]=s[e+2]);for(let t of o)if(ze.adjustRowNumber(n,t))return}static adjustRowNumber(t,e){return null!=e&&(!(!e.hasValidRowNumber()||e.getBucket()!==t.getBucket())&&(t.setRowNumber(e.getRowNumber()),!0))}getBarcodeColumnCount(){return this.barcodeColumnCount}getBarcodeRowCount(){return this.barcodeMetadata.getRowCount()}getBarcodeECLevel(){return this.barcodeMetadata.getErrorCorrectionLevel()}setBoundingBox(t){this.boundingBox=t}getBoundingBox(){return this.boundingBox}setDetectionResultColumn(t,e){this.detectionResultColumns[t]=e}getDetectionResultColumn(t){return this.detectionResultColumns[t]}toString(){let t=this.detectionResultColumns[0];null==t&&(t=this.detectionResultColumns[this.barcodeColumnCount+1]);let e=new He;for(let r=0;r<t.getCodewords().length;r++){e.format("CW %3d:",r);for(let t=0;t<this.barcodeColumnCount+2;t++){if(null==this.detectionResultColumns[t]){e.format(" | ");continue}let n=this.detectionResultColumns[t].getCodewords()[r];null!=n?e.format(" %3d|%3d",n.getRowNumber(),n.getValue()):e.format(" | ")}e.format("%n")}return e.toString()}}class Ye{constructor(t,e,r,n){this.rowNumber=Ye.BARCODE_ROW_UNKNOWN,this.startX=Math.trunc(t),this.endX=Math.trunc(e),this.bucket=Math.trunc(r),this.value=Math.trunc(n)}hasValidRowNumber(){return this.isValidRowNumber(this.rowNumber)}isValidRowNumber(t){return t!==Ye.BARCODE_ROW_UNKNOWN&&this.bucket===t%3*3}setRowNumberAsRowIndicatorColumn(){this.rowNumber=Math.trunc(3*Math.trunc(this.value/30)+Math.trunc(this.bucket/3))}getWidth(){return this.endX-this.startX}getStartX(){return this.startX}getEndX(){return this.endX}getBucket(){return this.bucket}getValue(){return this.value}getRowNumber(){return this.rowNumber}setRowNumber(t){this.rowNumber=t}toString(){return this.rowNumber+"|"+this.value}}Ye.BARCODE_ROW_UNKNOWN=-1;class Ze{static initialize(){for(let t=0;t<be.SYMBOL_TABLE.length;t++){let e=be.SYMBOL_TABLE[t],r=1&e;for(let n=0;n<be.BARS_IN_MODULE;n++){let i=0;for(;(1&e)===r;)i+=1,e>>=1;r=1&e,Ze.RATIOS_TABLE[t]||(Ze.RATIOS_TABLE[t]=new Array(be.BARS_IN_MODULE)),Ze.RATIOS_TABLE[t][be.BARS_IN_MODULE-n-1]=Math.fround(i/be.MODULES_IN_CODEWORD)}}this.bSymbolTableReady=!0}static getDecodedValue(t){let e=Ze.getDecodedCodewordValue(Ze.sampleBitCounts(t));return-1!==e?e:Ze.getClosestDecodedValue(t)}static sampleBitCounts(t){let e=tt.sum(t),r=new Int32Array(be.BARS_IN_MODULE),n=0,i=0;for(let s=0;s<be.MODULES_IN_CODEWORD;s++){let o=e/(2*be.MODULES_IN_CODEWORD)+s*e/be.MODULES_IN_CODEWORD;i+t[n]<=o&&(i+=t[n],n++),r[n]++}return r}static getDecodedCodewordValue(t){let e=Ze.getBitValue(t);return-1===be.getCodeword(e)?-1:e}static getBitValue(t){let e=0;for(let r=0;r<t.length;r++)for(let n=0;n<t[r];n++)e=e<<1|(r%2==0?1:0);return Math.trunc(e)}static getClosestDecodedValue(t){let e=tt.sum(t),r=new Array(be.BARS_IN_MODULE);if(e>1)for(let n=0;n<r.length;n++)r[n]=Math.fround(t[n]/e);let n=et.MAX_VALUE,i=-1;this.bSymbolTableReady||Ze.initialize();for(let t=0;t<Ze.RATIOS_TABLE.length;t++){let e=0,s=Ze.RATIOS_TABLE[t];for(let t=0;t<be.BARS_IN_MODULE;t++){let i=Math.fround(s[t]-r[t]);if(e+=Math.fround(i*i),e>=n)break}e<n&&(n=e,i=be.SYMBOL_TABLE[t])}return i}}Ze.bSymbolTableReady=!1,Ze.RATIOS_TABLE=new Array(be.SYMBOL_TABLE.length).map((t=>new Array(be.BARS_IN_MODULE)));class Ke{constructor(){this.segmentCount=-1,this.fileSize=-1,this.timestamp=-1,this.checksum=-1}getSegmentIndex(){return this.segmentIndex}setSegmentIndex(t){this.segmentIndex=t}getFileId(){return this.fileId}setFileId(t){this.fileId=t}getOptionalData(){return this.optionalData}setOptionalData(t){this.optionalData=t}isLastSegment(){return this.lastSegment}setLastSegment(t){this.lastSegment=t}getSegmentCount(){return this.segmentCount}setSegmentCount(t){this.segmentCount=t}getSender(){return this.sender||null}setSender(t){this.sender=t}getAddressee(){return this.addressee||null}setAddressee(t){this.addressee=t}getFileName(){return this.fileName}setFileName(t){this.fileName=t}getFileSize(){return this.fileSize}setFileSize(t){this.fileSize=t}getChecksum(){return this.checksum}setChecksum(t){this.checksum=t}getTimestamp(){return this.timestamp}setTimestamp(t){this.timestamp=t}}class qe{static parseLong(t,e){return parseInt(t,e)}}class Qe extends i{}Qe.kind="NullPointerException";class je{writeBytes(t){this.writeBytesOffset(t,0,t.length)}writeBytesOffset(t,e,r){if(null==t)throw new Qe;if(e<0||e>t.length||r<0||e+r>t.length||e+r<0)throw new u;if(0!==r)for(let n=0;n<r;n++)this.write(t[e+n])}flush(){}close(){}}class Je extends i{}class $e extends je{constructor(t=32){if(super(),this.count=0,t<0)throw new o("Negative initial size: "+t);this.buf=new Uint8Array(t)}ensureCapacity(t){t-this.buf.length>0&&this.grow(t)}grow(t){let e=this.buf.length<<1;if(e-t<0&&(e=t),e<0){if(t<0)throw new Je;e=f.MAX_VALUE}this.buf=g.copyOfUint8Array(this.buf,e)}write(t){this.ensureCapacity(this.count+1),this.buf[this.count]=t,this.count+=1}writeBytesOffset(t,e,r){if(e<0||e>t.length||r<0||e+r-t.length>0)throw new u;this.ensureCapacity(this.count+r),c.arraycopy(t,e,this.buf,this.count,r),this.count+=r}writeTo(t){t.writeBytesOffset(this.buf,0,this.count)}reset(){this.count=0}toByteArray(){return g.copyOfUint8Array(this.buf,this.count)}size(){return this.count}toString(t){return t?"string"==typeof t?this.toString_string(t):this.toString_number(t):this.toString_void()}toString_void(){return new String(this.buf).toString()}toString_string(t){return new String(this.buf).toString()}toString_number(t){return new String(this.buf).toString()}close(){}}function tr(){if("undefined"!=typeof window)return window.BigInt||null;if("undefined"!=typeof global)return global.BigInt||null;if("undefined"!=typeof self)return self.BigInt||null;throw new Error("Can't search globals for BigInt!")}let er;function rr(t){if(void 0===er&&(er=tr()),null===er)throw new Error("BigInt is not supported!");return er(t)}!function(t){t[t.ALPHA=0]="ALPHA",t[t.LOWER=1]="LOWER",t[t.MIXED=2]="MIXED",t[t.PUNCT=3]="PUNCT",t[t.ALPHA_SHIFT=4]="ALPHA_SHIFT",t[t.PUNCT_SHIFT=5]="PUNCT_SHIFT"}(X||(X={}));class nr{static decode(t,e){let r=new p(""),n=m.ISO8859_1;r.enableDecoding(n);let i=1,s=t[i++],o=new Ke;for(;i<t[0];){switch(s){case nr.TEXT_COMPACTION_MODE_LATCH:i=nr.textCompaction(t,i,r);break;case nr.BYTE_COMPACTION_MODE_LATCH:case nr.BYTE_COMPACTION_MODE_LATCH_6:i=nr.byteCompaction(s,t,n,i,r);break;case nr.MODE_SHIFT_TO_BYTE_COMPACTION_MODE:r.append(t[i++]);break;case nr.NUMERIC_COMPACTION_MODE_LATCH:i=nr.numericCompaction(t,i,r);break;case nr.ECI_CHARSET:m.getCharacterSetECIByValue(t[i++]);break;case nr.ECI_GENERAL_PURPOSE:i+=2;break;case nr.ECI_USER_DEFINED:i++;break;case nr.BEGIN_MACRO_PDF417_CONTROL_BLOCK:i=nr.decodeMacroBlock(t,i,o);break;case nr.BEGIN_MACRO_PDF417_OPTIONAL_FIELD:case nr.MACRO_PDF417_TERMINATOR:throw new E;default:i--,i=nr.textCompaction(t,i,r)}if(!(i<t.length))throw E.getFormatInstance();s=t[i++]}if(0===r.length())throw E.getFormatInstance();let a=new z(null,r.toString(),null,e);return a.setOther(o),a}static decodeMacroBlock(t,e,r){if(e+nr.NUMBER_OF_SEQUENCE_CODEWORDS>t[0])throw E.getFormatInstance();let n=new Int32Array(nr.NUMBER_OF_SEQUENCE_CODEWORDS);for(let r=0;r<nr.NUMBER_OF_SEQUENCE_CODEWORDS;r++,e++)n[r]=t[e];r.setSegmentIndex(f.parseInt(nr.decodeBase900toBase10(n,nr.NUMBER_OF_SEQUENCE_CODEWORDS)));let i=new p;e=nr.textCompaction(t,e,i),r.setFileId(i.toString());let s=-1;for(t[e]===nr.BEGIN_MACRO_PDF417_OPTIONAL_FIELD&&(s=e+1);e<t[0];)switch(t[e]){case nr.BEGIN_MACRO_PDF417_OPTIONAL_FIELD:switch(t[++e]){case nr.MACRO_PDF417_OPTIONAL_FIELD_FILE_NAME:let n=new p;e=nr.textCompaction(t,e+1,n),r.setFileName(n.toString());break;case nr.MACRO_PDF417_OPTIONAL_FIELD_SENDER:let i=new p;e=nr.textCompaction(t,e+1,i),r.setSender(i.toString());break;case nr.MACRO_PDF417_OPTIONAL_FIELD_ADDRESSEE:let s=new p;e=nr.textCompaction(t,e+1,s),r.setAddressee(s.toString());break;case nr.MACRO_PDF417_OPTIONAL_FIELD_SEGMENT_COUNT:let o=new p;e=nr.numericCompaction(t,e+1,o),r.setSegmentCount(f.parseInt(o.toString()));break;case nr.MACRO_PDF417_OPTIONAL_FIELD_TIME_STAMP:let a=new p;e=nr.numericCompaction(t,e+1,a),r.setTimestamp(qe.parseLong(a.toString()));break;case nr.MACRO_PDF417_OPTIONAL_FIELD_CHECKSUM:let l=new p;e=nr.numericCompaction(t,e+1,l),r.setChecksum(f.parseInt(l.toString()));break;case nr.MACRO_PDF417_OPTIONAL_FIELD_FILE_SIZE:let h=new p;e=nr.numericCompaction(t,e+1,h),r.setFileSize(qe.parseLong(h.toString()));break;default:throw E.getFormatInstance()}break;case nr.MACRO_PDF417_TERMINATOR:e++,r.setLastSegment(!0);break;default:throw E.getFormatInstance()}if(-1!==s){let n=e-s;r.isLastSegment()&&n--,r.setOptionalData(g.copyOfRange(t,s,s+n))}return e}static textCompaction(t,e,r){let n=new Int32Array(2*(t[0]-e)),i=new Int32Array(2*(t[0]-e)),s=0,o=!1;for(;e<t[0]&&!o;){let r=t[e++];if(r<nr.TEXT_COMPACTION_MODE_LATCH)n[s]=r/30,n[s+1]=r%30,s+=2;else switch(r){case nr.TEXT_COMPACTION_MODE_LATCH:n[s++]=nr.TEXT_COMPACTION_MODE_LATCH;break;case nr.BYTE_COMPACTION_MODE_LATCH:case nr.BYTE_COMPACTION_MODE_LATCH_6:case nr.NUMERIC_COMPACTION_MODE_LATCH:case nr.BEGIN_MACRO_PDF417_CONTROL_BLOCK:case nr.BEGIN_MACRO_PDF417_OPTIONAL_FIELD:case nr.MACRO_PDF417_TERMINATOR:e--,o=!0;break;case nr.MODE_SHIFT_TO_BYTE_COMPACTION_MODE:n[s]=nr.MODE_SHIFT_TO_BYTE_COMPACTION_MODE,r=t[e++],i[s]=r,s++}}return nr.decodeTextCompaction(n,i,s,r),e}static decodeTextCompaction(t,e,r,n){let i=X.ALPHA,s=X.ALPHA,o=0;for(;o<r;){let r=t[o],a="";switch(i){case X.ALPHA:if(r<26)a=String.fromCharCode(65+r);else switch(r){case 26:a=" ";break;case nr.LL:i=X.LOWER;break;case nr.ML:i=X.MIXED;break;case nr.PS:s=i,i=X.PUNCT_SHIFT;break;case nr.MODE_SHIFT_TO_BYTE_COMPACTION_MODE:n.append(e[o]);break;case nr.TEXT_COMPACTION_MODE_LATCH:i=X.ALPHA}break;case X.LOWER:if(r<26)a=String.fromCharCode(97+r);else switch(r){case 26:a=" ";break;case nr.AS:s=i,i=X.ALPHA_SHIFT;break;case nr.ML:i=X.MIXED;break;case nr.PS:s=i,i=X.PUNCT_SHIFT;break;case nr.MODE_SHIFT_TO_BYTE_COMPACTION_MODE:n.append(e[o]);break;case nr.TEXT_COMPACTION_MODE_LATCH:i=X.ALPHA}break;case X.MIXED:if(r<nr.PL)a=nr.MIXED_CHARS[r];else switch(r){case nr.PL:i=X.PUNCT;break;case 26:a=" ";break;case nr.LL:i=X.LOWER;break;case nr.AL:i=X.ALPHA;break;case nr.PS:s=i,i=X.PUNCT_SHIFT;break;case nr.MODE_SHIFT_TO_BYTE_COMPACTION_MODE:n.append(e[o]);break;case nr.TEXT_COMPACTION_MODE_LATCH:i=X.ALPHA}break;case X.PUNCT:if(r<nr.PAL)a=nr.PUNCT_CHARS[r];else switch(r){case nr.PAL:i=X.ALPHA;break;case nr.MODE_SHIFT_TO_BYTE_COMPACTION_MODE:n.append(e[o]);break;case nr.TEXT_COMPACTION_MODE_LATCH:i=X.ALPHA}break;case X.ALPHA_SHIFT:if(i=s,r<26)a=String.fromCharCode(65+r);else switch(r){case 26:a=" ";break;case nr.TEXT_COMPACTION_MODE_LATCH:i=X.ALPHA}break;case X.PUNCT_SHIFT:if(i=s,r<nr.PAL)a=nr.PUNCT_CHARS[r];else switch(r){case nr.PAL:i=X.ALPHA;break;case nr.MODE_SHIFT_TO_BYTE_COMPACTION_MODE:n.append(e[o]);break;case nr.TEXT_COMPACTION_MODE_LATCH:i=X.ALPHA}}""!==a&&n.append(a),o++}}static byteCompaction(t,e,r,n,i){let s=new $e,o=0,a=0,l=!1;switch(t){case nr.BYTE_COMPACTION_MODE_LATCH:let t=new Int32Array(6),r=e[n++];for(;n<e[0]&&!l;)switch(t[o++]=r,a=900*a+r,r=e[n++],r){case nr.TEXT_COMPACTION_MODE_LATCH:case nr.BYTE_COMPACTION_MODE_LATCH:case nr.NUMERIC_COMPACTION_MODE_LATCH:case nr.BYTE_COMPACTION_MODE_LATCH_6:case nr.BEGIN_MACRO_PDF417_CONTROL_BLOCK:case nr.BEGIN_MACRO_PDF417_OPTIONAL_FIELD:case nr.MACRO_PDF417_TERMINATOR:n--,l=!0;break;default:if(o%5==0&&o>0){for(let t=0;t<6;++t)s.write(Number(rr(a)>>rr(8*(5-t))));a=0,o=0}}n===e[0]&&r<nr.TEXT_COMPACTION_MODE_LATCH&&(t[o++]=r);for(let e=0;e<o;e++)s.write(t[e]);break;case nr.BYTE_COMPACTION_MODE_LATCH_6:for(;n<e[0]&&!l;){let t=e[n++];if(t<nr.TEXT_COMPACTION_MODE_LATCH)o++,a=900*a+t;else switch(t){case nr.TEXT_COMPACTION_MODE_LATCH:case nr.BYTE_COMPACTION_MODE_LATCH:case nr.NUMERIC_COMPACTION_MODE_LATCH:case nr.BYTE_COMPACTION_MODE_LATCH_6:case nr.BEGIN_MACRO_PDF417_CONTROL_BLOCK:case nr.BEGIN_MACRO_PDF417_OPTIONAL_FIELD:case nr.MACRO_PDF417_TERMINATOR:n--,l=!0}if(o%5==0&&o>0){for(let t=0;t<6;++t)s.write(Number(rr(a)>>rr(8*(5-t))));a=0,o=0}}}return i.append(I.decode(s.toByteArray(),r)),n}static numericCompaction(t,e,r){let n=0,i=!1,s=new Int32Array(nr.MAX_NUMERIC_CODEWORDS);for(;e<t[0]&&!i;){let o=t[e++];if(e===t[0]&&(i=!0),o<nr.TEXT_COMPACTION_MODE_LATCH)s[n]=o,n++;else switch(o){case nr.TEXT_COMPACTION_MODE_LATCH:case nr.BYTE_COMPACTION_MODE_LATCH:case nr.BYTE_COMPACTION_MODE_LATCH_6:case nr.BEGIN_MACRO_PDF417_CONTROL_BLOCK:case nr.BEGIN_MACRO_PDF417_OPTIONAL_FIELD:case nr.MACRO_PDF417_TERMINATOR:e--,i=!0}(n%nr.MAX_NUMERIC_CODEWORDS==0||o===nr.NUMERIC_COMPACTION_MODE_LATCH||i)&&n>0&&(r.append(nr.decodeBase900toBase10(s,n)),n=0)}return e}static decodeBase900toBase10(t,e){let r=rr(0);for(let n=0;n<e;n++)r+=nr.EXP900[e-n-1]*rr(t[n]);let n=r.toString();if("1"!==n.charAt(0))throw new E;return n.substring(1)}}nr.TEXT_COMPACTION_MODE_LATCH=900,nr.BYTE_COMPACTION_MODE_LATCH=901,nr.NUMERIC_COMPACTION_MODE_LATCH=902,nr.BYTE_COMPACTION_MODE_LATCH_6=924,nr.ECI_USER_DEFINED=925,nr.ECI_GENERAL_PURPOSE=926,nr.ECI_CHARSET=927,nr.BEGIN_MACRO_PDF417_CONTROL_BLOCK=928,nr.BEGIN_MACRO_PDF417_OPTIONAL_FIELD=923,nr.MACRO_PDF417_TERMINATOR=922,nr.MODE_SHIFT_TO_BYTE_COMPACTION_MODE=913,nr.MAX_NUMERIC_CODEWORDS=15,nr.MACRO_PDF417_OPTIONAL_FIELD_FILE_NAME=0,nr.MACRO_PDF417_OPTIONAL_FIELD_SEGMENT_COUNT=1,nr.MACRO_PDF417_OPTIONAL_FIELD_TIME_STAMP=2,nr.MACRO_PDF417_OPTIONAL_FIELD_SENDER=3,nr.MACRO_PDF417_OPTIONAL_FIELD_ADDRESSEE=4,nr.MACRO_PDF417_OPTIONAL_FIELD_FILE_SIZE=5,nr.MACRO_PDF417_OPTIONAL_FIELD_CHECKSUM=6,nr.PL=25,nr.LL=27,nr.AS=27,nr.ML=28,nr.AL=28,nr.PS=29,nr.PAL=29,nr.PUNCT_CHARS=";<>@[\\]_`~!\r\t,:\n-.$/\"|*()?{}'",nr.MIXED_CHARS="0123456789&\r\t,:#-.$/+%*=^",nr.EXP900=tr()?function(){let t=[];t[0]=rr(1);let e=rr(900);t[1]=e;for(let r=2;r<16;r++)t[r]=t[r-1]*e;return t}():[],nr.NUMBER_OF_SEQUENCE_CODEWORDS=2;class ir{constructor(){}static decode(t,e,r,n,i,s,o){let a,l=new Ve(t,e,r,n,i),h=null,c=null;for(let r=!0;;r=!1){if(null!=e&&(h=ir.getRowIndicatorColumn(t,l,e,!0,s,o)),null!=n&&(c=ir.getRowIndicatorColumn(t,l,n,!1,s,o)),a=ir.merge(h,c),null==a)throw R.getNotFoundInstance();let i=a.getBoundingBox();if(!r||null==i||!(i.getMinY()<l.getMinY()||i.getMaxY()>l.getMaxY()))break;l=i}a.setBoundingBox(l);let u=a.getBarcodeColumnCount()+1;a.setDetectionResultColumn(0,h),a.setDetectionResultColumn(u,c);let d=null!=h;for(let e=1;e<=u;e++){let r,n=d?e:u-e;if(void 0!==a.getDetectionResultColumn(n))continue;r=0===n||n===u?new We(l,0===n):new Ge(l),a.setDetectionResultColumn(n,r);let i=-1,h=i;for(let e=l.getMinY();e<=l.getMaxY();e++){if(i=ir.getStartColumn(a,n,e,d),i<0||i>l.getMaxX()){if(-1===h)continue;i=h}let c=ir.detectCodeword(t,l.getMinX(),l.getMaxX(),d,i,e,s,o);null!=c&&(r.setCodeword(e,c),h=i,s=Math.min(s,c.getWidth()),o=Math.max(o,c.getWidth()))}}return ir.createDecoderResult(a)}static merge(t,e){if(null==t&&null==e)return null;let r=ir.getBarcodeMetadata(t,e);if(null==r)return null;let n=Ve.merge(ir.adjustBoundingBox(t),ir.adjustBoundingBox(e));return new ze(r,n)}static adjustBoundingBox(t){if(null==t)return null;let e=t.getRowHeights();if(null==e)return null;let r=ir.getMax(e),n=0;for(let t of e)if(n+=r-t,t>0)break;let i=t.getCodewords();for(let t=0;n>0&&null==i[t];t++)n--;let s=0;for(let t=e.length-1;t>=0&&(s+=r-e[t],!(e[t]>0));t--);for(let t=i.length-1;s>0&&null==i[t];t--)s--;return t.getBoundingBox().addMissingRows(n,s,t.isLeft())}static getMax(t){let e=-1;for(let r of t)e=Math.max(e,r);return e}static getBarcodeMetadata(t,e){let r,n;return null==t||null==(r=t.getBarcodeMetadata())?null==e?null:e.getBarcodeMetadata():null==e||null==(n=e.getBarcodeMetadata())?r:r.getColumnCount()!==n.getColumnCount()&&r.getErrorCorrectionLevel()!==n.getErrorCorrectionLevel()&&r.getRowCount()!==n.getRowCount()?null:r}static getRowIndicatorColumn(t,e,r,n,i,s){let o=new We(e,n);for(let a=0;a<2;a++){let l=0===a?1:-1,h=Math.trunc(Math.trunc(r.getX()));for(let a=Math.trunc(Math.trunc(r.getY()));a<=e.getMaxY()&&a>=e.getMinY();a+=l){let e=ir.detectCodeword(t,0,t.getWidth(),n,h,a,i,s);null!=e&&(o.setCodeword(a,e),h=n?e.getStartX():e.getEndX())}}return o}static adjustCodewordCount(t,e){let r=e[0][1],n=r.getValue(),i=t.getBarcodeColumnCount()*t.getBarcodeRowCount()-ir.getNumberOfECCodeWords(t.getBarcodeECLevel());if(0===n.length){if(i<1||i>be.MAX_CODEWORDS_IN_BARCODE)throw R.getNotFoundInstance();r.setValue(i)}else n[0]!==i&&r.setValue(i)}static createDecoderResult(t){let e=ir.createBarcodeMatrix(t);ir.adjustCodewordCount(t,e);let r=new Array,n=new Int32Array(t.getBarcodeRowCount()*t.getBarcodeColumnCount()),i=[],s=new Array;for(let o=0;o<t.getBarcodeRowCount();o++)for(let a=0;a<t.getBarcodeColumnCount();a++){let l=e[o][a+1].getValue(),h=o*t.getBarcodeColumnCount()+a;0===l.length?r.push(h):1===l.length?n[h]=l[0]:(s.push(h),i.push(l))}let o=new Array(i.length);for(let t=0;t<o.length;t++)o[t]=i[t];return ir.createDecoderResultFromAmbiguousValues(t.getBarcodeECLevel(),n,be.toIntArray(r),be.toIntArray(s),o)}static createDecoderResultFromAmbiguousValues(t,e,r,n,i){let s=new Int32Array(n.length),o=100;for(;o-- >0;){for(let t=0;t<s.length;t++)e[n[t]]=i[t][s[t]];try{return ir.decodeCodewords(e,t,r)}catch(t){if(!(t instanceof l))throw t}if(0===s.length)throw l.getChecksumInstance();for(let t=0;t<s.length;t++){if(s[t]<i[t].length-1){s[t]++;break}if(s[t]=0,t===s.length-1)throw l.getChecksumInstance()}}throw l.getChecksumInstance()}static createBarcodeMatrix(t){let e=Array.from({length:t.getBarcodeRowCount()},(()=>new Array(t.getBarcodeColumnCount()+2)));for(let t=0;t<e.length;t++)for(let r=0;r<e[t].length;r++)e[t][r]=new Xe;let r=0;for(let n of t.getDetectionResultColumns()){if(null!=n)for(let t of n.getCodewords())if(null!=t){let n=t.getRowNumber();if(n>=0){if(n>=e.length)continue;e[n][r].setValue(t.getValue())}}r++}return e}static isValidBarcodeColumn(t,e){return e>=0&&e<=t.getBarcodeColumnCount()+1}static getStartColumn(t,e,r,n){let i=n?1:-1,s=null;if(ir.isValidBarcodeColumn(t,e-i)&&(s=t.getDetectionResultColumn(e-i).getCodeword(r)),null!=s)return n?s.getEndX():s.getStartX();if(s=t.getDetectionResultColumn(e).getCodewordNearby(r),null!=s)return n?s.getStartX():s.getEndX();if(ir.isValidBarcodeColumn(t,e-i)&&(s=t.getDetectionResultColumn(e-i).getCodewordNearby(r)),null!=s)return n?s.getEndX():s.getStartX();let o=0;for(;ir.isValidBarcodeColumn(t,e-i);){e-=i;for(let r of t.getDetectionResultColumn(e).getCodewords())if(null!=r)return(n?r.getEndX():r.getStartX())+i*o*(r.getEndX()-r.getStartX());o++}return n?t.getBoundingBox().getMinX():t.getBoundingBox().getMaxX()}static detectCodeword(t,e,r,n,i,s,o,a){i=ir.adjustCodewordStartColumn(t,e,r,n,i,s);let l,h=ir.getModuleBitCount(t,e,r,n,i,s);if(null==h)return null;let c=tt.sum(h);if(n)l=i+c;else{for(let t=0;t<h.length/2;t++){let e=h[t];h[t]=h[h.length-1-t],h[h.length-1-t]=e}l=i,i=l-c}if(!ir.checkCodewordSkew(c,o,a))return null;let u=Ze.getDecodedValue(h),d=be.getCodeword(u);return-1===d?null:new Ye(i,l,ir.getCodewordBucketNumber(u),d)}static getModuleBitCount(t,e,r,n,i,s){let o=i,a=new Int32Array(8),l=0,h=n?1:-1,c=n;for(;(n?o<r:o>=e)&&l<a.length;)t.get(o,s)===c?(a[l]++,o+=h):(l++,c=!c);return l===a.length||o===(n?r:e)&&l===a.length-1?a:null}static getNumberOfECCodeWords(t){return 2<<t}static adjustCodewordStartColumn(t,e,r,n,i,s){let o=i,a=n?-1:1;for(let l=0;l<2;l++){for(;(n?o>=e:o<r)&&n===t.get(o,s);){if(Math.abs(i-o)>ir.CODEWORD_SKEW_SIZE)return i;o+=a}a=-a,n=!n}return o}static checkCodewordSkew(t,e,r){return e-ir.CODEWORD_SKEW_SIZE<=t&&t<=r+ir.CODEWORD_SKEW_SIZE}static decodeCodewords(t,e,r){if(0===t.length)throw E.getFormatInstance();let n=1<<e+1,i=ir.correctErrors(t,r,n);ir.verifyCodewordCount(t,n);let s=nr.decode(t,""+e);return s.setErrorsCorrected(i),s.setErasures(r.length),s}static correctErrors(t,e,r){if(null!=e&&e.length>r/2+ir.MAX_ERRORS||r<0||r>ir.MAX_EC_CODEWORDS)throw l.getChecksumInstance();return ir.errorCorrection.decode(t,r,e)}static verifyCodewordCount(t,e){if(t.length<4)throw E.getFormatInstance();let r=t[0];if(r>t.length)throw E.getFormatInstance();if(0===r){if(!(e<t.length))throw E.getFormatInstance();t[0]=t.length-e}}static getBitCountForCodeword(t){let e=new Int32Array(8),r=0,n=e.length-1;for(;!((1&t)!==r&&(r=1&t,n--,n<0));)e[n]++,t>>=1;return e}static getCodewordBucketNumber(t){return t instanceof Int32Array?this.getCodewordBucketNumber_Int32Array(t):this.getCodewordBucketNumber_number(t)}static getCodewordBucketNumber_number(t){return ir.getCodewordBucketNumber(ir.getBitCountForCodeword(t))}static getCodewordBucketNumber_Int32Array(t){return(t[0]-t[2]+t[4]-t[6]+9)%9}static toString(t){let e=new He;for(let r=0;r<t.length;r++){e.format("Row %2d: ",r);for(let n=0;n<t[r].length;n++){let i=t[r][n];0===i.getValue().length?e.format(" ",null):e.format("%4d(%2d)",i.getValue()[0],i.getConfidence(i.getValue()[0]))}e.format("%n")}return e.toString()}}ir.CODEWORD_SKEW_SIZE=2,ir.MAX_ERRORS=3,ir.MAX_EC_CODEWORDS=512,ir.errorCorrection=new xe;class sr{decode(t,e=null){let r=sr.decode(t,e,!1);if(null==r||0===r.length||null==r[0])throw R.getNotFoundInstance();return r[0]}decodeMultiple(t,e=null){try{return sr.decode(t,e,!0)}catch(t){if(t instanceof E||t instanceof l)throw R.getNotFoundInstance();throw t}}static decode(t,e,r){const n=new Array,i=Le.detectMultiple(t,e,r);for(const t of i.getPoints()){const e=ir.decode(i.getBits(),t[4],t[5],t[6],t[7],sr.getMinCodewordWidth(t),sr.getMaxCodewordWidth(t)),r=new F(e.getText(),e.getRawBytes(),void 0,t,k.PDF_417);r.putMetadata(W.ERROR_CORRECTION_LEVEL,e.getECLevel());const s=e.getOther();null!=s&&r.putMetadata(W.PDF417_EXTRA_METADATA,s),n.push(r)}return n.map((t=>t))}static getMaxWidth(t,e){return null==t||null==e?0:Math.trunc(Math.abs(t.getX()-e.getX()))}static getMinWidth(t,e){return null==t||null==e?f.MAX_VALUE:Math.trunc(Math.abs(t.getX()-e.getX()))}static getMaxCodewordWidth(t){return Math.floor(Math.max(Math.max(sr.getMaxWidth(t[0],t[4]),sr.getMaxWidth(t[6],t[2])*be.MODULES_IN_CODEWORD/be.MODULES_IN_STOP_PATTERN),Math.max(sr.getMaxWidth(t[1],t[5]),sr.getMaxWidth(t[7],t[3])*be.MODULES_IN_CODEWORD/be.MODULES_IN_STOP_PATTERN)))}static getMinCodewordWidth(t){return Math.floor(Math.min(Math.min(sr.getMinWidth(t[0],t[4]),sr.getMinWidth(t[6],t[2])*be.MODULES_IN_CODEWORD/be.MODULES_IN_STOP_PATTERN),Math.min(sr.getMinWidth(t[1],t[5]),sr.getMinWidth(t[7],t[3])*be.MODULES_IN_CODEWORD/be.MODULES_IN_STOP_PATTERN)))}reset(){}}class or extends i{}or.kind="ReaderException";class ar{decode(t,e){return this.setHints(e),this.decodeInternal(t)}decodeWithState(t){return null!==this.readers&&void 0!==this.readers||this.setHints(null),this.decodeInternal(t)}setHints(t){this.hints=t;const e=null!=t&&void 0!==t.get(C.TRY_HARDER),r=null==t?null:t.get(C.POSSIBLE_FORMATS),n=new Array;if(null!=r){const i=r.some((t=>t===k.UPC_A||t===k.UPC_E||t===k.EAN_13||t===k.EAN_8||t===k.CODABAR||t===k.CODE_39||t===k.CODE_93||t===k.CODE_128||t===k.ITF||t===k.RSS_14||t===k.RSS_EXPANDED));i&&!e&&n.push(new re(t)),r.includes(k.QR_CODE)&&n.push(new Be),r.includes(k.DATA_MATRIX)&&n.push(new de),r.includes(k.AZTEC)&&n.push(new dt),r.includes(k.PDF_417)&&n.push(new sr),i&&e&&n.push(new re(t))}0===n.length&&(e||n.push(new re(t)),n.push(new Be),n.push(new de),n.push(new dt),n.push(new sr),e&&n.push(new re(t))),this.readers=n}reset(){if(null!==this.readers)for(const t of this.readers)t.reset()}decodeInternal(t){if(null===this.readers)throw new or("No readers where selected, nothing can be read.");for(const e of this.readers)try{return e.decode(t,this.hints)}catch(t){if(t instanceof or)continue}throw new R("No MultiFormat Readers were able to detect the code.")}}var lr;!function(t){t[t.ERROR_CORRECTION=0]="ERROR_CORRECTION",t[t.CHARACTER_SET=1]="CHARACTER_SET",t[t.DATA_MATRIX_SHAPE=2]="DATA_MATRIX_SHAPE",t[t.MIN_SIZE=3]="MIN_SIZE",t[t.MAX_SIZE=4]="MAX_SIZE",t[t.MARGIN=5]="MARGIN",t[t.PDF417_COMPACT=6]="PDF417_COMPACT",t[t.PDF417_COMPACTION=7]="PDF417_COMPACTION",t[t.PDF417_DIMENSIONS=8]="PDF417_DIMENSIONS",t[t.AZTEC_LAYERS=9]="AZTEC_LAYERS",t[t.QR_VERSION=10]="QR_VERSION"}(lr||(lr={}));var hr=lr;class cr{constructor(t){this.field=t,this.cachedGenerators=[],this.cachedGenerators.push(new Z(t,Int32Array.from([1])))}buildGenerator(t){const e=this.cachedGenerators;if(t>=e.length){let r=e[e.length-1];const n=this.field;for(let i=e.length;i<=t;i++){const t=r.multiply(new Z(n,Int32Array.from([1,n.exp(i-1+n.getGeneratorBase())])));e.push(t),r=t}}return e[t]}encode(t,e){if(0===e)throw new o("No error correction bytes");const r=t.length-e;if(r<=0)throw new o("No data bytes provided");const n=this.buildGenerator(e),i=new Int32Array(r);c.arraycopy(t,0,i,0,r);let s=new Z(this.field,i);s=s.multiplyByMonomial(e,1);const a=s.divide(n)[1].getCoefficients(),l=e-a.length;for(let e=0;e<l;e++)t[r+e]=0;c.arraycopy(a,0,t,r+l,a.length)}}class ur{constructor(){}static applyMaskPenaltyRule1(t){return ur.applyMaskPenaltyRule1Internal(t,!0)+ur.applyMaskPenaltyRule1Internal(t,!1)}static applyMaskPenaltyRule2(t){let e=0;const r=t.getArray(),n=t.getWidth(),i=t.getHeight();for(let t=0;t<i-1;t++){const i=r[t];for(let s=0;s<n-1;s++){const n=i[s];n===i[s+1]&&n===r[t+1][s]&&n===r[t+1][s+1]&&e++}}return ur.N2*e}static applyMaskPenaltyRule3(t){let e=0;const r=t.getArray(),n=t.getWidth(),i=t.getHeight();for(let t=0;t<i;t++)for(let s=0;s<n;s++){const o=r[t];s+6<n&&1===o[s]&&0===o[s+1]&&1===o[s+2]&&1===o[s+3]&&1===o[s+4]&&0===o[s+5]&&1===o[s+6]&&(ur.isWhiteHorizontal(o,s-4,s)||ur.isWhiteHorizontal(o,s+7,s+11))&&e++,t+6<i&&1===r[t][s]&&0===r[t+1][s]&&1===r[t+2][s]&&1===r[t+3][s]&&1===r[t+4][s]&&0===r[t+5][s]&&1===r[t+6][s]&&(ur.isWhiteVertical(r,s,t-4,t)||ur.isWhiteVertical(r,s,t+7,t+11))&&e++}return e*ur.N3}static isWhiteHorizontal(t,e,r){e=Math.max(e,0),r=Math.min(r,t.length);for(let n=e;n<r;n++)if(1===t[n])return!1;return!0}static isWhiteVertical(t,e,r,n){r=Math.max(r,0),n=Math.min(n,t.length);for(let i=r;i<n;i++)if(1===t[i][e])return!1;return!0}static applyMaskPenaltyRule4(t){let e=0;const r=t.getArray(),n=t.getWidth(),i=t.getHeight();for(let t=0;t<i;t++){const i=r[t];for(let t=0;t<n;t++)1===i[t]&&e++}const s=t.getHeight()*t.getWidth();return Math.floor(10*Math.abs(2*e-s)/s)*ur.N4}static getDataMaskBit(t,e,r){let n,i;switch(t){case 0:n=r+e&1;break;case 1:n=1&r;break;case 2:n=e%3;break;case 3:n=(r+e)%3;break;case 4:n=Math.floor(r/2)+Math.floor(e/3)&1;break;case 5:i=r*e,n=(1&i)+i%3;break;case 6:i=r*e,n=(1&i)+i%3&1;break;case 7:i=r*e,n=i%3+(r+e&1)&1;break;default:throw new o("Invalid mask pattern: "+t)}return 0===n}static applyMaskPenaltyRule1Internal(t,e){let r=0;const n=e?t.getHeight():t.getWidth(),i=e?t.getWidth():t.getHeight(),s=t.getArray();for(let t=0;t<n;t++){let n=0,o=-1;for(let a=0;a<i;a++){const i=e?s[t][a]:s[a][t];i===o?n++:(n>=5&&(r+=ur.N1+(n-5)),n=1,o=i)}n>=5&&(r+=ur.N1+(n-5))}return r}}ur.N1=3,ur.N2=3,ur.N3=40,ur.N4=10;class dr{constructor(t,e){this.width=t,this.height=e;const r=new Array(e);for(let n=0;n!==e;n++)r[n]=new Uint8Array(t);this.bytes=r}getHeight(){return this.height}getWidth(){return this.width}get(t,e){return this.bytes[e][t]}getArray(){return this.bytes}setNumber(t,e,r){this.bytes[e][t]=r}setBoolean(t,e,r){this.bytes[e][t]=r?1:0}clear(t){for(const e of this.bytes)g.fill(e,t)}equals(t){if(!(t instanceof dr))return!1;const e=t;if(this.width!==e.width)return!1;if(this.height!==e.height)return!1;for(let t=0,r=this.height;t<r;++t){const r=this.bytes[t],n=e.bytes[t];for(let t=0,e=this.width;t<e;++t)if(r[t]!==n[t])return!1}return!0}toString(){const t=new p;for(let e=0,r=this.height;e<r;++e){const r=this.bytes[e];for(let e=0,n=this.width;e<n;++e)switch(r[e]){case 0:t.append(" 0");break;case 1:t.append(" 1");break;default:t.append(" ")}t.append("\n")}return t.toString()}}class gr{constructor(){this.maskPattern=-1}getMode(){return this.mode}getECLevel(){return this.ecLevel}getVersion(){return this.version}getMaskPattern(){return this.maskPattern}getMatrix(){return this.matrix}toString(){const t=new p;return t.append("<<\n"),t.append(" mode: "),t.append(this.mode?this.mode.toString():"null"),t.append("\n ecLevel: "),t.append(this.ecLevel?this.ecLevel.toString():"null"),t.append("\n version: "),t.append(this.version?this.version.toString():"null"),t.append("\n maskPattern: "),t.append(this.maskPattern.toString()),this.matrix?(t.append("\n matrix:\n"),t.append(this.matrix.toString())):t.append("\n matrix: null\n"),t.append(">>\n"),t.toString()}setMode(t){this.mode=t}setECLevel(t){this.ecLevel=t}setVersion(t){this.version=t}setMaskPattern(t){this.maskPattern=t}setMatrix(t){this.matrix=t}static isValidMaskPattern(t){return t>=0&&t<gr.NUM_MASK_PATTERNS}}gr.NUM_MASK_PATTERNS=8;class fr extends i{}fr.kind="WriterException";class wr{constructor(){}static clearMatrix(t){t.clear(255)}static buildMatrix(t,e,r,n,i){wr.clearMatrix(i),wr.embedBasicPatterns(r,i),wr.embedTypeInfo(e,n,i),wr.maybeEmbedVersionInfo(r,i),wr.embedDataBits(t,n,i)}static embedBasicPatterns(t,e){wr.embedPositionDetectionPatternsAndSeparators(e),wr.embedDarkDotAtLeftBottomCorner(e),wr.maybeEmbedPositionAdjustmentPatterns(t,e),wr.embedTimingPatterns(e)}static embedTypeInfo(t,e,r){const n=new w;wr.makeTypeInfoBits(t,e,n);for(let t=0,e=n.getSize();t<e;++t){const e=n.get(n.getSize()-1-t),i=wr.TYPE_INFO_COORDINATES[t],s=i[0],o=i[1];if(r.setBoolean(s,o,e),t<8){const n=r.getWidth()-t-1,i=8;r.setBoolean(n,i,e)}else{const n=8,i=r.getHeight()-7+(t-8);r.setBoolean(n,i,e)}}}static maybeEmbedVersionInfo(t,e){if(t.getVersionNumber()<7)return;const r=new w;wr.makeVersionInfoBits(t,r);let n=17;for(let t=0;t<6;++t)for(let i=0;i<3;++i){const s=r.get(n);n--,e.setBoolean(t,e.getHeight()-11+i,s),e.setBoolean(e.getHeight()-11+i,t,s)}}static embedDataBits(t,e,r){let n=0,i=-1,s=r.getWidth()-1,o=r.getHeight()-1;for(;s>0;){for(6===s&&(s-=1);o>=0&&o<r.getHeight();){for(let i=0;i<2;++i){const a=s-i;if(!wr.isEmpty(r.get(a,o)))continue;let l;n<t.getSize()?(l=t.get(n),++n):l=!1,255!==e&&ur.getDataMaskBit(e,a,o)&&(l=!l),r.setBoolean(a,o,l)}o+=i}i=-i,o+=i,s-=2}if(n!==t.getSize())throw new fr("Not all bits consumed: "+n+"/"+t.getSize())}static findMSBSet(t){return 32-f.numberOfLeadingZeros(t)}static calculateBCHCode(t,e){if(0===e)throw new o("0 polynomial");const r=wr.findMSBSet(e);for(t<<=r-1;wr.findMSBSet(t)>=r;)t^=e<<wr.findMSBSet(t)-r;return t}static makeTypeInfoBits(t,e,r){if(!gr.isValidMaskPattern(e))throw new fr("Invalid mask pattern");const n=t.getBits()<<3|e;r.appendBits(n,5);const i=wr.calculateBCHCode(n,wr.TYPE_INFO_POLY);r.appendBits(i,10);const s=new w;if(s.appendBits(wr.TYPE_INFO_MASK_PATTERN,15),r.xor(s),15!==r.getSize())throw new fr("should not happen but we got: "+r.getSize())}static makeVersionInfoBits(t,e){e.appendBits(t.getVersionNumber(),6);const r=wr.calculateBCHCode(t.getVersionNumber(),wr.VERSION_INFO_POLY);if(e.appendBits(r,12),18!==e.getSize())throw new fr("should not happen but we got: "+e.getSize())}static isEmpty(t){return 255===t}static embedTimingPatterns(t){for(let e=8;e<t.getWidth()-8;++e){const r=(e+1)%2;wr.isEmpty(t.get(e,6))&&t.setNumber(e,6,r),wr.isEmpty(t.get(6,e))&&t.setNumber(6,e,r)}}static embedDarkDotAtLeftBottomCorner(t){if(0===t.get(8,t.getHeight()-8))throw new fr;t.setNumber(8,t.getHeight()-8,1)}static embedHorizontalSeparationPattern(t,e,r){for(let n=0;n<8;++n){if(!wr.isEmpty(r.get(t+n,e)))throw new fr;r.setNumber(t+n,e,0)}}static embedVerticalSeparationPattern(t,e,r){for(let n=0;n<7;++n){if(!wr.isEmpty(r.get(t,e+n)))throw new fr;r.setNumber(t,e+n,0)}}static embedPositionAdjustmentPattern(t,e,r){for(let n=0;n<5;++n){const i=wr.POSITION_ADJUSTMENT_PATTERN[n];for(let s=0;s<5;++s)r.setNumber(t+s,e+n,i[s])}}static embedPositionDetectionPattern(t,e,r){for(let n=0;n<7;++n){const i=wr.POSITION_DETECTION_PATTERN[n];for(let s=0;s<7;++s)r.setNumber(t+s,e+n,i[s])}}static embedPositionDetectionPatternsAndSeparators(t){const e=wr.POSITION_DETECTION_PATTERN[0].length;wr.embedPositionDetectionPattern(0,0,t),wr.embedPositionDetectionPattern(t.getWidth()-e,0,t),wr.embedPositionDetectionPattern(0,t.getWidth()-e,t);wr.embedHorizontalSeparationPattern(0,7,t),wr.embedHorizontalSeparationPattern(t.getWidth()-8,7,t),wr.embedHorizontalSeparationPattern(0,t.getWidth()-8,t);wr.embedVerticalSeparationPattern(7,0,t),wr.embedVerticalSeparationPattern(t.getHeight()-7-1,0,t),wr.embedVerticalSeparationPattern(7,t.getHeight()-7,t)}static maybeEmbedPositionAdjustmentPatterns(t,e){if(t.getVersionNumber()<2)return;const r=t.getVersionNumber()-1,n=wr.POSITION_ADJUSTMENT_PATTERN_COORDINATE_TABLE[r];for(let t=0,r=n.length;t!==r;t++){const i=n[t];if(i>=0)for(let t=0;t!==r;t++){const r=n[t];r>=0&&wr.isEmpty(e.get(r,i))&&wr.embedPositionAdjustmentPattern(r-2,i-2,e)}}}}wr.POSITION_DETECTION_PATTERN=Array.from([Int32Array.from([1,1,1,1,1,1,1]),Int32Array.from([1,0,0,0,0,0,1]),Int32Array.from([1,0,1,1,1,0,1]),Int32Array.from([1,0,1,1,1,0,1]),Int32Array.from([1,0,1,1,1,0,1]),Int32Array.from([1,0,0,0,0,0,1]),Int32Array.from([1,1,1,1,1,1,1])]),wr.POSITION_ADJUSTMENT_PATTERN=Array.from([Int32Array.from([1,1,1,1,1]),Int32Array.from([1,0,0,0,1]),Int32Array.from([1,0,1,0,1]),Int32Array.from([1,0,0,0,1]),Int32Array.from([1,1,1,1,1])]),wr.POSITION_ADJUSTMENT_PATTERN_COORDINATE_TABLE=Array.from([Int32Array.from([-1,-1,-1,-1,-1,-1,-1]),Int32Array.from([6,18,-1,-1,-1,-1,-1]),Int32Array.from([6,22,-1,-1,-1,-1,-1]),Int32Array.from([6,26,-1,-1,-1,-1,-1]),Int32Array.from([6,30,-1,-1,-1,-1,-1]),Int32Array.from([6,34,-1,-1,-1,-1,-1]),Int32Array.from([6,22,38,-1,-1,-1,-1]),Int32Array.from([6,24,42,-1,-1,-1,-1]),Int32Array.from([6,26,46,-1,-1,-1,-1]),Int32Array.from([6,28,50,-1,-1,-1,-1]),Int32Array.from([6,30,54,-1,-1,-1,-1]),Int32Array.from([6,32,58,-1,-1,-1,-1]),Int32Array.from([6,34,62,-1,-1,-1,-1]),Int32Array.from([6,26,46,66,-1,-1,-1]),Int32Array.from([6,26,48,70,-1,-1,-1]),Int32Array.from([6,26,50,74,-1,-1,-1]),Int32Array.from([6,30,54,78,-1,-1,-1]),Int32Array.from([6,30,56,82,-1,-1,-1]),Int32Array.from([6,30,58,86,-1,-1,-1]),Int32Array.from([6,34,62,90,-1,-1,-1]),Int32Array.from([6,28,50,72,94,-1,-1]),Int32Array.from([6,26,50,74,98,-1,-1]),Int32Array.from([6,30,54,78,102,-1,-1]),Int32Array.from([6,28,54,80,106,-1,-1]),Int32Array.from([6,32,58,84,110,-1,-1]),Int32Array.from([6,30,58,86,114,-1,-1]),Int32Array.from([6,34,62,90,118,-1,-1]),Int32Array.from([6,26,50,74,98,122,-1]),Int32Array.from([6,30,54,78,102,126,-1]),Int32Array.from([6,26,52,78,104,130,-1]),Int32Array.from([6,30,56,82,108,134,-1]),Int32Array.from([6,34,60,86,112,138,-1]),Int32Array.from([6,30,58,86,114,142,-1]),Int32Array.from([6,34,62,90,118,146,-1]),Int32Array.from([6,30,54,78,102,126,150]),Int32Array.from([6,24,50,76,102,128,154]),Int32Array.from([6,28,54,80,106,132,158]),Int32Array.from([6,32,58,84,110,136,162]),Int32Array.from([6,26,54,82,110,138,166]),Int32Array.from([6,30,58,86,114,142,170])]),wr.TYPE_INFO_COORDINATES=Array.from([Int32Array.from([8,0]),Int32Array.from([8,1]),Int32Array.from([8,2]),Int32Array.from([8,3]),Int32Array.from([8,4]),Int32Array.from([8,5]),Int32Array.from([8,7]),Int32Array.from([8,8]),Int32Array.from([7,8]),Int32Array.from([5,8]),Int32Array.from([4,8]),Int32Array.from([3,8]),Int32Array.from([2,8]),Int32Array.from([1,8]),Int32Array.from([0,8])]),wr.VERSION_INFO_POLY=7973,wr.TYPE_INFO_POLY=1335,wr.TYPE_INFO_MASK_PATTERN=21522;class Ar{constructor(t,e){this.dataBytes=t,this.errorCorrectionBytes=e}getDataBytes(){return this.dataBytes}getErrorCorrectionBytes(){return this.errorCorrectionBytes}}class Cr{constructor(){}static calculateMaskPenalty(t){return ur.applyMaskPenaltyRule1(t)+ur.applyMaskPenaltyRule2(t)+ur.applyMaskPenaltyRule3(t)+ur.applyMaskPenaltyRule4(t)}static encode(t,e,r=null){let n=Cr.DEFAULT_BYTE_MODE_ENCODING;const i=null!==r&&void 0!==r.get(hr.CHARACTER_SET);i&&(n=r.get(hr.CHARACTER_SET).toString());const s=this.chooseMode(t,n),o=new w;if(s===Ie.BYTE&&(i||Cr.DEFAULT_BYTE_MODE_ENCODING!==n)){const t=m.getCharacterSetECIByName(n);void 0!==t&&this.appendECI(t,o)}this.appendModeInfo(s,o);const a=new w;let l;if(this.appendBytes(t,s,a,n),null!==r&&void 0!==r.get(hr.QR_VERSION)){const t=Number.parseInt(r.get(hr.QR_VERSION).toString(),10);l=Ce.getVersionForNumber(t);const n=this.calculateBitsNeeded(s,o,a,l);if(!this.willFit(n,l,e))throw new fr("Data too big for requested version")}else l=this.recommendVersion(e,s,o,a);const h=new w;h.appendBitArray(o);const c=s===Ie.BYTE?a.getSizeInBytes():t.length;this.appendLengthInfo(c,l,s,h),h.appendBitArray(a);const u=l.getECBlocksForLevel(e),d=l.getTotalCodewords()-u.getTotalECCodewords();this.terminateBits(d,h);const g=this.interleaveWithECBytes(h,l.getTotalCodewords(),d,u.getNumBlocks()),f=new gr;f.setECLevel(e),f.setMode(s),f.setVersion(l);const A=l.getDimensionForVersion(),C=new dr(A,A),E=this.chooseMaskPattern(g,e,l,C);return f.setMaskPattern(E),wr.buildMatrix(g,e,l,E,C),f.setMatrix(C),f}static recommendVersion(t,e,r,n){const i=this.calculateBitsNeeded(e,r,n,Ce.getVersionForNumber(1)),s=this.chooseVersion(i,t),o=this.calculateBitsNeeded(e,r,n,s);return this.chooseVersion(o,t)}static calculateBitsNeeded(t,e,r,n){return e.getSize()+t.getCharacterCountBits(n)+r.getSize()}static getAlphanumericCode(t){return t<Cr.ALPHANUMERIC_TABLE.length?Cr.ALPHANUMERIC_TABLE[t]:-1}static chooseMode(t,e=null){if(m.SJIS.getName()===e&&this.isOnlyDoubleByteKanji(t))return Ie.KANJI;let r=!1,n=!1;for(let e=0,i=t.length;e<i;++e){const i=t.charAt(e);if(Cr.isDigit(i))r=!0;else{if(-1===this.getAlphanumericCode(i.charCodeAt(0)))return Ie.BYTE;n=!0}}return n?Ie.ALPHANUMERIC:r?Ie.NUMERIC:Ie.BYTE}static isOnlyDoubleByteKanji(t){let e;try{e=I.encode(t,m.SJIS)}catch(t){return!1}const r=e.length;if(r%2!=0)return!1;for(let t=0;t<r;t+=2){const r=255&e[t];if((r<129||r>159)&&(r<224||r>235))return!1}return!0}static chooseMaskPattern(t,e,r,n){let i=Number.MAX_SAFE_INTEGER,s=-1;for(let o=0;o<gr.NUM_MASK_PATTERNS;o++){wr.buildMatrix(t,e,r,o,n);let a=this.calculateMaskPenalty(n);a<i&&(i=a,s=o)}return s}static chooseVersion(t,e){for(let r=1;r<=40;r++){const n=Ce.getVersionForNumber(r);if(Cr.willFit(t,n,e))return n}throw new fr("Data too big")}static willFit(t,e,r){return e.getTotalCodewords()-e.getECBlocksForLevel(r).getTotalECCodewords()>=(t+7)/8}static terminateBits(t,e){const r=8*t;if(e.getSize()>r)throw new fr("data bits cannot fit in the QR Code"+e.getSize()+" > "+r);for(let t=0;t<4&&e.getSize()<r;++t)e.appendBit(!1);const n=7&e.getSize();if(n>0)for(let t=n;t<8;t++)e.appendBit(!1);const i=t-e.getSizeInBytes();for(let t=0;t<i;++t)e.appendBits(0==(1&t)?236:17,8);if(e.getSize()!==r)throw new fr("Bits size does not equal capacity")}static getNumDataBytesAndNumECBytesForBlockID(t,e,r,n,i,s){if(n>=r)throw new fr("Block ID too large");const o=t%r,a=r-o,l=Math.floor(t/r),h=l+1,c=Math.floor(e/r),u=c+1,d=l-c,g=h-u;if(d!==g)throw new fr("EC bytes mismatch");if(r!==a+o)throw new fr("RS blocks mismatch");if(t!==(c+d)*a+(u+g)*o)throw new fr("Total bytes mismatch");n<a?(i[0]=c,s[0]=d):(i[0]=u,s[0]=g)}static interleaveWithECBytes(t,e,r,n){if(t.getSizeInBytes()!==r)throw new fr("Number of bits and data bytes does not match");let i=0,s=0,o=0;const a=new Array;for(let l=0;l<n;++l){const h=new Int32Array(1),c=new Int32Array(1);Cr.getNumDataBytesAndNumECBytesForBlockID(e,r,n,l,h,c);const u=h[0],d=new Uint8Array(u);t.toBytes(8*i,d,0,u);const g=Cr.generateECBytes(d,c[0]);a.push(new Ar(d,g)),s=Math.max(s,u),o=Math.max(o,g.length),i+=h[0]}if(r!==i)throw new fr("Data bytes does not match offset");const l=new w;for(let t=0;t<s;++t)for(const e of a){const r=e.getDataBytes();t<r.length&&l.appendBits(r[t],8)}for(let t=0;t<o;++t)for(const e of a){const r=e.getErrorCorrectionBytes();t<r.length&&l.appendBits(r[t],8)}if(e!==l.getSizeInBytes())throw new fr("Interleaving error: "+e+" and "+l.getSizeInBytes()+" differ.");return l}static generateECBytes(t,e){const r=t.length,n=new Int32Array(r+e);for(let e=0;e<r;e++)n[e]=255&t[e];new cr(q.QR_CODE_FIELD_256).encode(n,e);const i=new Uint8Array(e);for(let t=0;t<e;t++)i[t]=n[r+t];return i}static appendModeInfo(t,e){e.appendBits(t.getBits(),4)}static appendLengthInfo(t,e,r,n){const i=r.getCharacterCountBits(e);if(t>=1<<i)throw new fr(t+" is bigger than "+((1<<i)-1));n.appendBits(t,i)}static appendBytes(t,e,r,n){switch(e){case Ie.NUMERIC:Cr.appendNumericBytes(t,r);break;case Ie.ALPHANUMERIC:Cr.appendAlphanumericBytes(t,r);break;case Ie.BYTE:Cr.append8BitBytes(t,r,n);break;case Ie.KANJI:Cr.appendKanjiBytes(t,r);break;default:throw new fr("Invalid mode: "+e)}}static getDigit(t){return t.charCodeAt(0)-48}static isDigit(t){const e=Cr.getDigit(t);return e>=0&&e<=9}static appendNumericBytes(t,e){const r=t.length;let n=0;for(;n<r;){const i=Cr.getDigit(t.charAt(n));if(n+2<r){const r=Cr.getDigit(t.charAt(n+1)),s=Cr.getDigit(t.charAt(n+2));e.appendBits(100*i+10*r+s,10),n+=3}else if(n+1<r){const r=Cr.getDigit(t.charAt(n+1));e.appendBits(10*i+r,7),n+=2}else e.appendBits(i,4),n++}}static appendAlphanumericBytes(t,e){const r=t.length;let n=0;for(;n<r;){const i=Cr.getAlphanumericCode(t.charCodeAt(n));if(-1===i)throw new fr;if(n+1<r){const r=Cr.getAlphanumericCode(t.charCodeAt(n+1));if(-1===r)throw new fr;e.appendBits(45*i+r,11),n+=2}else e.appendBits(i,6),n++}}static append8BitBytes(t,e,r){let n;try{n=I.encode(t,r)}catch(t){throw new fr(t)}for(let t=0,r=n.length;t!==r;t++){const r=n[t];e.appendBits(r,8)}}static appendKanjiBytes(t,e){let r;try{r=I.encode(t,m.SJIS)}catch(t){throw new fr(t)}const n=r.length;for(let t=0;t<n;t+=2){const n=(255&r[t])<<8&4294967295|255&r[t+1];let i=-1;if(n>=33088&&n<=40956?i=n-33088:n>=57408&&n<=60351&&(i=n-49472),-1===i)throw new fr("Invalid byte sequence");const s=192*(i>>8)+(255&i);e.appendBits(s,13)}}static appendECI(t,e){e.appendBits(Ie.ECI.getBits(),4),e.appendBits(t.getValue(),8)}}Cr.ALPHANUMERIC_TABLE=Int32Array.from([-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,36,-1,-1,-1,37,38,-1,-1,-1,-1,39,40,-1,41,42,43,0,1,2,3,4,5,6,7,8,9,44,-1,-1,-1,-1,-1,-1,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,-1,-1,-1,-1,-1]),Cr.DEFAULT_BYTE_MODE_ENCODING=m.UTF8.getName();class Er{write(t,e,r,n=null){if(0===t.length)throw new o("Found empty contents");if(e<0||r<0)throw new o("Requested dimensions are too small: "+e+"x"+r);let i=ge.L,s=Er.QUIET_ZONE_SIZE;null!==n&&(void 0!==n.get(hr.ERROR_CORRECTION)&&(i=ge.fromString(n.get(hr.ERROR_CORRECTION).toString())),void 0!==n.get(hr.MARGIN)&&(s=Number.parseInt(n.get(hr.MARGIN).toString(),10)));const a=Cr.encode(t,i,n);return this.renderResult(a,e,r,s)}writeToDom(t,e,r,n,i=null){"string"==typeof t&&(t=document.querySelector(t));const s=this.write(e,r,n,i);t&&t.appendChild(s)}renderResult(t,e,r,n){const i=t.getMatrix();if(null===i)throw new j;const s=i.getWidth(),o=i.getHeight(),a=s+2*n,l=o+2*n,h=Math.max(e,a),c=Math.max(r,l),u=Math.min(Math.floor(h/a),Math.floor(c/l)),d=Math.floor((h-s*u)/2),g=Math.floor((c-o*u)/2),f=this.createSVGElement(h,c);for(let t=0,e=g;t<o;t++,e+=u)for(let r=0,n=d;r<s;r++,n+=u)if(1===i.get(r,t)){const t=this.createSvgRectElement(n,e,u,u);f.appendChild(t)}return f}createSVGElement(t,e){const r=document.createElementNS(Er.SVG_NS,"svg");return r.setAttributeNS(null,"height",t.toString()),r.setAttributeNS(null,"width",e.toString()),r}createSvgRectElement(t,e,r,n){const i=document.createElementNS(Er.SVG_NS,"rect");return i.setAttributeNS(null,"x",t.toString()),i.setAttributeNS(null,"y",e.toString()),i.setAttributeNS(null,"height",r.toString()),i.setAttributeNS(null,"width",n.toString()),i.setAttributeNS(null,"fill","#000000"),i}}Er.QUIET_ZONE_SIZE=4,Er.SVG_NS="http://www.w3.org/2000/svg";class mr{encode(t,e,r,n,i){if(0===t.length)throw new o("Found empty contents");if(e!==k.QR_CODE)throw new o("Can only encode QR_CODE, but got "+e);if(r<0||n<0)throw new o(`Requested dimensions are too small: ${r}x${n}`);let s=ge.L,a=mr.QUIET_ZONE_SIZE;null!==i&&(void 0!==i.get(hr.ERROR_CORRECTION)&&(s=ge.fromString(i.get(hr.ERROR_CORRECTION).toString())),void 0!==i.get(hr.MARGIN)&&(a=Number.parseInt(i.get(hr.MARGIN).toString(),10)));const l=Cr.encode(t,s,i);return mr.renderResult(l,r,n,a)}static renderResult(t,e,r,n){const i=t.getMatrix();if(null===i)throw new j;const s=i.getWidth(),o=i.getHeight(),a=s+2*n,l=o+2*n,h=Math.max(e,a),c=Math.max(r,l),u=Math.min(Math.floor(h/a),Math.floor(c/l)),d=Math.floor((h-s*u)/2),g=Math.floor((c-o*u)/2),f=new T(h,c);for(let t=0,e=g;t<o;t++,e+=u)for(let r=0,n=d;r<s;r++,n+=u)1===i.get(r,t)&&f.setRegion(n,e,u,u);return f}}mr.QUIET_ZONE_SIZE=4;class _r extends D{constructor(t,e,r,n,i,s,a,l){if(super(s,a),this.yuvData=t,this.dataWidth=e,this.dataHeight=r,this.left=n,this.top=i,n+s>e||i+a>r)throw new o("Crop rectangle does not fit within image data.");l&&this.reverseHorizontal(s,a)}getRow(t,e){if(t<0||t>=this.getHeight())throw new o("Requested row is outside the image: "+t);const r=this.getWidth();(null==e||e.length<r)&&(e=new Uint8ClampedArray(r));const n=(t+this.top)*this.dataWidth+this.left;return c.arraycopy(this.yuvData,n,e,0,r),e}getMatrix(){const t=this.getWidth(),e=this.getHeight();if(t===this.dataWidth&&e===this.dataHeight)return this.yuvData;const r=t*e,n=new Uint8ClampedArray(r);let i=this.top*this.dataWidth+this.left;if(t===this.dataWidth)return c.arraycopy(this.yuvData,i,n,0,r),n;for(let r=0;r<e;r++){const e=r*t;c.arraycopy(this.yuvData,i,n,e,t),i+=this.dataWidth}return n}isCropSupported(){return!0}crop(t,e,r,n){return new _r(this.yuvData,this.dataWidth,this.dataHeight,this.left+t,this.top+e,r,n,!1)}renderThumbnail(){const t=this.getWidth()/_r.THUMBNAIL_SCALE_FACTOR,e=this.getHeight()/_r.THUMBNAIL_SCALE_FACTOR,r=new Int32Array(t*e),n=this.yuvData;let i=this.top*this.dataWidth+this.left;for(let s=0;s<e;s++){const e=s*t;for(let s=0;s<t;s++){const t=255&n[i+s*_r.THUMBNAIL_SCALE_FACTOR];r[e+s]=4278190080|65793*t}i+=this.dataWidth*_r.THUMBNAIL_SCALE_FACTOR}return r}getThumbnailWidth(){return this.getWidth()/_r.THUMBNAIL_SCALE_FACTOR}getThumbnailHeight(){return this.getHeight()/_r.THUMBNAIL_SCALE_FACTOR}reverseHorizontal(t,e){const r=this.yuvData;for(let n=0,i=this.top*this.dataWidth+this.left;n<e;n++,i+=this.dataWidth){const e=i+t/2;for(let n=i,s=i+t-1;n<e;n++,s--){const t=r[n];r[n]=r[s],r[s]=t}}}invert(){return new O(this)}}_r.THUMBNAIL_SCALE_FACTOR=2;class Ir extends D{constructor(t,e,r,n,i,s,a){if(super(e,r),this.dataWidth=n,this.dataHeight=i,this.left=s,this.top=a,4===t.BYTES_PER_ELEMENT){const n=e*r,i=new Uint8ClampedArray(n);for(let e=0;e<n;e++){const r=t[e],n=r>>16&255,s=r>>7&510,o=255&r;i[e]=(n+s+o)/4&255}this.luminances=i}else this.luminances=t;if(void 0===n&&(this.dataWidth=e),void 0===i&&(this.dataHeight=r),void 0===s&&(this.left=0),void 0===a&&(this.top=0),this.left+e>this.dataWidth||this.top+r>this.dataHeight)throw new o("Crop rectangle does not fit within image data.")}getRow(t,e){if(t<0||t>=this.getHeight())throw new o("Requested row is outside the image: "+t);const r=this.getWidth();(null==e||e.length<r)&&(e=new Uint8ClampedArray(r));const n=(t+this.top)*this.dataWidth+this.left;return c.arraycopy(this.luminances,n,e,0,r),e}getMatrix(){const t=this.getWidth(),e=this.getHeight();if(t===this.dataWidth&&e===this.dataHeight)return this.luminances;const r=t*e,n=new Uint8ClampedArray(r);let i=this.top*this.dataWidth+this.left;if(t===this.dataWidth)return c.arraycopy(this.luminances,i,n,0,r),n;for(let r=0;r<e;r++){const e=r*t;c.arraycopy(this.luminances,i,n,e,t),i+=this.dataWidth}return n}isCropSupported(){return!0}crop(t,e,r,n){return new Ir(this.luminances,r,n,this.dataWidth,this.dataHeight,this.left+t,this.top+e)}invert(){return new O(this)}}class Sr extends m{static forName(t){return this.getCharacterSetECIByName(t)}}class pr{}pr.ISO_8859_1=m.ISO8859_1;class Tr{isCompact(){return this.compact}setCompact(t){this.compact=t}getSize(){return this.size}setSize(t){this.size=t}getLayers(){return this.layers}setLayers(t){this.layers=t}getCodeWords(){return this.codeWords}setCodeWords(t){this.codeWords=t}getMatrix(){return this.matrix}setMatrix(t){this.matrix=t}}class Rr{static singletonList(t){return[t]}static min(t,e){return t.sort(e)[0]}}class Nr{constructor(t){this.previous=t}getPrevious(){return this.previous}}class yr extends Nr{constructor(t,e,r){super(t),this.value=e,this.bitCount=r}appendTo(t,e){t.appendBits(this.value,this.bitCount)}add(t,e){return new yr(this,t,e)}addBinaryShift(t,e){return console.warn("addBinaryShift on SimpleToken, this simply returns a copy of this token"),new yr(this,t,e)}toString(){let t=this.value&(1<<this.bitCount)-1;return t|=1<<this.bitCount,"<"+f.toBinaryString(t|1<<this.bitCount).substring(1)+">"}}class Dr extends yr{constructor(t,e,r){super(t,0,0),this.binaryShiftStart=e,this.binaryShiftByteCount=r}appendTo(t,e){for(let r=0;r<this.binaryShiftByteCount;r++)(0===r||31===r&&this.binaryShiftByteCount<=62)&&(t.appendBits(31,5),this.binaryShiftByteCount>62?t.appendBits(this.binaryShiftByteCount-31,16):0===r?t.appendBits(Math.min(this.binaryShiftByteCount,31),5):t.appendBits(this.binaryShiftByteCount-31,5)),t.appendBits(e[this.binaryShiftStart+r],8)}addBinaryShift(t,e){return new Dr(this,t,e)}toString(){return"<"+this.binaryShiftStart+"::"+(this.binaryShiftStart+this.binaryShiftByteCount-1)+">"}}function Or(t,e,r){return new yr(t,e,r)}const Mr=["UPPER","LOWER","DIGIT","MIXED","PUNCT"],Br=new yr(null,0,0),br=[Int32Array.from([0,327708,327710,327709,656318]),Int32Array.from([590318,0,327710,327709,656318]),Int32Array.from([262158,590300,0,590301,932798]),Int32Array.from([327709,327708,656318,0,327710]),Int32Array.from([327711,656380,656382,656381,0])];const Pr=function(t){for(let e of t)g.fill(e,-1);return t[0][4]=0,t[1][4]=0,t[1][0]=28,t[3][4]=0,t[2][4]=0,t[2][0]=15,t}(g.createInt32Array(6,6));class Lr{constructor(t,e,r,n){this.token=t,this.mode=e,this.binaryShiftByteCount=r,this.bitCount=n}getMode(){return this.mode}getToken(){return this.token}getBinaryShiftByteCount(){return this.binaryShiftByteCount}getBitCount(){return this.bitCount}latchAndAppend(t,e){let r=this.bitCount,n=this.token;if(t!==this.mode){let e=br[this.mode][t];n=Or(n,65535&e,e>>16),r+=e>>16}let i=2===t?4:5;return n=Or(n,e,i),new Lr(n,t,0,r+i)}shiftAndAppend(t,e){let r=this.token,n=2===this.mode?4:5;return r=Or(r,Pr[this.mode][t],n),r=Or(r,e,5),new Lr(r,this.mode,0,this.bitCount+n+5)}addBinaryShiftChar(t){let e=this.token,r=this.mode,n=this.bitCount;if(4===this.mode||2===this.mode){let t=br[r][0];e=Or(e,65535&t,t>>16),n+=t>>16,r=0}let i=0===this.binaryShiftByteCount||31===this.binaryShiftByteCount?18:62===this.binaryShiftByteCount?9:8,s=new Lr(e,r,this.binaryShiftByteCount+1,n+i);return 2078===s.binaryShiftByteCount&&(s=s.endBinaryShift(t+1)),s}endBinaryShift(t){if(0===this.binaryShiftByteCount)return this;let e=this.token;return e=function(t,e,r){return new Dr(t,e,r)}(e,t-this.binaryShiftByteCount,this.binaryShiftByteCount),new Lr(e,this.mode,0,this.bitCount)}isBetterThanOrEqualTo(t){let e=this.bitCount+(br[this.mode][t.mode]>>16);return this.binaryShiftByteCount<t.binaryShiftByteCount?e+=Lr.calculateBinaryShiftCost(t)-Lr.calculateBinaryShiftCost(this):this.binaryShiftByteCount>t.binaryShiftByteCount&&t.binaryShiftByteCount>0&&(e+=10),e<=t.bitCount}toBitArray(t){let e=[];for(let r=this.endBinaryShift(t.length).token;null!==r;r=r.getPrevious())e.unshift(r);let r=new w;for(const n of e)n.appendTo(r,t);return r}toString(){return S.format("%s bits=%d bytes=%d",Mr[this.mode],this.bitCount,this.binaryShiftByteCount)}static calculateBinaryShiftCost(t){return t.binaryShiftByteCount>62?21:t.binaryShiftByteCount>31?20:t.binaryShiftByteCount>0?10:0}}Lr.INITIAL_STATE=new Lr(Br,0,0,0);const Fr=function(t){const e=S.getCharCode(" "),r=S.getCharCode("."),n=S.getCharCode(",");t[0][e]=1;const i=S.getCharCode("Z"),s=S.getCharCode("A");for(let e=s;e<=i;e++)t[0][e]=e-s+2;t[1][e]=1;const o=S.getCharCode("z"),a=S.getCharCode("a");for(let e=a;e<=o;e++)t[1][e]=e-a+2;t[2][e]=1;const l=S.getCharCode("9"),h=S.getCharCode("0");for(let e=h;e<=l;e++)t[2][e]=e-h+2;t[2][n]=12,t[2][r]=13;const c=["\0"," ","","","","","","","","\b","\t","\n","\v","\f","\r","","","","","","@","\\","^","_","`","|","~",""];for(let e=0;e<c.length;e++)t[3][S.getCharCode(c[e])]=e;const u=["\0","\r","\0","\0","\0","\0","!","'","#","$","%","&","'","(",")","*","+",",","-",".","/",":",";","<","=",">","?","[","]","{","}"];for(let e=0;e<u.length;e++)S.getCharCode(u[e])>0&&(t[4][S.getCharCode(u[e])]=e);return t}(g.createInt32Array(5,256));class vr{constructor(t){this.text=t}encode(){const t=S.getCharCode(" "),e=S.getCharCode("\n");let r=Rr.singletonList(Lr.INITIAL_STATE);for(let n=0;n<this.text.length;n++){let i,s=n+1<this.text.length?this.text[n+1]:0;switch(this.text[n]){case S.getCharCode("\r"):i=s===e?2:0;break;case S.getCharCode("."):i=s===t?3:0;break;case S.getCharCode(","):i=s===t?4:0;break;case S.getCharCode(":"):i=s===t?5:0;break;default:i=0}i>0?(r=vr.updateStateListForPair(r,n,i),n++):r=this.updateStateListForChar(r,n)}return Rr.min(r,((t,e)=>t.getBitCount()-e.getBitCount())).toBitArray(this.text)}updateStateListForChar(t,e){const r=[];for(let n of t)this.updateStateForChar(n,e,r);return vr.simplifyStates(r)}updateStateForChar(t,e,r){let n=255&this.text[e],i=Fr[t.getMode()][n]>0,s=null;for(let o=0;o<=4;o++){let a=Fr[o][n];if(a>0){if(null==s&&(s=t.endBinaryShift(e)),!i||o===t.getMode()||2===o){const t=s.latchAndAppend(o,a);r.push(t)}if(!i&&Pr[t.getMode()][o]>=0){const t=s.shiftAndAppend(o,a);r.push(t)}}}if(t.getBinaryShiftByteCount()>0||0===Fr[t.getMode()][n]){let n=t.addBinaryShiftChar(e);r.push(n)}}static updateStateListForPair(t,e,r){const n=[];for(let i of t)this.updateStateForPair(i,e,r,n);return this.simplifyStates(n)}static updateStateForPair(t,e,r,n){let i=t.endBinaryShift(e);if(n.push(i.latchAndAppend(4,r)),4!==t.getMode()&&n.push(i.shiftAndAppend(4,r)),3===r||4===r){let t=i.latchAndAppend(2,16-r).latchAndAppend(2,1);n.push(t)}if(t.getBinaryShiftByteCount()>0){let r=t.addBinaryShiftChar(e).addBinaryShiftChar(e+1);n.push(r)}}static simplifyStates(t){let e=[];for(const r of t){let t=!0;for(const n of e){if(n.isBetterThanOrEqualTo(r)){t=!1;break}r.isBetterThanOrEqualTo(n)&&(e=e.filter((t=>t!==n)))}t&&e.push(r)}return e}}class kr{constructor(){}static encodeBytes(t){return kr.encode(t,kr.DEFAULT_EC_PERCENT,kr.DEFAULT_AZTEC_LAYERS)}static encode(t,e,r){let n,i,s,a,l,h=new vr(t).encode(),c=f.truncDivision(h.getSize()*e,100)+11,u=h.getSize()+c;if(r!==kr.DEFAULT_AZTEC_LAYERS){if(n=r<0,i=Math.abs(r),i>(n?kr.MAX_NB_BITS_COMPACT:kr.MAX_NB_BITS))throw new o(S.format("Illegal value %s for layers",r));s=kr.totalBitsInLayer(i,n),a=kr.WORD_SIZE[i];let t=s-s%a;if(l=kr.stuffBits(h,a),l.getSize()+c>t)throw new o("Data to large for user specified layer");if(n&&l.getSize()>64*a)throw new o("Data to large for user specified layer")}else{a=0,l=null;for(let t=0;;t++){if(t>kr.MAX_NB_BITS)throw new o("Data too large for an Aztec code");if(n=t<=3,i=n?t+1:t,s=kr.totalBitsInLayer(i,n),u>s)continue;null!=l&&a===kr.WORD_SIZE[i]||(a=kr.WORD_SIZE[i],l=kr.stuffBits(h,a));let e=s-s%a;if(!(n&&l.getSize()>64*a)&&l.getSize()+c<=e)break}}let d,g=kr.generateCheckWords(l,s,a),w=l.getSize()/a,A=kr.generateModeMessage(n,i,w),C=(n?11:14)+4*i,E=new Int32Array(C);if(n){d=C;for(let t=0;t<E.length;t++)E[t]=t}else{d=C+1+2*f.truncDivision(f.truncDivision(C,2)-1,15);let t=f.truncDivision(C,2),e=f.truncDivision(d,2);for(let r=0;r<t;r++){let n=r+f.truncDivision(r,15);E[t-r-1]=e-n-1,E[t+r]=e+n+1}}let m=new T(d);for(let t=0,e=0;t<i;t++){let r=4*(i-t)+(n?9:12);for(let n=0;n<r;n++){let i=2*n;for(let s=0;s<2;s++)g.get(e+i+s)&&m.set(E[2*t+s],E[2*t+n]),g.get(e+2*r+i+s)&&m.set(E[2*t+n],E[C-1-2*t-s]),g.get(e+4*r+i+s)&&m.set(E[C-1-2*t-s],E[C-1-2*t-n]),g.get(e+6*r+i+s)&&m.set(E[C-1-2*t-n],E[2*t+s])}e+=8*r}if(kr.drawModeMessage(m,n,d,A),n)kr.drawBullsEye(m,f.truncDivision(d,2),5);else{kr.drawBullsEye(m,f.truncDivision(d,2),7);for(let t=0,e=0;t<f.truncDivision(C,2)-1;t+=15,e+=16)for(let t=1&f.truncDivision(d,2);t<d;t+=2)m.set(f.truncDivision(d,2)-e,t),m.set(f.truncDivision(d,2)+e,t),m.set(t,f.truncDivision(d,2)-e),m.set(t,f.truncDivision(d,2)+e)}let _=new Tr;return _.setCompact(n),_.setSize(d),_.setLayers(i),_.setCodeWords(w),_.setMatrix(m),_}static drawBullsEye(t,e,r){for(let n=0;n<r;n+=2)for(let r=e-n;r<=e+n;r++)t.set(r,e-n),t.set(r,e+n),t.set(e-n,r),t.set(e+n,r);t.set(e-r,e-r),t.set(e-r+1,e-r),t.set(e-r,e-r+1),t.set(e+r,e-r),t.set(e+r,e-r+1),t.set(e+r,e+r-1)}static generateModeMessage(t,e,r){let n=new w;return t?(n.appendBits(e-1,2),n.appendBits(r-1,6),n=kr.generateCheckWords(n,28,4)):(n.appendBits(e-1,5),n.appendBits(r-1,11),n=kr.generateCheckWords(n,40,4)),n}static drawModeMessage(t,e,r,n){let i=f.truncDivision(r,2);if(e)for(let e=0;e<7;e++){let r=i-3+e;n.get(e)&&t.set(r,i-5),n.get(e+7)&&t.set(i+5,r),n.get(20-e)&&t.set(r,i+5),n.get(27-e)&&t.set(i-5,r)}else for(let e=0;e<10;e++){let r=i-5+e+f.truncDivision(e,5);n.get(e)&&t.set(r,i-7),n.get(e+10)&&t.set(i+7,r),n.get(29-e)&&t.set(r,i+7),n.get(39-e)&&t.set(i-7,r)}}static generateCheckWords(t,e,r){let n=t.getSize()/r,i=new cr(kr.getGF(r)),s=f.truncDivision(e,r),o=kr.bitsToWords(t,r,s);i.encode(o,s-n);let a=e%r,l=new w;l.appendBits(0,a);for(const t of Array.from(o))l.appendBits(t,r);return l}static bitsToWords(t,e,r){let n,i,s=new Int32Array(r);for(n=0,i=t.getSize()/e;n<i;n++){let r=0;for(let i=0;i<e;i++)r|=t.get(n*e+i)?1<<e-i-1:0;s[n]=r}return s}static getGF(t){switch(t){case 4:return q.AZTEC_PARAM;case 6:return q.AZTEC_DATA_6;case 8:return q.AZTEC_DATA_8;case 10:return q.AZTEC_DATA_10;case 12:return q.AZTEC_DATA_12;default:throw new o("Unsupported word size "+t)}}static stuffBits(t,e){let r=new w,n=t.getSize(),i=(1<<e)-2;for(let s=0;s<n;s+=e){let o=0;for(let r=0;r<e;r++)(s+r>=n||t.get(s+r))&&(o|=1<<e-1-r);(o&i)===i?(r.appendBits(o&i,e),s--):0==(o&i)?(r.appendBits(1|o,e),s--):r.appendBits(o,e)}return r}static totalBitsInLayer(t,e){return((e?88:112)+16*t)*t}}kr.DEFAULT_EC_PERCENT=33,kr.DEFAULT_AZTEC_LAYERS=0,kr.MAX_NB_BITS=32,kr.MAX_NB_BITS_COMPACT=4,kr.WORD_SIZE=Int32Array.from([4,6,6,8,8,8,8,8,8,10,10,10,10,10,10,10,10,10,10,10,10,10,10,12,12,12,12,12,12,12,12,12,12]);class xr{encode(t,e,r,n){return this.encodeWithHints(t,e,r,n,null)}encodeWithHints(t,e,r,n,i){let s=pr.ISO_8859_1,o=kr.DEFAULT_EC_PERCENT,a=kr.DEFAULT_AZTEC_LAYERS;return null!=i&&(i.has(hr.CHARACTER_SET)&&(s=Sr.forName(i.get(hr.CHARACTER_SET).toString())),i.has(hr.ERROR_CORRECTION)&&(o=f.parseInt(i.get(hr.ERROR_CORRECTION).toString())),i.has(hr.AZTEC_LAYERS)&&(a=f.parseInt(i.get(hr.AZTEC_LAYERS).toString()))),xr.encodeLayers(t,e,r,n,s,o,a)}static encodeLayers(t,e,r,n,i,s,a){if(e!==k.AZTEC)throw new o("Can only encode AZTEC, but got "+e);let l=kr.encode(S.getBytes(t,i),s,a);return xr.renderResult(l,r,n)}static renderResult(t,e,r){let n=t.getMatrix();if(null==n)throw new j;let i=n.getWidth(),s=n.getHeight(),o=Math.max(e,i),a=Math.max(r,s),l=Math.min(o/i,a/s),h=(o-i*l)/2,c=(a-s*l)/2,u=new T(o,a);for(let t=0,e=c;t<s;t++,e+=l)for(let r=0,s=h;r<i;r++,s+=l)n.get(r,t)&&u.setRegion(s,e,l,l);return u}}t.AbstractExpandedDecoder=Vt,t.ArgumentException=s,t.ArithmeticException=K,t.AztecCode=Tr,t.AztecCodeReader=dt,t.AztecCodeWriter=xr,t.AztecDecoder=$,t.AztecDetector=ut,t.AztecDetectorResult=it,t.AztecEncoder=kr,t.AztecHighLevelEncoder=vr,t.AztecPoint=ct,t.BarcodeFormat=k,t.Binarizer=h,t.BinaryBitmap=a,t.BitArray=w,t.BitMatrix=T,t.BitSource=le,t.BrowserAztecCodeReader=class extends L{constructor(t=500){super(new dt,t)}},t.BrowserBarcodeReader=class extends L{constructor(t=500,e){super(new re(e),t,e)}},t.BrowserCodeReader=L,t.BrowserDatamatrixCodeReader=class extends L{constructor(t=500){super(new de,t)}},t.BrowserMultiFormatReader=class extends L{constructor(t=null,e=500){const r=new ar;r.setHints(t),super(r,e)}decodeBitmap(t){return this.reader.decodeWithState(t)}},t.BrowserPDF417Reader=class extends L{constructor(t=500){super(new sr,t)}},t.BrowserQRCodeReader=class extends L{constructor(t=500){super(new Be,t)}},t.BrowserQRCodeSvgWriter=Er,t.CharacterSetECI=m,t.ChecksumException=l,t.Code128Reader=ft,t.Code39Reader=wt,t.DataMatrixDecodedBitStreamParser=he,t.DataMatrixReader=de,t.DecodeHintType=C,t.DecoderResult=z,t.DefaultGridSampler=lt,t.DetectorResult=nt,t.EAN13Reader=St,t.EncodeHintType=hr,t.Exception=i,t.FormatException=E,t.GenericGF=q,t.GenericGFPoly=Z,t.GlobalHistogramBinarizer=N,t.GridSampler=ot,t.GridSamplerInstance=ht,t.HTMLCanvasElementLuminanceSource=M,t.HybridBinarizer=y,t.ITFReader=At,t.IllegalArgumentException=o,t.IllegalStateException=j,t.InvertedLuminanceSource=O,t.LuminanceSource=D,t.MathUtils=tt,t.MultiFormatOneDReader=re,t.MultiFormatReader=ar,t.MultiFormatWriter=class{encode(t,e,r,n,i){let s;if(e!==k.QR_CODE)throw new o("No encoder available for format "+e);return s=new mr,s.encode(t,e,r,n,i)}},t.NotFoundException=R,t.OneDReader=gt,t.PDF417DecodedBitStreamParser=nr,t.PDF417DecoderErrorCorrection=xe,t.PDF417Reader=sr,t.PDF417ResultMetadata=Ke,t.PerspectiveTransform=at,t.PlanarYUVLuminanceSource=_r,t.QRCodeByteMatrix=dr,t.QRCodeDataMask=Ee,t.QRCodeDecodedBitStreamParser=Se,t.QRCodeDecoderErrorCorrectionLevel=ge,t.QRCodeDecoderFormatInformation=fe,t.QRCodeEncoder=Cr,t.QRCodeEncoderQRCode=gr,t.QRCodeMaskUtil=ur,t.QRCodeMatrixUtil=wr,t.QRCodeMode=Ie,t.QRCodeReader=Be,t.QRCodeVersion=Ce,t.QRCodeWriter=mr,t.RGBLuminanceSource=Ir,t.RSS14Reader=ee,t.RSSExpandedReader=$t,t.ReaderException=or,t.ReedSolomonDecoder=J,t.ReedSolomonEncoder=cr,t.ReedSolomonException=Q,t.Result=F,t.ResultMetadataType=W,t.ResultPoint=rt,t.StringUtils=S,t.UnsupportedOperationException=_,t.VideoInputDevice=B,t.WhiteRectangleDetector=st,t.WriterException=fr,t.ZXingArrays=g,t.ZXingCharset=Sr,t.ZXingInteger=f,t.ZXingStandardCharsets=pr,t.ZXingStringBuilder=p,t.ZXingStringEncoding=I,t.ZXingSystem=c,t.createAbstractExpandedDecoder=Qt,Object.defineProperty(t,"__esModule",{value:!0})})); \ No newline at end of file diff --git a/ui-eln-lims/src/core-plugins/eln-lims/1/dss/file-system-plugins/eln-tree/resolver-plugins/flow.py b/ui-eln-lims/src/core-plugins/eln-lims/1/dss/file-system-plugins/eln-tree/resolver-plugins/flow.py index 5e1141655e9c4afd513627ce7acca60c36211774..32ffa0c8daecf5b67a0ef262d310645e8ee7e177 100644 --- a/ui-eln-lims/src/core-plugins/eln-lims/1/dss/file-system-plugins/eln-tree/resolver-plugins/flow.py +++ b/ui-eln-lims/src/core-plugins/eln-lims/1/dss/file-system-plugins/eln-tree/resolver-plugins/flow.py @@ -2,22 +2,20 @@ import script def addSampleChildNodes(path, samplePermId, sampleType, response, acceptor, context): dataSets = script.getDataSetsOfSampleAndItsChildren(samplePermId, context) + filteredDataSets = [] for dataSet in dataSets: if acceptor.acceptDataSet(dataSet): - dataSetCode = dataSet.getCode() - content = context.getContentProvider().asContent(dataSetCode) - contentNode = content.getRootNode() - script.addDataSetFileNodes(path, dataSetCode, contentNode, response, acceptor, context) + filteredDataSets.append(dataSet) + script.addDataSetFileNodesFor(path, filteredDataSets, response, acceptor, context) def addSampleChildNodesWithPlates(path, samplePermId, sampleType, response, acceptor, context): dataSets = script.getDataSetsOfSampleAndItsChildren(samplePermId, context) + filteredDataSets = [] for dataSet in dataSets: sampleTypeCode = dataSet.getSample().getType().getCode() if not sampleTypeCode.endswith("_WELL"): - dataSetCode = dataSet.getCode() - content = context.getContentProvider().asContent(dataSetCode) - contentNode = content.getRootNode() - script.addDataSetFileNodes(path, dataSetCode, contentNode, response, acceptor, context) + filteredDataSets.append(dataSet) + script.addDataSetFileNodesFor(path, filteredDataSets, response, acceptor, context) script.addSampleSampleChildNodes(path, samplePermId, response, acceptor, context) for t in ["FACS_ARIA", "INFLUX", "MOFLO_XDP", "S3E", "SONY_SH800S", "SONY_MA900"]: diff --git a/ui-eln-lims/src/core-plugins/eln-lims/1/dss/file-system-plugins/eln-tree/resolver-plugins/microscopy.py b/ui-eln-lims/src/core-plugins/eln-lims/1/dss/file-system-plugins/eln-tree/resolver-plugins/microscopy.py index 7429a9d6a6d34a90f0aff9aee79bca0a83e502e1..272ec466926079699eba16e5f3eaf48b0c93a8a8 100644 --- a/ui-eln-lims/src/core-plugins/eln-lims/1/dss/file-system-plugins/eln-tree/resolver-plugins/microscopy.py +++ b/ui-eln-lims/src/core-plugins/eln-lims/1/dss/file-system-plugins/eln-tree/resolver-plugins/microscopy.py @@ -7,11 +7,10 @@ acceptor.hideDataSetType("MICROSCOPY_IMG_THUMBNAIL") def addSampleChildNodes(path, samplePermId, sampleType, response, acceptor, context): dataSets = script.getDataSetsOfSampleAndItsChildren(samplePermId, context) + filteredDataSets = [] for dataSet in dataSets: if acceptor.acceptDataSet(dataSet): - dataSetCode = dataSet.getCode() - content = context.getContentProvider().asContent(dataSetCode) - contentNode = content.getRootNode() - script.addDataSetFileNodes(path, dataSetCode, contentNode, response, acceptor, context) + filteredDataSets.append(dataSet) + script.addDataSetFileNodesFor(path, filteredDataSets, response, acceptor, context) acceptor.sampleChildrenHandlers["MICROSCOPY_EXPERIMENT"] = addSampleChildNodes diff --git a/ui-eln-lims/src/core-plugins/eln-lims/1/dss/file-system-plugins/eln-tree/script.py b/ui-eln-lims/src/core-plugins/eln-lims/1/dss/file-system-plugins/eln-tree/script.py index c94b6c7577d646fe4fbe99f8cda459010996843b..fa1a17da033b270eae771c9e71f4c0c8785bdaf3 100644 --- a/ui-eln-lims/src/core-plugins/eln-lims/1/dss/file-system-plugins/eln-tree/script.py +++ b/ui-eln-lims/src/core-plugins/eln-lims/1/dss/file-system-plugins/eln-tree/script.py @@ -15,6 +15,10 @@ from ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.search import SampleSearchC from ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.fetchoptions import SampleFetchOptions from ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.search import DataSetSearchCriteria from ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.fetchoptions import DataSetFetchOptions +from ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.id import DataSetPermId +from ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset import DataSetKind +from ch.systemsx.cisd.openbis.generic.shared.basic.dto import PhysicalDataSet +from ch.systemsx.cisd.openbis.generic.shared.basic.dto import DataStore from ch.systemsx.cisd.openbis.dss.generic.server.ftp import Node class NodeWithEntityType(Node): @@ -233,8 +237,8 @@ def listChildren(subPath, acceptor, context): permId = node.getPermId() if nodeType == "DATASET": response = None - for permId in node.permIds: - dataSetCode, contentNode, content = getContentNode(permId, context) + contentNodes = getContentNodes(node.permIds, context) + for dataSetCode, contentNode, content in contentNodes: if contentNode.isDirectory(): if response is None: response = context.createDirectoryResponse() @@ -352,6 +356,49 @@ def addDataSetFileNodes(path, dataSetCode, contentNode, response, acceptor, cont else: response.addFile(nodeName, childNode) +def addDataSetFileNodesFor(path, dataSets, response, acceptor, context): + contentNodes = asContentNodes(dataSets, context) + for dataSetCode, contentNode, _ in contentNodes: + addDataSetFileNodes(path, dataSetCode, contentNode, response, acceptor, context) + +def getContentNodes(permIds, context): + ids = [] + paths = [] + for permId in permIds: + splittedId = permId.split("::") + ids.append(DataSetPermId(splittedId[0])) + paths.append(splittedId[1] if len(splittedId) > 1 else None) + + fetchOptions = DataSetFetchOptions() + fetchOptions.withDataStore() + fetchOptions.withPhysicalData() + dataSets = context.getApi().getDataSets(context.getSessionToken(), ids, fetchOptions).values() + return asContentNodes(dataSets, context, paths) + +def asContentNodes(dataSets, context, paths=None): + result = [] + contentProvider = context.getContentProvider() + for i in range(len(dataSets)): + dataSet = dataSets[i] + dataSetCode = dataSet.getCode() + dataStore = DataStore() + dataStore.setCode(dataSet.getDataStore().getCode()) + dataStore.setHostUrl(dataSet.getDataStore().getDownloadUrl()) + kind = dataSet.getKind() + if kind == DataSetKind.PHYSICAL: + physicalData = dataSet.getPhysicalData() + physicalDataSet = PhysicalDataSet() + physicalDataSet.setCode(dataSetCode) + physicalDataSet.setLocation(physicalData.getLocation()) + physicalDataSet.setDataStore(dataStore) + physicalDataSet.setShareId(physicalData.getShareId()) + content = contentProvider.asContentWithoutModifyingAccessTimestamp(physicalDataSet) + contentNode = content.getRootNode() if paths is None or paths[i] is None else content.tryGetNode(paths[i]) + result.append((dataSetCode, contentNode, content)) + else: + raise Exception("Not supported data set kind: %s" % kind) + return result + def getContentNode(permId, context): splittedId = permId.split("::") dataSetCode = splittedId[0] @@ -366,6 +413,8 @@ def getDataSetsOfSampleAndItsChildren(samplePermId, context): parentsSearchCriteria = dataSetSearchCriteria.withSample().withParents() parentsSearchCriteria.withPermId().thatEquals(samplePermId) fetchOptions = DataSetFetchOptions() + fetchOptions.withDataStore() + fetchOptions.withPhysicalData() fetchOptions.withType() fetchOptions.withProperties() fetchOptions.withSample().withType()