diff --git a/js/import/convertPageAbbyy.js b/js/import/convertPageAbbyy.js index d458504..16684f1 100644 --- a/js/import/convertPageAbbyy.js +++ b/js/import/convertPageAbbyy.js @@ -30,11 +30,25 @@ const debugMode = false; export async function convertPageAbbyy({ ocrStr, n }) { // Return early if character-level data is not detected. // Unlike Tesseract HOCR (which by default returns word-level data which we can still use), Abbyy XML returns line-level data that is not usable. - const pageDimsStr = ocrStr.match(/]*>/); + const widthStr = pageAttrStr?.[0].match(/width=['"](\d+)['"]/)?.[1]; + const heightStr = pageAttrStr?.[0].match(/height=['"](\d+)['"]/)?.[1]; + const rotationStr = pageAttrStr?.[0].match(/rotation=['"](\w+)['"]/)?.[1]; + + if (!widthStr || !heightStr) throw new Error('Failed to parse page dimensions.'); + + // Note: `RotatedClockwise`/`RotatedCounterclockwise` are swapped versus what one might expect, and are the oppose of how line orientation is handled below. + // Per the Abbyy documentation, the page `rotation` is defined as "the type of rotation applied to the original page image" which implies it is the opposite of the rotation of the text. + let pageOrientation = 0; + if (rotationStr === 'RotatedClockwise') { + pageOrientation = 3; + } else if (rotationStr === 'RotatedUpsidedown') { + pageOrientation = 2; + } else if (rotationStr === 'RotatedCounterclockwise') { + pageOrientation = 1; + } - const pageDims = { height: parseInt(pageDimsStr[2]), width: parseInt(pageDimsStr[1]) }; + const pageDims = { height: parseInt(heightStr), width: parseInt(widthStr) }; const pageObj = new ocr.OcrPage(n, pageDims); @@ -53,313 +67,370 @@ export async function convertPageAbbyy({ ocrStr, n }) { /** @type {Array} */ const angleRisePage = []; - function convertParAbbyy(xmlPar) { - /** @type {Array} */ - const parLineArr = []; + function convertTextAbbyy(xmlText) { + const textAttrStr = xmlText.match(/]*>/); + const textOrientationStr = textAttrStr?.[0].match(/orientation=['"](\w+)['"]/)?.[1]; + + let textOrientation = 0; + if (textOrientationStr === 'RotatedClockwise') { + textOrientation = 1; + } else if (textOrientationStr === 'RotatedUpsidedown') { + textOrientation = 2; + } else if (textOrientationStr === 'RotatedCounterclockwise') { + textOrientation = 3; + } - function convertLineAbbyy(xmlLine) { - const stylesLine = {}; + const textOrientationFinal = (pageOrientation + textOrientation) % 4; - // Unlike Tesseract HOCR, Abbyy XML does not provide accurate metrics for determining font size, so they are calculated here. - // Strangely, while Abbyy XML does provide a "baseline" attribute, it is often wildly incorrect (sometimes falling outside of the bounding box entirely). - // One guess as to why is that coordinates calculated pre-dewarping are used along with a baseline calculated post-dewarping. - // Regardless of the reason, baseline is recalculated here. - const baselineSlopeArr = /** @type {Array} */ ([]); - const baselineFirst = /** @type {Array} */ ([]); + function convertParAbbyy(xmlPar) { + /** @type {Array} */ + const parLineArr = []; - const xmlLinePreChar = xmlLine.match(/^[\s\S]*?(?=]+/)?.[0]; - const fontName = xmlLineFormatting?.match(/ff=['"]([^'"]*)/)?.[1]; + function convertLineAbbyy(xmlLine) { + const stylesLine = {}; - let dropCap = false; - const dropCapMatch = xmlLine.match(abbyyDropCapRegex); - if (dropCapMatch != null && parseInt(dropCapMatch[1]) > 0) { - dropCap = true; - } + // Unlike Tesseract HOCR, Abbyy XML does not provide accurate metrics for determining font size, so they are calculated here. + // Strangely, while Abbyy XML does provide a "baseline" attribute, it is often wildly incorrect (sometimes falling outside of the bounding box entirely). + // One guess as to why is that coordinates calculated pre-dewarping are used along with a baseline calculated post-dewarping. + // Regardless of the reason, baseline is recalculated here. + const baselineSlopeArr = /** @type {Array} */ ([]); + const baselineFirst = /** @type {Array} */ ([]); - let lineBoxArr = xmlLine.match(abbyyLineBoxRegex); - if (lineBoxArr == null) return; - lineBoxArr = [...lineBoxArr].map((x) => parseInt(x)); - - // Unlike Tesseract, Abbyy XML does not have a native "word" unit (it provides only lines and letters). - // Therefore, lines are split into words on either (1) a space character or (2) a change in formatting. - - // TODO: Investigate possible fix for too many words issue: - // The reason for splitting letters at every formatting change is (1) this splits up superscripts from - // the words they are attached to and (2) to split up normal and italic parts of text (even if not separated by a space), - // as the canvas GUI currently only supports one font style per word. - // Unfortunately, in some documents Abbyy has the nonsensical habbit of using formatting tags just to change font size - // on a specific character (e.g. switching from font size 10.5 to 11 for a single period). - // When this happens, the heuristic here results in too many words being created--not sure if there's an easy fix. - - // Replace character identified as tab with space (so it is split into separate word) - // For whatever reason many non-tab values can be found in elements where isTab is true (e.g. "_", "....") - xmlLine = xmlLine.replaceAll(/isTab=['"](?:1|true)['"][^>]*>[^<]+/ig, '> '); - - // These regex remove blank characters that occur next to changes in formatting to avoid making too many words. - // Note: Abbyy is inconsistent regarding where formatting elements are placed. - // Sometimes the comes after the space between words, and sometimes it comes before the space between words. - xmlLine = xmlLine.replaceAll(/(<\/formatting>]*>\s*)]*>\s*<\/charParams>/ig, '$1'); - xmlLine = xmlLine.replaceAll(/]*>\s*<\/charParams>(\s*<\/formatting>]*>\s*)/ig, '$1'); - - // xmlLine = xmlLine.replaceAll(/(\<\/formatting\>\]*\>)(\s*]*\>\.\<\/charParams\>)\<\/formatting\>/ig, "$1") - - const wordStrArr1 = xmlLine.split(abbyySplitRegex); - - // Account for special cases: - // 1. Filter off any array elements that do not have a character. - // (This can happen ocassionally, for example when multiple spaces are next to eachother.) - // TODO: This will drop formatting information in edge cases--e.g. if a formatting element is followed by multiple spaces. - // However, hopefully these are uncommon enough that they should not be a big issue. - // 2. Period with its own "word" due to being wrapped in separate tags - // This odd behavior appears around to superscripts, and makes sense when normal text is followed by a superscript followed by a period. - // However, it also happens when normal text is followed by a period followed by a superscript (the normal behavior), - // and it does not make sense for a period to get its own word in this case. - - const wordStrArr = []; - for (let i = 0; i < wordStrArr1.length; i++) { - const wordStrArrI = wordStrArr1[i]; - const wordMatch = wordStrArrI.match(/>([^<>]+?)(?=<\/charParams>)/g)?.map((x) => x.substring(1)); - if (!wordMatch) { - continue; - } else if (wordMatch.length === 1) { - if (wordMatch[0] === '.') { - if (wordStrArr.length > 0 && !/superscript=['"](1|true)/i.test(wordStrArr[wordStrArr.length - 1])) { - wordStrArr[wordStrArr.length - 1] = wordStrArr[wordStrArr.length - 1] + wordStrArrI.replace(/(]+>\s*)/i, ''); - continue; + const xmlLinePreChar = xmlLine.match(/^[\s\S]*?(?=]+/)?.[0]; + const fontName = xmlLineFormatting?.match(/ff=['"]([^'"]*)/)?.[1]; + + let dropCap = false; + const dropCapMatch = xmlLine.match(abbyyDropCapRegex); + if (dropCapMatch != null && parseInt(dropCapMatch[1]) > 0) { + dropCap = true; + } + + let lineBoxArr = xmlLine.match(abbyyLineBoxRegex); + if (lineBoxArr == null) return; + lineBoxArr = [...lineBoxArr].map((x) => parseInt(x)); + + // Unlike Tesseract, Abbyy XML does not have a native "word" unit (it provides only lines and letters). + // Therefore, lines are split into words on either (1) a space character or (2) a change in formatting. + + // TODO: Investigate possible fix for too many words issue: + // The reason for splitting letters at every formatting change is (1) this splits up superscripts from + // the words they are attached to and (2) to split up normal and italic parts of text (even if not separated by a space), + // as the canvas GUI currently only supports one font style per word. + // Unfortunately, in some documents Abbyy has the nonsensical habbit of using formatting tags just to change font size + // on a specific character (e.g. switching from font size 10.5 to 11 for a single period). + // When this happens, the heuristic here results in too many words being created--not sure if there's an easy fix. + + // Replace character identified as tab with space (so it is split into separate word) + // For whatever reason many non-tab values can be found in elements where isTab is true (e.g. "_", "....") + xmlLine = xmlLine.replaceAll(/isTab=['"](?:1|true)['"][^>]*>[^<]+/ig, '> '); + + // These regex remove blank characters that occur next to changes in formatting to avoid making too many words. + // Note: Abbyy is inconsistent regarding where formatting elements are placed. + // Sometimes the comes after the space between words, and sometimes it comes before the space between words. + xmlLine = xmlLine.replaceAll(/(<\/formatting>]*>\s*)]*>\s*<\/charParams>/ig, '$1'); + xmlLine = xmlLine.replaceAll(/]*>\s*<\/charParams>(\s*<\/formatting>]*>\s*)/ig, '$1'); + + // xmlLine = xmlLine.replaceAll(/(\<\/formatting\>\]*\>)(\s*]*\>\.\<\/charParams\>)\<\/formatting\>/ig, "$1") + + const wordStrArr1 = xmlLine.split(abbyySplitRegex); + + // Account for special cases: + // 1. Filter off any array elements that do not have a character. + // (This can happen ocassionally, for example when multiple spaces are next to eachother.) + // TODO: This will drop formatting information in edge cases--e.g. if a formatting element is followed by multiple spaces. + // However, hopefully these are uncommon enough that they should not be a big issue. + // 2. Period with its own "word" due to being wrapped in separate tags + // This odd behavior appears around to superscripts, and makes sense when normal text is followed by a superscript followed by a period. + // However, it also happens when normal text is followed by a period followed by a superscript (the normal behavior), + // and it does not make sense for a period to get its own word in this case. + + const wordStrArr = []; + for (let i = 0; i < wordStrArr1.length; i++) { + const wordStrArrI = wordStrArr1[i]; + const wordMatch = wordStrArrI.match(/>([^<>]+?)(?=<\/charParams>)/g)?.map((x) => x.substring(1)); + if (!wordMatch) { + continue; + } else if (wordMatch.length === 1) { + if (wordMatch[0] === '.') { + if (wordStrArr.length > 0 && !/superscript=['"](1|true)/i.test(wordStrArr[wordStrArr.length - 1])) { + wordStrArr[wordStrArr.length - 1] = wordStrArr[wordStrArr.length - 1] + wordStrArrI.replace(/(]+>\s*)/i, ''); + continue; + } } } + wordStrArr.push(wordStrArrI); } - wordStrArr.push(wordStrArrI); - } - if (wordStrArr.length === 0) return; - - const bboxes = Array(wordStrArr.length); - let text = Array(wordStrArr.length); - - /** @type {Array>} */ - const charObjArrLine = Array(wordStrArr.length); - text = text.fill(''); - let styleArr = Array(wordStrArr.length); - styleArr = styleArr.fill('normal'); - /** @type {Array} */ - const smallCapsArr = Array(wordStrArr.length).fill(false); - /** @type {Array} */ - const wordSusp = Array(wordStrArr.length).fill(false); - - for (let i = 0; i < wordStrArr.length; i++) { - const wordStr = wordStrArr[i]; - const letterArr = [...wordStr.matchAll(abbyyCharRegex)]; - - if (typeof (letterArr[0][1]) !== 'undefined') { - if (dropCap && i === 0) { - styleArr[i] = 'dropcap'; - } else if (/superscript=['"](1|true)/i.test(letterArr[0][1])) { - styleArr[i] = 'sup'; - } else if (/italic=['"](1|true)/i.test(letterArr[0][1])) { - styleArr[i] = 'italic'; - stylesLine.italic = true; - } else { - styleArr[i] = 'normal'; - stylesLine.normal = true; - } + if (wordStrArr.length === 0) return; + + /** @type {Array>} */ + const bboxes = Array(wordStrArr.length); + let text = Array(wordStrArr.length); + + /** @type {Array>} */ + const charObjArrLine = Array(wordStrArr.length); + text = text.fill(''); + let styleArr = Array(wordStrArr.length); + styleArr = styleArr.fill('normal'); + /** @type {Array} */ + const smallCapsArr = Array(wordStrArr.length).fill(false); + /** @type {Array} */ + const wordSusp = Array(wordStrArr.length).fill(false); + + for (let i = 0; i < wordStrArr.length; i++) { + const wordStr = wordStrArr[i]; + const letterArr = [...wordStr.matchAll(abbyyCharRegex)]; + + if (typeof (letterArr[0][1]) !== 'undefined') { + if (dropCap && i === 0) { + styleArr[i] = 'dropcap'; + } else if (/superscript=['"](1|true)/i.test(letterArr[0][1])) { + styleArr[i] = 'sup'; + } else if (/italic=['"](1|true)/i.test(letterArr[0][1])) { + styleArr[i] = 'italic'; + stylesLine.italic = true; + } else { + styleArr[i] = 'normal'; + stylesLine.normal = true; + } - if (/smallcaps=['"](1|true)/i.test(letterArr[0][1])) { - smallCapsArr[i] = true; + if (/smallcaps=['"](1|true)/i.test(letterArr[0][1])) { + smallCapsArr[i] = true; + } + } else if (i > 0) { + if (styleArr[i - 1] === 'dropcap') { + styleArr[i] = 'normal'; + smallCapsArr[i] = false; + } else { + styleArr[i] = styleArr[i - 1]; + smallCapsArr[i] = smallCapsArr[i - 1]; + } } - } else if (i > 0) { - if (styleArr[i - 1] === 'dropcap') { - styleArr[i] = 'normal'; + + // Abbyy will sometimes misidentify capital letters immediately following drop caps as small caps, + // when they are only small in relation to the drop cap (rather than the main text). + let dropCapFix = false; + if (dropCap && i === 1 && smallCapsArr[i]) { smallCapsArr[i] = false; - } else { - styleArr[i] = styleArr[i - 1]; - smallCapsArr[i] = smallCapsArr[i - 1]; + dropCapFix = true; } - } - // Abbyy will sometimes misidentify capital letters immediately following drop caps as small caps, - // when they are only small in relation to the drop cap (rather than the main text). - let dropCapFix = false; - if (dropCap && i === 1 && smallCapsArr[i]) { - smallCapsArr[i] = false; - dropCapFix = true; - } + bboxes[i] = []; + + charObjArrLine[i] = []; + + for (let j = 0; j < letterArr.length; j++) { + // Skip letters placed at coordinate 0 (not sure why this happens) + if (letterArr[j][2] === '0') { continue; } + + const bboxRaw = { + l: parseInt(letterArr[j][2]), + t: parseInt(letterArr[j][3]), + r: parseInt(letterArr[j][4]), + b: parseInt(letterArr[j][5]), + }; + + let bbox; + if (textOrientationFinal === 1) { + bbox = { + left: Math.round(bboxRaw.t), + top: Math.round(pageDims.width - Math.max(bboxRaw.r, bboxRaw.l)), + right: Math.round(bboxRaw.b), + bottom: Math.round(pageDims.width - Math.min(bboxRaw.l, bboxRaw.l)), + }; + } else if (textOrientationFinal === 2) { + bbox = { + left: Math.round(pageDims.width - bboxRaw.r), + top: Math.round(pageDims.height - bboxRaw.b), + right: Math.round(pageDims.width - bboxRaw.l), + bottom: Math.round(pageDims.height - bboxRaw.t), + }; + } else if (textOrientationFinal === 3) { + bbox = { + left: Math.round(pageDims.height - bboxRaw.b), + top: Math.round(Math.min(bboxRaw.l, bboxRaw.l)), + right: Math.round(pageDims.height - bboxRaw.t), + bottom: Math.round(Math.max(bboxRaw.r, bboxRaw.r)), + }; + } else { + bbox = { + left: Math.round(bboxRaw.l), + top: Math.round(bboxRaw.t), + right: Math.round(bboxRaw.r), + bottom: Math.round(bboxRaw.b), + }; + } - bboxes[i] = []; + bboxes[i][j] = bbox; - charObjArrLine[i] = []; + let letterSusp = false; + if (letterArr[j][6] === '1' || letterArr[j][6] === 'true') { + wordSusp[i] = true; + letterSusp = true; + } - for (let j = 0; j < letterArr.length; j++) { - // Skip letters placed at coordinate 0 (not sure why this happens) - if (letterArr[j][2] === '0') { continue; } + if (dropCapFix) { + letterArr[j][7] = letterArr[j][7].toUpperCase(); + } - bboxes[i][j] = []; - bboxes[i][j].push(parseInt(letterArr[j][2])); - bboxes[i][j].push(parseInt(letterArr[j][3])); - bboxes[i][j].push(parseInt(letterArr[j][4])); - bboxes[i][j].push(parseInt(letterArr[j][5])); + // Handle characters escaped in XML + letterArr[j][7] = unescapeXml(letterArr[j][7]); - let letterSusp = false; - if (letterArr[j][6] === '1' || letterArr[j][6] === 'true') { - wordSusp[i] = true; - letterSusp = true; - } + const contentStrLetter = letterArr[j][7]; - if (dropCapFix) { - letterArr[j][7] = letterArr[j][7].toUpperCase(); - } + const ascChar = ascCharArr.includes(contentStrLetter); + const xChar = xCharArr.includes(contentStrLetter); - // Handle characters escaped in XML - letterArr[j][7] = unescapeXml(letterArr[j][7]); + if ((ascChar || xChar) && !letterSusp && !dropCapFix && !(dropCap && i === 0)) { + // To calculate the slope of the baseline (and therefore image angle) the position of each glyph that starts (approximately) on the + // baseline is compared to the first such glyph. This is less precise than a true "best fit" approach, but hopefully with enough data + // points it will all average out. + if (baselineFirst.length === 0) { + baselineFirst.push(bboxes[i][j].left, bboxes[i][j].bottom); + } else { + const baselineSlope = (bboxes[i][j].bottom - baselineFirst[1]) / (bboxes[i][j].left - baselineFirst[0]); + if (Number.isFinite(baselineSlope)) baselineSlopeArr.push(baselineSlope); + } + } - const contentStrLetter = letterArr[j][7]; + text[i] += contentStrLetter; - const ascChar = ascCharArr.includes(contentStrLetter); - const xChar = xCharArr.includes(contentStrLetter); + const charObj = new ocr.OcrChar(contentStrLetter, bbox); - if ((ascChar || xChar) && !letterSusp && !dropCapFix && !(dropCap && i === 0)) { - // baselineHeightArr.push(bboxes[i][j][3]); - // To calculate the slope of the baseline (and therefore image angle) the position of each glyph that starts (approximately) on the - // baseline is compared to the first such glyph. This is less precise than a true "best fit" approach, but hopefully with enough data - // points it will all average out. - if (baselineFirst.length === 0) { - baselineFirst.push(bboxes[i][j][0], bboxes[i][j][3]); - } else { - baselineSlopeArr.push((bboxes[i][j][3] - baselineFirst[1]) / (bboxes[i][j][0] - baselineFirst[0])); - } + charObjArrLine[i].push(charObj); } + } - text[i] += contentStrLetter; + // While Abbyy XML already provides line bounding boxes, these have been observed to be (at times) + // completely different than a bounding box calculated from a union of all letters in the line. + // Therefore, the line bounding boxes are recaclculated here. + const lineBoxArrCalc = new Array(4); + // reduce((acc, val) => acc.concat(val), []) is used as a drop-in replacement for flat() with significantly better performance + lineBoxArrCalc[0] = Math.min(...bboxes.reduce((acc, val) => acc.concat(val), []).map((x) => x.left).filter((x) => x > 0)); + lineBoxArrCalc[1] = Math.min(...bboxes.reduce((acc, val) => acc.concat(val), []).map((x) => x.top).filter((x) => x > 0)); + lineBoxArrCalc[2] = Math.max(...bboxes.reduce((acc, val) => acc.concat(val), []).map((x) => x.right).filter((x) => x > 0)); + lineBoxArrCalc[3] = Math.max(...bboxes.reduce((acc, val) => acc.concat(val), []).map((x) => x.bottom).filter((x) => x > 0)); + + const baselineSlope = quantile(baselineSlopeArr, 0.5) || 0; + + // baselinePoint should be the offset between the bottom of the line bounding box, and the baseline at the leftmost point + let baselinePoint = baselineFirst[1] - lineBoxArrCalc[3]; + if (baselineSlope < 0) { + baselinePoint -= baselineSlope * (baselineFirst[0] - lineBoxArrCalc[0]); + } + baselinePoint = baselinePoint || 0; - const bbox = { - left: bboxes[i][j][0], top: bboxes[i][j][1], right: bboxes[i][j][2], bottom: bboxes[i][j][3], - }; + // In general, the bounding box calculated here from the individual word boundign boxes is used. + // In a small number of cases the bounding box cannot be calculated because all individual character-level bounding boxes are at 0 (and therefore skipped) + // In this case the original line-level bounding box from Abbyy is used + const lineBoxArrOut = Number.isFinite(lineBoxArrCalc[0]) && Number.isFinite(lineBoxArrCalc[1]) && Number.isFinite(lineBoxArrCalc[2]) && Number.isFinite(lineBoxArrCalc[3]) + ? lineBoxArrCalc : lineBoxArr.slice(2, 6); - const charObj = new ocr.OcrChar(contentStrLetter, bbox); + const baselineOut = [round6(baselineSlope), Math.round(baselinePoint)]; - charObjArrLine[i].push(charObj); - } - } + const bbox = { + left: lineBoxArrOut[0], top: lineBoxArrOut[1], right: lineBoxArrOut[2], bottom: lineBoxArrOut[3], + }; - // While Abbyy XML already provides line bounding boxes, these have been observed to be (at times) - // completely different than a bounding box calculated from a union of all letters in the line. - // Therefore, the line bounding boxes are recaclculated here. - const lineBoxArrCalc = new Array(4); - // reduce((acc, val) => acc.concat(val), []) is used as a drop-in replacement for flat() with significantly better performance - lineBoxArrCalc[0] = Math.min(...bboxes.reduce((acc, val) => acc.concat(val), []).map((x) => x[0]).filter((x) => x > 0)); - lineBoxArrCalc[1] = Math.min(...bboxes.reduce((acc, val) => acc.concat(val), []).map((x) => x[1]).filter((x) => x > 0)); - lineBoxArrCalc[2] = Math.max(...bboxes.reduce((acc, val) => acc.concat(val), []).map((x) => x[2]).filter((x) => x > 0)); - lineBoxArrCalc[3] = Math.max(...bboxes.reduce((acc, val) => acc.concat(val), []).map((x) => x[3]).filter((x) => x > 0)); - - const baselineSlope = quantile(baselineSlopeArr, 0.5) || 0; - - // baselinePoint should be the offset between the bottom of the line bounding box, and the baseline at the leftmost point - let baselinePoint = baselineFirst[1] - lineBoxArrCalc[3]; - if (baselineSlope < 0) { - baselinePoint -= baselineSlope * (baselineFirst[0] - lineBoxArrCalc[0]); - } - baselinePoint = baselinePoint || 0; - - // In general, the bounding box calculated here from the individual word boundign boxes is used. - // In a small number of cases the bounding box cannot be calculated because all individual character-level bounding boxes are at 0 (and therefore skipped) - // In this case the original line-level bounding box from Abbyy is used - const lineBoxArrOut = Number.isFinite(lineBoxArrCalc[0]) && Number.isFinite(lineBoxArrCalc[1]) && Number.isFinite(lineBoxArrCalc[2]) && Number.isFinite(lineBoxArrCalc[3]) - ? lineBoxArrCalc : lineBoxArr.slice(2, 6); - - const baselineOut = [round6(baselineSlope), Math.round(baselinePoint)]; - - const bbox = { - left: lineBoxArrOut[0], top: lineBoxArrOut[1], right: lineBoxArrOut[2], bottom: lineBoxArrOut[3], - }; - - const lineObj = new ocr.OcrLine(pageObj, bbox, baselineOut); - - let lettersKept = 0; - for (let i = 0; i < text.length; i++) { - if (text[i].trim() === '') continue; - const bboxesI = bboxes[i]; - - // Abbyy-specific fix: - // Only values > 0 are considered, since Abbyy has been observed to frequently return incorrect "0" coordinates. - // This frequently (but not always) occurs with superscripts. - // If this filter leaves no remaining left/right/top/bottom coordinates, the word is skipped entirely. - // TODO: Figure out why this happens and whether these glyphs should be dropped completely. - const bboxesILeft = Math.min(...bboxesI.map((x) => x[0]).filter((x) => x > 0)); - const bboxesIRight = Math.max(...bboxesI.map((x) => x[2]).filter((x) => x > 0)); - const bboxesITop = Math.min(...bboxesI.map((x) => x[1]).filter((x) => x > 0)); - const bboxesIBottom = Math.max(...bboxesI.map((x) => x[3]).filter((x) => x > 0)); - - if (!Number.isFinite(bboxesITop) || !Number.isFinite(bboxesIBottom) || !Number.isFinite(bboxesILeft) || !Number.isFinite(bboxesIRight)) { - continue; - } + const lineObj = new ocr.OcrLine(pageObj, bbox, baselineOut); - const bboxWord = { - left: bboxesILeft, top: bboxesITop, right: bboxesIRight, bottom: bboxesIBottom, - }; + lineObj.orientation = textOrientationFinal; - const id = `word_${n + 1}_${pageObj.lines.length + 1}_${i + 1}`; + lineObj.raw = xmlText; - const wordObj = new ocr.OcrWord(lineObj, text[i], bboxWord, id); - wordObj.chars = charObjArrLine[i]; - wordObj.conf = wordSusp[i] ? 0 : 100; + let lettersKept = 0; + for (let i = 0; i < text.length; i++) { + if (text[i].trim() === '') continue; + const bboxesI = bboxes[i]; - console.assert(wordObj.chars.length === text[i].length, `Likely parsing error for word: ${id}. Number of letters in text does not match number of \`ocrChar\` objects.`); + // Abbyy-specific fix: + // Only values > 0 are considered, since Abbyy has been observed to frequently return incorrect "0" coordinates. + // This frequently (but not always) occurs with superscripts. + // If this filter leaves no remaining left/right/top/bottom coordinates, the word is skipped entirely. + // TODO: Figure out why this happens and whether these glyphs should be dropped completely. + const bboxesILeft = Math.min(...bboxesI.map((x) => x.left).filter((x) => x > 0)); + const bboxesIRight = Math.max(...bboxesI.map((x) => x.right).filter((x) => x > 0)); + const bboxesITop = Math.min(...bboxesI.map((x) => x.top).filter((x) => x > 0)); + const bboxesIBottom = Math.max(...bboxesI.map((x) => x.bottom).filter((x) => x > 0)); - if (styleArr[i] === 'italic') { - wordObj.style = 'italic'; - } + if (!Number.isFinite(bboxesITop) || !Number.isFinite(bboxesIBottom) || !Number.isFinite(bboxesILeft) || !Number.isFinite(bboxesIRight)) { + continue; + } + + const bboxWord = { + left: bboxesILeft, top: bboxesITop, right: bboxesIRight, bottom: bboxesIBottom, + }; + + const id = `word_${n + 1}_${pageObj.lines.length + 1}_${i + 1}`; - wordObj.smallCaps = smallCapsArr[i]; + const wordObj = new ocr.OcrWord(lineObj, text[i], bboxWord, id); + wordObj.chars = charObjArrLine[i]; + wordObj.conf = wordSusp[i] ? 0 : 100; - if (fontName) wordObj.font = fontName; + console.assert(wordObj.chars.length === text[i].length, `Likely parsing error for word: ${id}. Number of letters in text does not match number of \`ocrChar\` objects.`); - if (styleArr[i] === 'sup') { - wordObj.sup = true; - } else if (styleArr[i] === 'dropcap') { - wordObj.dropcap = true; + if (styleArr[i] === 'italic') { + wordObj.style = 'italic'; + } + + wordObj.smallCaps = smallCapsArr[i]; + + if (fontName) wordObj.font = fontName; + + if (styleArr[i] === 'sup') { + wordObj.sup = true; + } else if (styleArr[i] === 'dropcap') { + wordObj.dropcap = true; + } + + lineObj.words.push(wordObj); + + lettersKept++; } - lineObj.words.push(wordObj); + // If there are no letters in the line, drop the entire line element + if (lettersKept === 0) return; - lettersKept++; + pageObj.lines.push(lineObj); + parLineArr.push(lineObj); + + // eslint-disable-next-line consistent-return + return baselineSlope; } - // If there are no letters in the line, drop the entire line element - if (lettersKept === 0) return; + const lineStrArr = xmlPar.split(/<\/line>/); - pageObj.lines.push(lineObj); - parLineArr.push(lineObj); + for (let i = 0; i < lineStrArr.length; i++) { + const angle = convertLineAbbyy(lineStrArr[i]); + if (typeof angle === 'number' && !Number.isNaN(angle)) angleRisePage.push(angle); + } - // eslint-disable-next-line consistent-return - return baselineSlope; - } + if (parLineArr.length === 0) return; - const lineStrArr = xmlPar.split(/<\/line>/); + const parbox = calcBboxUnion(parLineArr.map((x) => x.bbox)); - for (let i = 0; i < lineStrArr.length; i++) { - const angle = convertLineAbbyy(lineStrArr[i]); - if (typeof angle === 'number' && !Number.isNaN(angle)) angleRisePage.push(angle); - } + const parObj = new ocr.OcrPar(pageObj, parbox); - if (parLineArr.length === 0) return; + parLineArr.forEach((x) => { + x.par = parObj; + }); - const parbox = calcBboxUnion(parLineArr.map((x) => x.bbox)); - - const parObj = new ocr.OcrPar(pageObj, parbox); + parObj.lines = parLineArr; + pageObj.pars.push(parObj); + } - parLineArr.forEach((x) => { - x.par = parObj; - }); + const parStrArr = xmlText.split(/<\/par>/); - parObj.lines = parLineArr; - pageObj.pars.push(parObj); + for (let i = 0; i < parStrArr.length; i++) { + convertParAbbyy(parStrArr[i]); + } } - const parStrArr = ocrStr.split(/<\/par>/); + const textStrArr = ocrStr.split(/<\/text>/); - for (let i = 0; i < parStrArr.length; i++) { - convertParAbbyy(parStrArr[i]); + for (let i = 0; i < textStrArr.length; i++) { + convertTextAbbyy(textStrArr[i]); } const angleRiseMedian = mean50(angleRisePage) || 0; diff --git a/tests/assets/CSF_Proposed_Budget_Book_June_2024_r8_30_all_orientations_abbyy.xml b/tests/assets/CSF_Proposed_Budget_Book_June_2024_r8_30_all_orientations_abbyy.xml new file mode 100644 index 0000000..c53e96b --- /dev/null +++ b/tests/assets/CSF_Proposed_Budget_Book_June_2024_r8_30_all_orientations_abbyy.xml @@ -0,0 +1,33731 @@ + + + + + + + +3 +0 + +S +A +N + +F +R +A +N +C +I +S +C +O +: + +A +N + +O +V +E +R +V +I +E +W + + + + + + +E + + +A +s +s +e +s +s +o +r +/ + +R +e +c +o +r +d +e +r + + + + + + +A +p +p +e +a +l +s + +B +o +a +r +d + + + + + + + + +M +a +y +o +r + + + + + + +E + + +B +o +a +r +d + +o +f + + +S +u +p +e +r +v +i +s +o +r +s + + + + + + +T +r +a +n +s +p +o +r +t +a +t +i +o +n + +A +u +t +h +o +r +i +t +y + + + + + + + + +C +i +t +y + +A +t +t +o +r +n +e +y + + + + + + +E + +| + + +D +i +s +t +r +i +c +t + + +A +t +t +o +r +n +e +y + + + + + + +E + +| + + +P +u +b +l +i +c + +D +e +f +e +n +d +e +r + + + + + + + + +S +h +e +r +i +f +f + + + + + + + + +A + + + + + + +C +o +n +t +r +o +l +l +e +r + + + + + + + + +A +d +u +l +t + +P +r +o +b +a +t +i +o +n + + + + + + +S +u +p +e +r +i +o +r + +C +o +u +r +t + + + + + + +P +- + + +T +r +e +a +s +u +r +e +r +/ + +T +a +x + +C +o +l +l +e +c +t +o +r + + + + + + +Y +o +u +t +h + +C +o +m +m +i +s +s +i +o +n + + + + + + +A +c +a +d +e +m +y + +o +f + +S +c +i +e +n +c +e +s + + + + + + +A +i +r +p +o +r +t + +C +o +m +m +i +s +s +i +o +n + + + + + + + + +A +s +i +a +n + +A +r +t + + +M +u +s +e +u +m + + + + + + +A +r +t +s + +C +o +m +m +i +s +s +i +o +n + + + + + + +E +a +r +l +y + +C +h +i +l +d +h +o +o +d + + + + + + +E +n +v +i +r +o +n +m +e +n +t + +C +o +m +m +i +s +s +i +o +n + + + + + + +E +m +e +r +g +e +n +c +y + +C +o +m +m +u +n +i +c +a +t +i +o +n +s + + + + + + +E +c +o +n +o +m +i +c + +& + +W +o +r +k +f +o +r +c +e + +D +e +v +e +l +o +p +m +e +n +t + + + + + + + + + + +G +S +A + +C +i +t +y + +A +d +m +i +n +i +s +t +r +a +t +o +r + + + + + + +C +h +i +l +d +r +e +n +, + +Y +o +u +t +h + +& + +T +h +e +i +r + +F +a +m +i +l +i +e +s + + + + + + +C +i +v +i +l + +S +e +r +v +i +c +e + +C +o +m +m +i +s +s +i +o +n + + + + + + + + +H +u +m +a +n + +R +e +s +o +u +r +c +e +s + + + + + + +H +o +m +e +l +e +s +s +n +e +s +s + +a +n +d + + +S +u +p +p +o +r +t +i +v +e + +H +o +u +s +i +n +g + + + + + + +H +e +a +l +t +h + +C +o +m +m +i +s +s +i +o +n + + + + + + +F +i +r +e + +C +o +m +m +i +s +s +i +o +n + + + + + + +F +i +n +e + +A +r +t +s + +M +u +s +e +u +m +s + + + + + + +A +n +i +m +a +l + +C +a +r +e + +& + +C +o +n +t +r +o +l + + + + + + +C +o +n +v +e +n +t +i +o +n + +F +a +c +i +l +i +t +i +e +s + +M +a +n +a +g +e +m +e +n +t + + + + + + +C +o +u +n +t +y + +C +l +e +r +k + + + + + + +M +e +d +i +c +a +l + +E +x +a +m +i +n +e +r + + + + + + + + +H +u +m +a +n + +R +i +g +h +t +s + +C +o +m +m +i +s +s +i +o +n + + + + + + +L +a +w + +L +i +b +r +a +r +y + +B +o +a +r +d + +o +f + +T +r +u +s +t +e +e +s + + + + + + +J +u +v +e +n +i +l +e + +P +r +o +b +a +t +i +o +n + +C +o +m +m +i +s +s +i +o +n + + + + + + +L +i +b +r +a +r +y + +C +o +m +m +i +s +s +i +o +n + + + + + + +H +u +m +a +n + +S +e +r +v +i +c +e +s + + +C +o +m +m +i +s +s +i +o +n + + + + + + +S +A +N + +F +R +A +N +C +I +S +C +O +: + +A +N + +O +V +E +R +V +I +E +W + + + + + + +P +u +r +c +h +a +s +e +r +/ +C +o +n +t +r +a +c +t + +A +d +m +i +n +i +s +t +r +a +t +i +o +n + + + + + + +R +e +a +l + +E +s +t +a +t +e + + + + + + +T +e +c +h +n +o +l +o +g +y + + + + + + +T +r +e +a +s +u +r +e + +I +s +l +a +n +d + + +D +e +v +e +l +o +p +m +e +n +t + +A +u +t +h +o +r +i +t +y + + + + + + +P +o +l +i +c +e + +A +c +c +o +u +n +t +a +b +i +l +i +t +y + + + + + + +P +o +r +t + +C +o +m +m +i +s +s +i +o +n + + + + + + +P +u +b +l +i +c + +U +t +i +l +i +t +i +e +s + +C +o +m +m +i +s +s +i +o +n + + + + + + +P +u +b +l +i +c + +W +o +r +k +s + + + + + + +R +e +c +r +e +a +t +i +o +n + +& + +P +a +r +k +s + +C +o +m +m +i +s +s +i +o +n + + + + + + +R +e +n +t + +S +t +a +b +i +l +i +z +a +t +i +o +n + +B +o +a +r +d + + + + + + +R +e +t +i +r +e +m +e +n +t + + +S +y +s +t +e +m + +B +o +a +r +d + + + + + + +A +p +p +e +a +l +s + +B +o +a +r +d + + + + + + +A + + +B +u +i +l +d +i +n +g + + +I +n +s +p +e +c +t +i +o +n + +C +o +m +m +i +s +s +i +o +n + + + + + + +3 + + +C +h +i +l +d + +S +u +p +p +o +r +t + +S +e +r +v +i +c +e +s + + + + + + +S + + +E +l +e +c +t +i +o +n +s + +C +o +m +m +i +s +s +i +o +n + + + + + + +S + + +E +n +t +e +r +t +a +i +n +m +e +n +t + + +C +o +m +m +i +s +s +i +o +n + + + + + + +C +o +m +m +i +s +s +i +o +n + +o +n + +t +h +e + +S +t +a +t +u +s + +o +f + +W +o +m +e +n + + + + + + +W +a +r + +M +e +m +o +r +i +a +l + +B +o +a +r +d + +o +f + +T +r +u +s +t +e +e +s + + + + + + +E +t +h +i +c +s + +C +o +m +m +i +s +s +i +o +n + + + + + + +P +l +a +n +n +i +n +g + +C +o +m +m +i +s +s +i +o +n + + + + + + +P +o +l +i +c +e + +C +o +m +m +i +s +s +i +o +n + + + + + + +S + + +H +e +a +l +t +h + +S +e +r +v +i +c +e + +B +o +a +r +d + + + + + + +s + +| + + +C +h +i +l +d +r +e +n + +& + +F +a +m +i +l +i +e +s + +C +o +m +m +i +s +s +i +o +n + + + + + + +O +f +f +i +c +e + +o +f + +C +o +m +m +u +n +i +t +y + +I +n +v +e +s +t +m +e +n +t + +a +n +d + +I +n +f +r +a +s +t +r +u +c +t +u +r +e + + + + + + +M +u +n +i +c +i +p +a +l + +T +r +a +n +s +p +o +r +t +a +t +i +o +n + +A +g +e +n +c +y + + + + + + +S +h +e +r +i +f +f + +A +c +c +o +u +n +t +a +b +i +l +i +t +y + + + + + + +A + += + +A +p +p +o +i +n +t +e +d + + + + + + +E + += + +E +l +e +c +t +e +d + + + + + + +S + += + +S +h +a +r +e +d + +A +p +p +o +i +n +t +m +e +n +t + +b +y + +V +a +r +i +o +u +s + +E +l +e +c +t +e +d + +O +f +f +i +c +i +a +l +s + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +3 +0 + +S +A +N + +F +R +A +N +C +I +S +C +O +: + +A +N + +O +V +E +R +V +I +E +W + + + + + + +e + +| + + +A +s +s +e +s +s +o +r +/ + +R +e +c +o +r +d +e +r + + + + + + +A +p +p +e +a +l +s + +B +o +a +r +d + + + + + + + + +M +a +y +o +r + + + + + + +E + + +B +o +a +r +d + +o +f + + +S +u +p +e +r +v +i +s +o +r +s + + + + + + +T +r +a +n +s +p +o +r +t +a +t +i +o +n + +A +u +t +h +o +r +i +t +y + + + + + + + + + + +C +i +t +y + +A +t +t +o +r +n +e +y + + + + + + +D +i +s +t +r +i +c +t + + +A +t +t +o +r +n +e +y + + + + + + +E + +| + + +P +u +b +l +i +c + +D +e +f +e +n +d +e +r + + + + + + + + +S +h +e +r +i +f +f + + + + + + + + +A + + + + + + +C +o +n +t +r +o +l +l +e +r + + + + + + + + +A +d +u +l +t + +P +r +o +b +a +t +i +o +n + + + + + + +S +u +p +e +r +i +o +r + +C +o +u +r +t + + + + + + +T +r +e +a +s +u +r +e +r +/ + +T +a +x + +C +o +l +l +e +c +t +o +r + + + + + + +Y +o +u +t +h + +C +o +m +m +i +s +s +i +o +n + + + + + + +A +c +a +d +e +m +y + +o +f + +S +c +i +e +n +c +e +s + + + + + + +A +i +r +p +o +r +t + +C +o +m +m +i +s +s +i +o +n + + + + + + + + +A +s +i +a +n + +A +r +t + + +M +u +s +e +u +m + + + + + + +A +r +t +s + +C +o +m +m +i +s +s +i +o +n + + + + + + +E +a +r +l +y + +C +h +i +l +d +h +o +o +d + + + + + + +E +n +v +i +r +o +n +m +e +n +t + +C +o +m +m +i +s +s +i +o +n + + + + + + +E +m +e +r +g +e +n +c +y + +C +o +m +m +u +n +i +c +a +t +i +o +n +s + + + + + + +E +c +o +n +o +m +i +c + +& + +W +o +r +k +f +o +r +c +e + +D +e +v +e +l +o +p +m +e +n +t + + + + + + +A +n +i +m +a +l + +C +a +r +e + +& + +C +o +n +t +r +o +l + + + + + + +P +u +r +c +h +a +s +e +r +/ +C +o +n +t +r +a +c +t + +A +d +m +i +n +i +s +t +r +a +t +i +o +n + + + + + + +A +p +p +e +a +l +s + +B +o +a +r +d + + + + + + +E +t +h +i +c +s + +C +o +m +m +i +s +s +i +o +n + + + + + + + + +G +S +A +C +i +t +y + +A +d +m +i +n +i +s +t +r +a +t +o +r + + + + + + +C +h +i +l +d +r +e +n +, + +Y +o +u +t +h + +& + +T +h +e +i +r + +F +a +m +i +l +i +e +s + + + + + + +C +i +v +i +l + +S +e +r +v +i +c +e + +C +o +m +m +i +s +s +i +o +n + + + + + + +C +o +n +v +e +n +t +i +o +n + +F +a +c +i +l +i +t +i +e +s + +M +a +n +a +g +e +m +e +n +t + + + + + + +R +e +a +l + +E +s +t +a +t +e + + + + + + +A + + +B +u +i +l +d +i +n +g + + +I +n +s +p +e +c +t +i +o +n + +C +o +m +m +i +s +s +i +o +n + + + + + + +P +l +a +n +n +i +n +g + +C +o +m +m +i +s +s +i +o +n + + + + + + +C +o +u +n +t +y + +C +l +e +r +k + + + + + + +M +e +d +i +c +a +l + +E +x +a +m +i +n +e +r + + + + + + +T +e +c +h +n +o +l +o +g +y + + + + + + +T +r +e +a +s +u +r +e + +I +s +l +a +n +d + + +D +e +v +e +l +o +p +m +e +n +t + +A +u +t +h +o +r +i +t +y + + + + + + + + + + +H +u +m +a +n + +R +e +s +o +u +r +c +e +s + + + + + + +H +o +m +e +l +e +s +s +n +e +s +s + +a +n +d + + +S +u +p +p +o +r +t +i +v +e + +H +o +u +s +i +n +g + + + + + + +H +e +a +l +t +h + +C +o +m +m +i +s +s +i +o +n + + + + + + +F +i +r +e + +C +o +m +m +i +s +s +i +o +n + + + + + + +F +i +n +e + +A +r +t +s + +M +u +s +e +u +m +s + + + + + + +H +u +m +a +n + +R +i +g +h +t +s + +C +o +m +m +i +s +s +i +o +n + + + + + + +P +o +l +i +c +e + +A +c +c +o +u +n +t +a +b +i +l +i +t +y + + + + + + +P +o +r +t + +C +o +m +m +i +s +s +i +o +n + + + + + + +H +u +m +a +n + +S +e +r +v +i +c +e +s + +C +o +m +m +i +s +s +i +o +n + + + + + + +J +u +v +e +n +i +l +e + +P +r +o +b +a +t +i +o +n + +C +o +m +m +i +s +s +i +o +n + + + + + + +L +a +w + +L +i +b +r +a +r +y + +B +o +a +r +d + +o +f + +T +r +u +s +t +e +e +s + + + + + + +L +i +b +r +a +r +y + +C +o +m +m +i +s +s +i +o +n + + + + + + +S +A +N + +F +R +A +N +C +I +S +C +O +: + +A +N + +O +V +E +R +V +I +E +W + + + + + + +P +u +b +l +i +c + +U +t +i +l +i +t +i +e +s + +C +o +m +m +i +s +s +i +o +n + + + + + + +P +u +b +l +i +c + +W +o +r +k +s + + + + + + +R +e +c +r +e +a +t +i +o +n + +& + +P +a +r +k +s + +C +o +m +m +i +s +s +i +o +n + + + + + + +R +e +n +t + +S +t +a +b +i +l +i +z +a +t +i +o +n + +B +o +a +r +d + + + + + + +R +e +t +i +r +e +m +e +n +t + + +S +y +s +t +e +m + +B +o +a +r +d + + + + + + +S + + +C +h +i +l +d + +S +u +p +p +o +r +t + +S +e +r +v +i +c +e +s + + + + + + +S + + +E +l +e +c +t +i +o +n +s + +C +o +m +m +i +s +s +i +o +n + + + + + + +S + + +E +n +t +e +r +t +a +i +n +m +e +n +t + + +C +o +m +m +i +s +s +i +o +n + + + + + + +C +o +m +m +i +s +s +i +o +n + +o +n + +t +h +e + +S +t +a +t +u +s + +o +f + +W +o +m +e +n + + + + + + +W +a +r + +M +e +m +o +r +i +a +l + +B +o +a +r +d + +o +f + +T +r +u +s +t +e +e +s + + + + + + +P +o +l +i +c +e + +C +o +m +m +i +s +s +i +o +n + + + + + + +S + + +H +e +a +l +t +h + +S +e +r +v +i +c +e + +B +o +a +r +d + + + + + + +s + +| + + +C +h +i +l +d +r +e +n + +& + +F +a +m +i +l +i +e +s + +C +o +m +m +i +s +s +i +o +n + + + + + + +O +f +f +i +c +e + +o +f + +C +o +m +m +u +n +i +t +y + +I +n +v +e +s +t +m +e +n +t + +a +n +d + +I +n +f +r +a +s +t +r +u +c +t +u +r +e + + + + + + +M +u +n +i +c +i +p +a +l + +T +r +a +n +s +p +o +r +t +a +t +i +o +n + +A +g +e +n +c +y + + + + + + +S +h +e +r +i +f +f + +A +c +c +o +u +n +t +a +b +i +l +i +t +y + + + + + + +A + += + +A +p +p +o +i +n +t +e +d + + + + + + +E + += + +E +l +e +c +t +e +d + + + + + + +S + += + +S +h +a +r +e +d + +A +p +p +o +i +n +t +m +e +n +t + +b +y + +V +a +r +i +o +u +s + +E +l +e +c +t +e +d + +O +f +f +i +c +i +a +l +s + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +3 +0 + +S +A +N + +F +R +A +N +C +I +S +C +O +: + +A +N + +O +V +E +R +V +I +E +W + + + + + + + + +M +a +y +o +r + + + + + + + + + + + + + + +A +s +s +e +s +s +o +r +/ + +R +e +c +o +r +d +e +r + + + + + + +A +p +p +e +a +l +s + +B +o +a +r +d + + + + + + +Y +o +u +t +h + +C +o +m +m +i +s +s +i +o +n + + + + + + +B +o +a +r +d + +o +f + +S +u +p +e +r +v +i +s +o +r +s + + + + + + +C +i +t +y + +A +t +t +o +r +n +e +y + + + + + + +D +i +s +t +r +i +c +t + + +A +t +t +o +r +n +e +y + + + + + + + + +P +u +b +l +i +c + +D +e +f +e +n +d +e +r + + + + + + + + + + + + +S +h +e +r +i +f +f + + + + + + +S +u +p +e +r +i +o +r + +C +o +u +r +t + + + + + + +T +r +e +a +s +u +r +e +r +/ + +T +a +x + +C +o +l +l +e +c +t +o +r + + + + + + + + +A + + + + + + +T +r +a +n +s +p +o +r +t +a +t +i +o +n + +A +u +t +h +o +r +i +t +y + + + + + + +C +o +n +t +r +o +l +l +e +r + + + + + + +A +d +u +l +t + + +P +r +o +b +a +t +i +o +n + + + + + + + + + + +A +c +a +d +e +m +y + +o +f + +S +c +i +e +n +c +e +s + + + + + + +A +i +r +p +o +r +t + +C +o +m +m +i +s +s +i +o +n + + + + + + +A +r +t +s + +C +o +m +m +i +s +s +i +o +n + + + + + + +A +s +i +a +n + +A +r +t + +M +u +s +e +u +m + + + + + + +E +a +r +l +y + +C +h +i +l +d +h +o +o +d + + + + + + +E +c +o +n +o +m +i +c + +& + +W +o +r +k +f +o +r +c +e + +D +e +v +e +l +o +p +m +e +n +t + + + + + + +E +m +e +r +g +e +n +c +y + +C +o +m +m +u +n +i +c +a +t +i +o +n +s + + + + + + +E +n +v +i +r +o +n +m +e +n +t + +C +o +m +m +i +s +s +i +o +n + + + + + + + + + + +G +S +A +C +i +t +y + +A +d +m +i +n +i +s +t +r +a +t +o +r + + + + + + +C +h +i +l +d +r +e +n +, + +Y +o +u +t +h + +& + +T +h +e +i +r + +F +a +m +i +l +i +e +s + + + + + + +C +i +v +i +l + +S +e +r +v +i +c +e + +C +o +m +m +i +s +s +i +o +n + + + + + + +F +i +n +e + +A +r +t +s + +M +u +s +e +u +m +s + + + + + + +F +i +r +e + +C +o +m +m +i +s +s +i +o +n + + + + + + +H +e +a +l +t +h + +C +o +m +m +i +s +s +i +o +n + + + + + + +H +o +m +e +l +e +s +s +n +e +s +s + +a +n +d + + +S +u +p +p +o +r +t +i +v +e + +H +o +u +s +i +n +g + + + + + + +H +u +m +a +n + +R +e +s +o +u +r +c +e +s + + + + + + + + + + +A +n +i +m +a +l + +C +a +r +e + +& + +C +o +n +t +r +o +l + + + + + + +C +o +n +v +e +n +t +i +o +n + +F +a +c +i +l +i +t +i +e +s + +M +a +n +a +g +e +m +e +n +t + + + + + + +C +o +u +n +t +y + +C +l +e +r +k + + + + + + +M +e +d +i +c +a +l + +E +x +a +m +i +n +e +r + + + + + + +H +u +m +a +n + +R +i +g +h +t +s + +C +o +m +m +i +s +s +i +o +n + + + + + + +H +u +m +a +n + +S +e +r +v +i +c +e +s + +C +o +m +m +i +s +s +i +o +n + + + + + + +J +u +v +e +n +i +l +e + +P +r +o +b +a +t +i +o +n + +C +o +m +m +i +s +s +i +o +n + + + + + + +L +a +w + +L +i +b +r +a +r +y + +B +o +a +r +d + +o +f + +T +r +u +s +t +e +e +s + + + + + + +L +i +b +r +a +r +y + +C +o +m +m +i +s +s +i +o +n + + + + + + +S +A +N + +F +R +A +N +C +I +S +C +O +: + +A +N + +O +V +E +R +V +I +E +W + + + + + + +P +u +r +c +h +a +s +e +r +/ +C +o +n +t +r +a +c +t + +A +d +m +i +n +i +s +t +r +a +t +i +o +n + + + + + + +R +e +a +l + +E +s +t +a +t +e + + + + + + +T +e +c +h +n +o +l +o +g +y + + + + + + +T +r +e +a +s +u +r +e + +I +s +l +a +n +d + +D +e +v +e +l +o +p +m +e +n +t + +A +u +t +h +o +r +i +t +y + + + + + + +P +o +l +i +c +e + +A +c +c +o +u +n +t +a +b +i +l +i +t +y + + + + + + +P +o +r +t + +C +o +m +m +i +s +s +i +o +n + + + + + + +P +u +b +l +i +c + + +U +t +i +l +i +t +i +e +s + +C +o +m +m +i +s +s +i +o +n + + + + + + +P +u +b +l +i +c + +W +o +r +k +s + + + + + + +R +e +c +r +e +a +t +i +o +n + +& + +P +a +r +k +s + +C +o +m +m +i +s +s +i +o +n + + + + + + +R +e +n +t + +S +t +a +b +i +l +i +z +a +t +i +o +n + +B +o +a +r +d + + + + + + +R +e +t +i +r +e +m +e +n +t + + +S +y +s +t +e +m + +B +o +a +r +d + + + + + + +A +p +p +e +a +l +s + +B +o +a +r +d + + + + + + +E +t +h +i +c +s + +C +o +m +m +i +s +s +i +o +n + + + + + + + + + + +B +u +i +l +d +i +n +g + +I +n +s +p +e +c +t +i +o +n + +C +o +m +m +i +s +s +i +o +n + + + + + + +C +h +i +l +d + +S +u +p +p +o +r +t + +S +e +r +v +i +c +e +s + + + + + + + + +E +l +e +c +t +i +o +n +s + +C +o +m +m +i +s +s +i +o +n + + + + + + + + +E +n +t +e +r +t +a +i +n +m +e +n +t + +C +o +m +m +i +s +s +i +o +n + + + + + + +C +o +m +m +i +s +s +i +o +n + +o +n + +t +h +e + +S +t +a +t +u +s + +o +f + +W +o +m +e +n + + + + + + +W +a +r + +M +e +m +o +r +i +a +l + +B +o +a +r +d + +o +f + +T +r +u +s +t +e +e +s + + + + + + + + + + + + + + +P +l +a +n +n +i +n +g + +C +o +m +m +i +s +s +i +o +n + + + + + + +P +o +l +i +c +e + +C +o +m +m +i +s +s +i +o +n + + + + + + +H +e +a +l +t +h + +S +e +r +v +i +c +e + +B +o +a +r +d + + + + + + +C +h +i +l +d +r +e +n + +& + + +F +a +m +i +l +i +e +s + +C +o +m +m +i +s +s +i +o +n + + + + + + +O +f +f +i +c +e + +o +f + +C +o +m +m +u +n +i +t +y + +I +n +v +e +s +t +m +e +n +t + +a +n +d + +I +n +f +r +a +s +t +r +u +c +t +u +r +e + + + + + + +M +u +n +i +c +i +p +a +l + +T +r +a +n +s +p +o +r +t +a +t +i +o +n + +A +g +e +n +c +y + + + + + + +S +h +e +r +i +f +f + +A +c +c +o +u +n +t +a +b +i +l +i +t +y + + + + + + +A + += + +A +p +p +o +i +n +t +e +d + + + + + + +E + += + +E +l +e +c +t +e +d + + + + + + +S + += + +S +h +a +r +e +d + +A +p +p +o +i +n +t +m +e +n +t + +b +y + +V +a +r +i +o +u +s + +E +l +e +c +t +e +d + +O +f +f +i +c +i +a +l +s + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +3 +0 + +S +A +N + +F +R +A +N +C +I +S +C +O +: + +A +N + +O +V +E +R +V +I +E +W + + + + + + + + +M +a +y +o +r + + + + + + + + +A +s +s +e +s +s +o +r +/ + +R +e +c +o +r +d +e +r + + + + + + +A +p +p +e +a +l +s + +B +o +a +r +d + + + + + + +E + + +B +o +a +r +d + +o +f + + +S +u +p +e +r +v +i +s +o +r +s + + + + + + +T +r +a +n +s +p +o +r +t +a +t +i +o +n + +A +u +t +h +o +r +i +t +y + + + + + + + + +C +i +t +y + +A +t +t +o +r +n +e +y + + + + + + +E + + +D +i +s +t +r +i +c +t + + +A +t +t +o +r +n +e +y + + + + + + +E + + +P +u +b +l +i +c + + +D +e +f +e +n +d +e +r + + + + + + + + +S +h +e +r +i +f +f + + + + + + + + +A + + + + + + +C +o +n +t +r +o +l +l +e +r + + + + + + + + +A +d +u +l +t + +P +r +o +b +a +t +i +o +n + + + + + + +S +u +p +e +r +i +o +r + +C +o +u +r +t + + + + + + +T +r +e +a +s +u +r +e +r +/ + +T +a +x + +C +o +l +l +e +c +t +o +r + + + + + + +Y +o +u +t +h + +C +o +m +m +i +s +s +i +o +n + + + + + + +A +c +a +d +e +m +y + +o +f + +S +c +i +e +n +c +e +s + + + + + + +A +i +r +p +o +r +t + +C +o +m +m +i +s +s +i +o +n + + + + + + + + +A +s +i +a +n + +A +r +t + + +M +u +s +e +u +m + + + + + + +A +r +t +s + +C +o +m +m +i +s +s +i +o +n + + + + + + +E +a +r +l +y + +C +h +i +l +d +h +o +o +d + + + + + + +E +n +v +i +r +o +n +m +e +n +t + +C +o +m +m +i +s +s +i +o +n + + + + + + +E +m +e +r +g +e +n +c +y + +C +o +m +m +u +n +i +c +a +t +i +o +n +s + + + + + + +E +c +o +n +o +m +i +c + +& + +W +o +r +k +f +o +r +c +e + +D +e +v +e +l +o +p +m +e +n +t + + + + + + +A +n +i +m +a +l + +C +a +r +e + +& + +C +o +n +t +r +o +l + + + + + + +P +u +r +c +h +a +s +e +r +/ +C +o +n +t +r +a +c +t + +A +d +m +i +n +i +s +t +r +a +t +i +o +n + + + + + + +A +p +p +e +a +l +s + +B +o +a +r +d + + + + + + +E +t +h +i +c +s + +C +o +m +m +i +s +s +i +o +n + + + + + + + + +G +S +A + +C +i +t +y + +A +d +m +i +n +i +s +t +r +a +t +o +r + + + + + + +C +h +i +l +d +r +e +n +, + +Y +o +u +t +h + +& + +T +h +e +i +r + +F +a +m +i +l +i +e +s + + + + + + +C +i +v +i +l + +S +e +r +v +i +c +e + +C +o +m +m +i +s +s +i +o +n + + + + + + +C +o +n +v +e +n +t +i +o +n + +F +a +c +i +l +i +t +i +e +s + +M +a +n +a +g +e +m +e +n +t + + + + + + +R +e +a +l + +E +s +t +a +t +e + + + + + + +A + + +B +u +i +l +d +i +n +g + + +I +n +s +p +e +c +t +i +o +n + +C +o +m +m +i +s +s +i +o +n + + + + + + +P +l +a +n +n +i +n +g + +C +o +m +m +i +s +s +i +o +n + + + + + + +C +o +u +n +t +y + +C +l +e +r +k + + + + + + +M +e +d +i +c +a +l + +E +x +a +m +i +n +e +r + + + + + + +T +e +c +h +n +o +l +o +g +y + + + + + + +T +r +e +a +s +u +r +e + +I +s +l +a +n +d + + +D +e +v +e +l +o +p +m +e +n +t + +A +u +t +h +o +r +i +t +y + + + + + + + + + + +H +u +m +a +n + +R +e +s +o +u +r +c +e +s + + + + + + +H +o +m +e +l +e +s +s +n +e +s +s + +a +n +d + + +S +u +p +p +o +r +t +i +v +e + +H +o +u +s +i +n +g + + + + + + +H +e +a +l +t +h + +C +o +m +m +i +s +s +i +o +n + + + + + + +F +i +r +e + +C +o +m +m +i +s +s +i +o +n + + + + + + +F +i +n +e + +A +r +t +s + +M +u +s +e +u +m +s + + + + + + +H +u +m +a +n + +R +i +g +h +t +s + +C +o +m +m +i +s +s +i +o +n + + + + + + +P +o +l +i +c +e + +A +c +c +o +u +n +t +a +b +i +l +i +t +y + + + + + + +P +o +r +t + +C +o +m +m +i +s +s +i +o +n + + + + + + +H +u +m +a +n + +S +e +r +v +i +c +e +s + +C +o +m +m +i +s +s +i +o +n + + + + + + +J +u +v +e +n +i +l +e + +P +r +o +b +a +t +i +o +n + +C +o +m +m +i +s +s +i +o +n + + + + + + +L +a +w + +L +i +b +r +a +r +y + +B +o +a +r +d + +o +f + +T +r +u +s +t +e +e +s + + + + + + +L +i +b +r +a +r +y + +C +o +m +m +i +s +s +i +o +n + + + + + + +S +A +N + +F +R +A +N +C +I +S +C +O +: + +A +N + +O +V +E +R +V +I +E +W + + + + + + +P +u +b +l +i +c + +U +t +i +l +i +t +i +e +s + +C +o +m +m +i +s +s +i +o +n + + + + + + +P +u +b +l +i +c + +W +o +r +k +s + + + + + + +R +e +c +r +e +a +t +i +o +n + +& + +P +a +r +k +s + +C +o +m +m +i +s +s +i +o +n + + + + + + +R +e +n +t + +S +t +a +b +i +l +i +z +a +t +i +o +n + +B +o +a +r +d + + + + + + +R +e +t +i +r +e +m +e +n +t + + +S +y +s +t +e +m + +B +o +a +r +d + + + + + + +S + + +C +h +i +l +d + +S +u +p +p +o +r +t + +S +e +r +v +i +c +e +s + + + + + + +S + + +E +l +e +c +t +i +o +n +s + +C +o +m +m +i +s +s +i +o +n + + + + + + +S + + +E +n +t +e +r +t +a +i +n +m +e +n +t + + +C +o +m +m +i +s +s +i +o +n + + + + + + +C +o +m +m +i +s +s +i +o +n + +o +n + +t +h +e + +S +t +a +t +u +s + +o +f + +W +o +m +e +n + + + + + + +W +a +r + +M +e +m +o +r +i +a +l + +B +o +a +r +d + +o +f + +T +r +u +s +t +e +e +s + + + + + + +P +o +l +i +c +e + +C +o +m +m +i +s +s +i +o +n + + + + + + +S + + +H +e +a +l +t +h + +S +e +r +v +i +c +e + +B +o +a +r +d + + + + + + +S + + +C +h +i +l +d +r +e +n + +& + +F +a +m +i +l +i +e +s + +C +o +m +m +i +s +s +i +o +n + + + + + + +O +f +f +i +c +e + +o +f + +C +o +m +m +u +n +i +t +y + +I +n +v +e +s +t +m +e +n +t + +a +n +d + +I +n +f +r +a +s +t +r +u +c +t +u +r +e + + + + + + +M +u +n +i +c +i +p +a +l + +T +r +a +n +s +p +o +r +t +a +t +i +o +n + +A +g +e +n +c +y + + + + + + +S +h +e +r +i +f +f + +A +c +c +o +u +n +t +a +b +i +l +i +t +y + + + + + + +A + += + +A +p +p +o +i +n +t +e +d + + + + + + +E + += + +E +l +e +c +t +e +d + + + + + + +S + += + +S +h +a +r +e +d + +A +p +p +o +i +n +t +m +e +n +t + +b +y + +V +a +r +i +o +u +s + +E +l +e +c +t +e +d + +O +f +f +i +c +i +a +l +s + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +S +A +N + +F +R +A +N +C +I +S +C +O +: + +A +N + +O +V +E +R +V +I +E +W + + + + + + + + + + + + +M +a +y +o +r + + + + + + +A +s +s +e +s +s +o +r +/ + +R +e +c +o +r +d +e +r + + + + + + +B +o +a +r +d + +o +f + +S +u +p +e +r +v +i +s +o +r +s + + + + + + + + +C +i +t +y + +A +t +t +o +r +n +e +y + + + + + + + + +D +i +s +t +r +i +c +t + + +A +t +t +o +r +n +e +y + + + + + + + + +P +u +b +l +i +c + +D +e +f +e +n +d +e +r + + + + + + +E + + + + + + + + +S +h +e +r +i +f +f + + + + + + + + +S +u +p +e +r +i +o +r + +C +o +u +r +t + + + + + + + + +A + + + + + + + + +E + + + + + + +T +r +e +a +s +u +r +e +r +/ + + +T +a +x + +C +o +l +l +e +c +t +o +r + + + + + + +A +p +p +e +a +l +s + +B +o +a +r +d + + + + + + +Y +o +u +t +h + +C +o +m +m +i +s +s +i +o +n + + + + + + + + +A + + + + + + +T +r +a +n +s +p +o +r +t +a +t +i +o +n + +A +u +t +h +o +r +i +t +y + + + + + + +C +o +n +t +r +o +l +l +e +r + + + + + + +A +d +u +l +t + +P +r +o +b +a +t +i +o +n + + + + + + + + +A +c +a +d +e +m +y + +o +f + +S +c +i +e +n +c +e +s + + + + + + +A +i +r +p +o +r +t + +C +o +m +m +i +s +s +i +o +n + + + + + + +A +r +t +s + +C +o +m +m +i +s +s +i +o +n + + + + + + +A +s +i +a +n + +A +r +t + +M +u +s +e +u +m + + + + + + +E +a +r +l +y + +C +h +i +l +d +h +o +o +d + + + + + + +E +c +o +n +o +m +i +c + +& + +W +o +r +k +f +o +r +c +e + +D +e +v +e +l +o +p +m +e +n +t + + + + + + +E +m +e +r +g +e +n +c +y + +C +o +m +m +u +n +i +c +a +t +i +o +n +s + + + + + + +E +n +v +i +r +o +n +m +e +n +t + + +C +o +m +m +i +s +s +i +o +n + + + + + + +G +S +A + +C +i +t +y + +A +d +m +i +n +i +s +t +r +a +t +o +r + + + + + + +C +h +i +l +d +r +e +n +, + +Y +o +u +t +h + +& + +T +h +e +i +r + +F +a +m +i +l +i +e +s + + + + + + +C +i +v +i +l + +S +e +r +v +i +c +e + +C +o +m +m +i +s +s +i +o +n + + + + + + +F +i +n +e + +A +r +t +s + +M +u +s +e +u +m +s + + + + + + +F +i +r +e + +C +o +m +m +i +s +s +i +o +n + + + + + + +H +e +a +l +t +h + +C +o +m +m +i +s +s +i +o +n + + + + + + +H +o +m +e +l +e +s +s +n +e +s +s + +a +n +d + + +S +u +p +p +o +r +t +i +v +e + +H +o +u +s +i +n +g + + + + + + +H +u +m +a +n + +R +e +s +o +u +r +c +e +s + + + + + + + + + + +A +n +i +m +a +l + +C +a +r +e + +& + +C +o +n +t +r +o +l + + + + + + +C +o +n +v +e +n +t +i +o +n + +F +a +c +i +l +i +t +i +e +s + +M +a +n +a +g +e +m +e +n +t + + + + + + +C +o +u +n +t +y + +C +l +e +r +k + + + + + + +M +e +d +i +c +a +l + +E +x +a +m +i +n +e +r + + + + + + +H +u +m +a +n + +R +i +g +h +t +s + +C +o +m +m +i +s +s +i +o +n + + + + + + +H +u +m +a +n + +S +e +r +v +i +c +e +s + +C +o +m +m +i +s +s +i +o +n + + + + + + +J +u +v +e +n +i +l +e + +P +r +o +b +a +t +i +o +n + +C +o +m +m +i +s +s +i +o +n + + + + + + +L +a +w + +L +i +b +r +a +r +y + +B +o +a +r +d + +o +f + +T +r +u +s +t +e +e +s + + + + + + +L +i +b +r +a +r +y + +C +o +m +m +i +s +s +i +o +n + + + + + + +F +R +A +N +C +I +S +C +O +: + +A +N + +O +V +E +R +V +I +E +W + + + + + + +P +u +r +c +h +a +s +e +r +/ +C +o +n +t +r +a +c +t + +A +d +m +i +n +i +s +t +r +a +t +i +o +n + + + + + + +R +e +a +l + +E +s +t +a +t +e + + + + + + +T +e +c +h +n +o +l +o +g +y + + + + + + + + +P +u +b +l +i +c + +W +o +r +k +s + + + + + + +R +e +t +i +r +e +m +e +n +t + +S +y +s +t +e +m + +B +o +a +r +d + + + + + + +T +r +e +a +s +u +r +e + +I +s +l +a +n +d + + +D +e +v +e +l +o +p +m +e +n +t + +A +u +t +h +o +r +i +t +y + + + + + + +P +u +b +l +i +c + +U +t +i +l +i +t +i +e +s + +C +o +m +m +i +s +s +i +o +n + + + + + + +R +e +c +r +e +a +t +i +o +n + +& + +P +a +r +k +s + +C +o +m +m +i +s +s +i +o +n + + + + + + +P +o +r +t + +C +o +m +m +i +s +s +i +o +n + + + + + + +R +e +n +t + +S +t +a +b +i +l +i +z +a +t +i +o +n + +B +o +a +r +d + + + + + + +P +o +l +i +c +e + +A +c +c +o +u +n +t +a +b +i +l +i +t +y + + + + + + +A + + + + + + +s + + + + + + +A +p +p +e +a +l +s + +B +o +a +r +d + + + + + + +B +u +i +l +d +i +n +g + + +I +n +s +p +e +c +t +i +o +n + +C +o +m +m +i +s +s +i +o +n + + + + + + +C +h +i +l +d + +S +u +p +p +o +r +t + +S +e +r +v +i +c +e +s + + + + + + + + +E +l +e +c +t +i +o +n +s + +C +o +m +m +i +s +s +i +o +n + + + + + + + + +E +n +t +e +r +t +a +i +n +m +e +n +t + +C +o +m +m +i +s +s +i +o +n + + + + + + +C +o +m +m +i +s +s +i +o +n + +o +n + +t +h +e + +S +t +a +t +u +s + +o +f + +W +o +m +e +n + + + + + + +W +a +r + +M +e +m +o +r +i +a +l + +B +o +a +r +d + +o +f + +T +r +u +s +t +e +e +s + + + + + + +E +t +h +i +c +s + +C +o +m +m +i +s +s +i +o +n + + + + + + + + +P +l +a +n +n +i +n +g + +C +o +m +m +i +s +s +i +o +n + + + + + + + + +P +o +l +i +c +e + +C +o +m +m +i +s +s +i +o +n + + + + + + + + + + +S + + + + + + +H +e +a +l +t +h + +S +e +r +v +i +c +e + +B +o +a +r +d + + + + + + +C +h +i +l +d +r +e +n + +& + + +F +a +m +i +l +i +e +s + +C +o +m +m +i +s +s +i +o +n + + + + + + +O +f +f +i +c +e + +o +f + +C +o +m +m +u +n +i +t +y + +I +n +v +e +s +t +m +e +n +t + +a +n +d + +I +n +f +r +a +s +t +r +u +c +t +u +r +e + + + + + + +M +u +n +i +c +i +p +a +l + +T +r +a +n +s +p +o +r +t +a +t +i +o +n + +A +g +e +n +c +y + + + + + + +S +h +e +r +i +f +f + +A +c +c +o +u +n +t +a +b +i +l +i +t +y + + + + + + +A + += + +A +p +p +o +i +n +t +e +d + + + + + + +E + += + +E +l +e +c +t +e +d + +S + += + +S +h +a +r +e +d + +A +p +p +o +i +n +t +m +e +n +t + +b +y + +V +a +r +i +o +u +s + +E +l +e +c +t +e +d + +O +f +f +i +c +i +a +l +s + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +S +A +N + +F +R +A +N +C +I +S +C +O +: + +A +N + +O +V +E +R +V +I +E +W + + + + + + + + +A +r +t +s + +C +o +m +m +i +s +s +i +o +n + + + + + + +E +a +r +l +y + +C +h +i +l +d +h +o +o +d + + + + + + +A +s +i +a +n + +A +r +t + +M +u +s +e +u +m + + + + + + +P +u +b +l +i +c +W +o +r +k +s + + + + + + +E +m +e +r +g +e +n +c +y + +C +o +m +m +u +n +i +c +a +t +i +o +n +s + + + + + + +E +n +v +i +r +o +n +m +e +n +t + +C +o +m +m +i +s +s +i +o +n + + + + + + +P +o +r +t + +C +o +m +m +i +s +s +i +o +n + + + + + + +P +o +l +i +c +e + +A +c +c +o +u +n +t +a +b +i +l +i +t +y + + + + + + +R +e +c +r +e +a +t +i +o +n + +& + +P +a +r +k +s + +C +o +m +m +i +s +s +i +o +n + + + + + + +R +e +t +i +r +e +m +e +n +t + +S +y +s +t +e +m + +B +o +a +r +d + + + + + + +E +c +o +n +o +m +i +c + +& + + +W +o +r +k +f +o +r +c +e + + +D +e +v +e +l +o +p +m +e +n +t + + + + + + +R +e +n +t + +S +t +a +b +i +l +i +z +a +t +i +o +n + +B +o +a +r +d + + + + + + +P +u +b +l +i +c + + +U +t +i +l +i +t +i +e +s + +C +o +m +m +i +s +s +i +o +n + + + + + + +A +c +a +d +e +m +y + +o +f + +S +c +i +e +n +c +e +s + + + + + + +A +i +r +p +o +r +t + +C +o +m +m +i +s +s +i +o +n + + + + + + +P +o +l +i +c +e + +C +o +m +m +i +s +s +i +o +n + + + + + + +C +i +v +i +l + +S +e +r +v +i +c +e + +C +o +m +m +i +s +s +i +o +n + + + + + + +C +o +n +t +r +o +l +l +e +r + + + + + + +H +e +a +l +t +h + +S +e +r +v +i +c +e + +B +o +a +r +d + + + + + + +C +h +i +l +d +r +e +n + +& + + +F +a +m +i +l +i +e +s + +C +o +m +m +i +s +s +i +o +n + + + + + + +T +r +e +a +s +u +r +e + +I +s +l +a +n +d + + +D +e +v +e +l +o +p +m +e +n +t + +A +u +t +h +o +r +i +t +y + + + + + + +A +p +p +e +a +l +s + +B +o +a +r +d + + + + + + +E +t +h +i +c +s + +C +o +m +m +i +s +s +i +o +n + + + + + + +P +l +a +n +n +i +n +g + +C +o +m +m +i +s +s +i +o +n + + + + + + +E +l +e +c +t +i +o +n +s + + +C +o +m +m +i +s +s +i +o +n + + + + + + +B +u +i +l +d +i +n +g + +I +n +s +p +e +c +t +i +o +n + +C +o +m +m +i +s +s +i +o +n + + + + + + +C +h +i +l +d + +S +u +p +p +o +r +t + +S +e +r +v +i +c +e +s + + + + + + +R +e +a +l + +E +s +t +a +t +e + + + + + + +A +s +s +e +s +s +o +r +/ + +R +e +c +o +r +d +e +r + + + + + + +E +n +t +e +r +t +a +i +n +m +e +n +t + +C +o +m +m +i +s +s +i +o +n + + + + + + +D +i +s +t +r +i +c +t + +A +t +t +o +r +n +e +y + + + + + + +S +h +e +r +i +f +f + + + + + + +P +u +b +l +i +c + +D +e +f +e +n +d +e +r + + + + + + +Y +o +u +t +h + +C +o +m +m +i +s +s +i +o +n + + + + + + +C +i +t +y + +A +t +t +o +r +n +e +y + + + + + + +M +e +d +i +c +a +l + + +E +x +a +m +i +n +e +r + + + + + + +S +u +p +e +r +i +o +r + +C +o +u +r +t + + + + + + +A +d +u +l +t + +P +r +o +b +a +t +i +o +n + + + + + + +H +e +a +l +t +h + + +C +o +m +m +i +s +s +i +o +n + + + + + + +L +i +b +r +a +r +y + +C +o +m +m +i +s +s +i +o +n + + + + + + +L +a +w + +L +i +b +r +a +r +y + +B +o +a +r +d + +o +f + +T +r +u +s +t +e +e +s + + + + + + +H +o +m +e +l +e +s +s +n +e +s +s + +a +n +d + + +S +u +p +p +o +r +t +i +v +e + +H +o +u +s +i +n +g + + + + + + +P +u +r +c +h +a +s +e +r +/ +C +o +n +t +r +a +c +t + +A +d +m +i +n +i +s +t +r +a +t +i +o +n + + + + + + +T +r +a +n +s +p +o +r +t +a +t +i +o +n + +A +u +t +h +o +r +i +t +y + + + + + + +A +p +p +e +a +l +s + +B +o +a +r +d + + + + + + +C +o +m +m +i +s +s +i +o +n + +o +n + +t +h +e + +S +t +a +t +u +s + +o +f + +W +o +m +e +n + + + + + + +J +u +v +e +n +i +l +e + +P +r +o +b +a +t +i +o +n + +C +o +m +m +i +s +s +i +o +n + + + + + + +T +e +c +h +n +o +l +o +g +y + + + + + + +C +o +u +n +t +y + +C +l +e +r +k + + + + + + +H +u +m +a +n + +R +i +g +h +t +s + +C +o +m +m +i +s +s +i +o +n + + + + + + +C +o +n +v +e +n +t +i +o +n + +F +a +c +i +l +i +t +i +e +s + +M +a +n +a +g +e +m +e +n +t + + + + + + +H +u +m +a +n + +S +e +r +v +i +c +e +s + +C +o +m +m +i +s +s +i +o +n + + + + + + +W +a +r + +M +e +m +o +r +i +a +l + +B +o +a +r +d + +o +f + +T +r +u +s +t +e +e +s + + + + + + +F +i +n +e + +A +r +t +s + +M +u +s +e +u +m +s + + + + + + +C +h +i +l +d +r +e +n +, + +Y +o +u +t +h + + +& + +T +h +e +i +r + +F +a +m +i +l +i +e +s + + + + + + +H +u +m +a +n + +R +e +s +o +u +r +c +e +s + + + + + + +A +n +i +m +a +l + +C +a +r +e + + +& + +C +o +n +t +r +o +l + + + + + + +T +r +e +a +s +u +r +e +r +/ + + +T +a +x + +C +o +l +l +e +c +t +o +r + + + + + + +B +o +a +r +d + +o +f + +S +u +p +e +r +v +i +s +o +r +s + + + + + + +F +i +r +e + +C +o +m +m +i +s +s +i +o +n + + + + + + +G +S +A +C +i +t +y + +A +d +m +i +n +i +s +t +r +a +t +o +r + + + + + + +M +u +n +i +c +i +p +a +l + +T +r +a +n +s +p +o +r +t +a +t +i +o +n + +A +g +e +n +c +y + + + + + + +O +f +f +i +c +e + +o +f + +C +o +m +m +u +n +i +t +y + +I +n +v +e +s +t +m +e +n +t + +a +n +d + +I +n +f +r +a +s +t +r +u +c +t +u +r +e + + + + + + +M +a +y +o +r + + + + + + + + +F +R +A +N +C +I +S +C +O +: + +A +N + +O +V +E +R +V +I +E +W + + + + + + + + +S +h +e +r +i +f +f + +A +c +c +o +u +n +t +a +b +i +l +i +t +y + + + + + + +A + += + +A +p +p +o +i +n +t +e +d + + + + + + +E + += + +E +l +e +c +t +e +d + + + + + + +S + += + +S +h +a +r +e +d + +A +p +p +o +i +n +t +m +e +n +t + +b +y + +V +a +r +i +o +u +s + +E +l +e +c +t +e +d + +O +f +f +i +c +i +a +l +s + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +3 +0 + +S +A +N + +F +R +A +N +C +I +S +C +O +: + +A +N + +O +V +E +R +V +I +E +W + + + + + + +E + + + + + + +M +a +y +o +r + + + + + + +E + + +A +s +s +e +s +s +o +r +/ + +R +e +c +o +r +d +e +r + + + + + + + + +A +p +p +e +a +l +s + +B +o +a +r +d + + + + + + +Y +o +u +t +h + +C +o +m +m +i +s +s +i +o +n + + + + + + + + +B +o +a +r +d + +o +f + + +S +u +p +e +r +v +i +s +o +r +s + + + + + + +C +i +t +y + +A +t +t +o +r +n +e +y + + + + + + +E + + +D +i +s +t +r +i +c +t + +A +t +t +o +r +n +e +y + + + + + + +E + + +P +u +b +l +i +c + +D +e +f +e +n +d +e +r + + + + + + +E + + + + + + +S +h +e +r +i +f +f + + + + + + + + +T +r +a +n +s +p +o +r +t +a +t +i +o +n + +A +u +t +h +o +r +i +t +y + + + + + + +A +- + + +C +o +n +t +r +o +l +l +e +r + + + + + + +A +c +a +d +e +m +y + +o +f + +S +c +i +e +n +c +e +s + + + + + + +A +i +r +p +o +r +t + +C +o +m +m +i +s +s +i +o +n + + + + + + + + +T +r +e +a +s +u +r +e + +I +s +l +a +n +d + +D +e +v +e +l +o +p +m +e +n +t + +A +u +t +h +o +r +i +t +y + + + + + + +P +u +r +c +h +a +s +e +r +/ +C +o +n +t +r +a +c +t + +A +d +m +i +n +i +s +t +r +a +t +i +o +n + + + + + + +M +e +d +i +c +a +l + +E +x +a +m +i +n +e +r + + + + + + +C +o +n +v +e +n +t +i +o +n + +F +a +c +i +l +i +t +i +e +s + +M +a +n +a +g +e +m +e +n +t + + + + + + +C +o +u +n +t +y + +C +l +e +r +k + + + + + + +T +e +c +h +n +o +l +o +g +y + + + + + + +A +n +i +m +a +l + +C +a +r +e + + +& + +C +o +n +t +r +o +l + + + + + + +R +e +a +l + +E +s +t +a +t +e + + + + + + +C +i +v +i +l + +S +e +r +v +i +c +e + +C +o +m +m +i +s +s +i +o +n + + + + + + +C +h +i +l +d +r +e +n +, + +Y +o +u +t +h + + +& + +T +h +e +i +r + +F +a +m +i +l +i +e +s + + + + + + +G +S +A +C +i +t +y + +A +d +m +i +n +i +s +t +r +a +t +o +r + + + + + + +A +p +p +e +a +l +s + +B +o +a +r +d + + + + + + +A +- + + +B +u +i +l +d +i +n +g + +I +n +s +p +e +c +t +i +o +n + +C +o +m +m +i +s +s +i +o +n + + + + + + +U + + +C +h +i +l +d + +S +u +p +p +o +r +t + +S +e +r +v +i +c +e +s + + + + + + +S +] + + +E +l +e +c +t +i +o +n +s + +C +o +m +m +i +s +s +i +o +n + + + + + + +S + + +E +n +t +e +r +t +a +i +n +m +e +n +t + +C +o +m +m +i +s +s +i +o +n + + + + + + +E +t +h +i +c +s + +C +o +m +m +i +s +s +i +o +n + + + + + + +S + + +P +l +a +n +n +i +n +g + + +C +o +m +m +i +s +s +i +o +n + + + + + + +P +o +l +i +c +e + +C +o +m +m +i +s +s +i +o +n + + + + + + +S + + +H +e +a +l +t +h + +S +e +r +v +i +c +e + +B +o +a +r +d + + + + + + +s + +| + + +C +h +i +l +d +r +e +n + +& + +F +a +m +i +l +i +e +s + +C +o +m +m +i +s +s +i +o +n + + + + + + +S +h +e +r +i +f +f + +A +c +c +o +u +n +t +a +b +i +l +i +t +y + + + + + + +A + += + +A +p +p +o +i +n +t +e +d + + + + + + +E + += + +E +l +e +c +t +e +d + + + + + + + + +A +d +u +l +t + +P +r +o +b +a +t +i +o +n + + + + + + +S +u +p +e +r +i +o +r + +C +o +u +r +t + + + + + + +E + + +T +r +e +a +s +u +r +e +r +/ + + +T +a +x + +C +o +l +l +e +c +t +o +r + + + + + + + + +A +s +i +a +n + +A +r +t + +M +u +s +e +u +m + + + + + + +E +a +r +l +y + +C +h +i +l +d +h +o +o +d + + + + + + +A +r +t +s + +C +o +m +m +i +s +s +i +o +n + + + + + + +E +n +v +i +r +o +n +m +e +n +t + +C +o +m +m +i +s +s +i +o +n + + + + + + +E +m +e +r +g +e +n +c +y + +C +o +m +m +u +n +i +c +a +t +i +o +n +s + + + + + + +E +c +o +n +o +m +i +c +s + +W +o +r +k +f +o +r +c +e + +D +e +v +e +l +o +p +m +e +n +t + + + + + + +F +i +n +e + +A +r +t +s + +M +u +s +e +u +m +s + + + + + + +H +u +m +a +n + +R +i +g +h +t +s + +C +o +m +m +i +s +s +i +o +n + + + + + + + + +H +e +a +l +t +h + +C +o +m +m +i +s +s +i +o +n + + + + + + +F +i +r +e + +C +o +m +m +i +s +s +i +o +n + + + + + + +H +o +m +e +l +e +s +s +n +e +s +s + +a +n +d + + +S +u +p +p +o +r +t +i +v +e + +H +o +u +s +i +n +g + + + + + + +H +u +m +a +n + +R +e +s +o +u +r +c +e +s + + + + + + +H +u +m +a +n + +S +e +r +v +i +c +e +s + +C +o +m +m +i +s +s +i +o +n + + + + + + +J +u +v +e +n +i +l +e + +P +r +o +b +a +t +i +o +n + +C +o +m +m +i +s +s +i +o +n + + + + + + +L +a +w + +L +i +b +r +a +r +y + +B +o +a +r +d + +o +f + +T +r +u +s +t +e +e +s + + + + + + +L +i +b +r +a +r +y + +C +o +m +m +i +s +s +i +o +n + + + + + + + + +P +u +b +l +i +c +W +o +r +k +s + + + + + + +P +o +l +i +c +e + +A +c +c +o +u +n +t +a +b +i +l +i +t +y + + + + + + +P +o +r +t + +C +o +m +m +i +s +s +i +o +n + + + + + + +R +e +c +r +e +a +t +i +o +n + +& + +P +a +r +k +s + + +C +o +m +m +i +s +s +i +o +n + + + + + + +R +e +t +i +r +e +m +e +n +t + + +S +y +s +t +e +m + +B +o +a +r +d + + + + + + +R +e +n +t + +S +t +a +b +i +l +i +z +a +t +i +o +n + +B +o +a +r +d + + + + + + +P +u +b +l +i +c + + +U +t +i +l +i +t +i +e +s + +C +o +m +m +i +s +s +i +o +n + + + + + + +C +o +m +m +i +s +s +i +o +n + +o +n + +t +h +e + +S +t +a +t +u +s + +o +f + +W +o +m +e +n + + + + + + +W +a +r + +M +e +m +o +r +i +a +l + +B +o +a +r +d + +o +f + +T +r +u +s +t +e +e +s + + + + + + +O +f +f +i +c +e + +o +f + +C +o +m +m +u +n +i +t +y + +I +n +v +e +s +t +m +e +n +t + +a +n +d + +I +n +f +r +a +s +t +r +u +c +t +u +r +e + + + + + + +S + += + +S +h +a +r +e +d + +A +p +p +o +i +n +t +m +e +n +t + +b +y + +V +a +r +i +o +u +s + +E +l +e +c +t +e +d + +O +f +f +i +c +i +a +l +s + + + + + + +M +u +n +i +c +i +p +a +l + +T +r +a +n +s +p +o +r +t +a +t +i +o +n + +A +g +e +n +c +y + + + + + + +S +A +N + +F +R +A +N +C +I +S +C +O +: + +A +N + +O +V +E +R +V +I +E +W + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +3 +0 + +S +A +N + +F +R +A +N +C +I +S +C +O +: + +A +N + +O +V +E +R +V +I +E +W + + + + + + + + +P +u +b +l +i +c + +W +o +r +k +s + + + + + + +A +s +i +a +n + +A +r +t + + +M +u +s +e +u +m + + + + + + +A +r +t +s + +C +o +m +m +i +s +s +i +o +n + + + + + + +E +a +r +l +y + +C +h +i +l +d +h +o +o +d + + + + + + +E +m +e +r +g +e +n +c +y + +C +o +m +m +u +n +i +c +a +t +i +o +n +s + + + + + + +E +n +v +i +r +o +n +m +e +n +t + +C +o +m +m +i +s +s +i +o +n + + + + + + +P +o +r +t + +C +o +m +m +i +s +s +i +o +n + + + + + + +P +o +l +i +c +e + +A +c +c +o +u +n +t +a +b +i +l +i +t +y + + + + + + +R +e +c +r +e +a +t +i +o +n + +& + + +P +a +r +k +s + +C +o +m +m +i +s +s +i +o +n + + + + + + +R +e +t +i +r +e +m +e +n +t + + +S +y +s +t +e +m + +B +o +a +r +d + + + + + + +E +c +o +n +o +m +i +c +s + +W +o +r +k +f +o +r +c +e + +D +e +v +e +l +o +p +m +e +n +t + + + + + + +R +e +n +t + +S +t +a +b +i +l +i +z +a +t +i +o +n + +B +o +a +r +d + + + + + + +P +u +b +l +i +c + +U +t +i +l +i +t +i +e +s + +C +o +m +m +i +s +s +i +o +n + + + + + + +A +c +a +d +e +m +y + +o +f + +S +c +i +e +n +c +e +s + + + + + + +A +i +r +p +o +r +t + +C +o +m +m +i +s +s +i +o +n + + + + + + +A +p +p +e +a +l +s + +B +o +a +r +d + + + + + + +C +i +t +y + +A +t +t +o +r +n +e +y + + + + + + +C +o +n +t +r +o +l +l +e +r + + + + + + +P +l +a +n +n +i +n +g + +C +o +m +m +i +s +s +i +o +n + + + + + + +E +n +t +e +r +t +a +i +n +m +e +n +t + +C +o +m +m +i +s +s +i +o +n + + + + + + +E +t +h +i +c +s + +C +o +m +m +i +s +s +i +o +n + + + + + + +F +i +r +e + +C +o +m +m +i +s +s +i +o +n + + + + + + +H +u +m +a +n + +S +e +r +v +i +c +e +s + +C +o +m +m +i +s +s +i +o +n + + + + + + +J +u +v +e +n +i +l +e + +P +r +o +b +a +t +i +o +n + +C +o +m +m +i +s +s +i +o +n + + + + + + +F +i +n +e + +A +r +t +s + +M +u +s +e +u +m +s + + + + + + +C +h +i +l +d + +S +u +p +p +o +r +t + +S +e +r +v +i +c +e +s + + + + + + +C +h +i +l +d +r +e +n + +& + + +F +a +m +i +l +i +e +s + +C +o +m +m +i +s +s +i +o +n + + + + + + +P +u +r +c +h +a +s +e +r +/ +C +o +n +t +r +a +c +t + +A +d +m +i +n +i +s +t +r +a +t +i +o +n + + + + + + +E +l +e +c +t +i +o +n +s + +C +o +m +m +i +s +s +i +o +n + + + + + + +M +e +d +i +c +a +l + +E +x +a +m +i +n +e +r + + + + + + +P +u +b +l +i +c + +D +e +f +e +n +d +e +r + + + + + + +P +o +l +i +c +e + +C +o +m +m +i +s +s +i +o +n + + + + + + +B +u +i +l +d +i +n +g + + +I +n +s +p +e +c +t +i +o +n + +C +o +m +m +i +s +s +i +o +n + + + + + + +H +u +m +a +n + +R +i +g +h +t +s + +C +o +m +m +i +s +s +i +o +n + + + + + + +D +i +s +t +r +i +c +t + + +A +t +t +o +r +n +e +y + + + + + + +T +r +a +n +s +p +o +r +t +a +t +i +o +n + +A +u +t +h +o +r +i +t +y + + + + + + +A +s +s +e +s +s +o +r +/ + +R +e +c +o +r +d +e +r + + + + + + +C +i +v +i +l + +S +e +r +v +i +c +e + +C +o +m +m +i +s +s +i +o +n + + + + + + +H +e +a +l +t +h + +S +e +r +v +i +c +e + +B +o +a +r +d + + + + + + +R +e +a +l + +E +s +t +a +t +e + + + + + + +S +h +e +r +i +f +f + + + + + + +T +r +e +a +s +u +r +e +r +/ + + +T +a +x + +C +o +l +l +e +c +t +o +r + + + + + + +A +d +u +l +t + +P +r +o +b +a +t +i +o +n + + + + + + +A +p +p +e +a +l +s + +B +o +a +r +d + + + + + + +S +u +p +e +r +i +o +r + +C +o +u +r +t + + + + + + +T +e +c +h +n +o +l +o +g +y + + + + + + +C +o +n +v +e +n +t +i +o +n + +F +a +c +i +l +i +t +i +e +s + +M +a +n +a +g +e +m +e +n +t + + + + + + +C +h +i +l +d +r +e +n +, + +Y +o +u +t +h + +& + +T +h +e +i +r + +F +a +m +i +l +i +e +s + + + + + + +H +u +m +a +n + +R +e +s +o +u +r +c +e +s + + + + + + +A +n +i +m +a +l + +C +a +r +e + + +& + +C +o +n +t +r +o +l + + + + + + +Y +o +u +t +h + +C +o +m +m +i +s +s +i +o +n + + + + + + +B +o +a +r +d + +o +f + +S +u +p +e +r +v +i +s +o +r +s + + + + + + +C +o +m +m +i +s +s +i +o +n + +o +n + +t +h +e + +S +t +a +t +u +s + +o +f + +W +o +m +e +n + + + + + + +L +i +b +r +a +r +y + +C +o +m +m +i +s +s +i +o +n + + + + + + +T +r +e +a +s +u +r +e + +I +s +l +a +n +d + + +D +e +v +e +l +o +p +m +e +n +t + +A +u +t +h +o +r +i +t +y + + + + + + +L +a +w + +L +i +b +r +a +r +y + +B +o +a +r +d + +o +f + +T +r +u +s +t +e +e +s + + + + + + +W +a +r + +M +e +m +o +r +i +a +l + +B +o +a +r +d + +o +f + +T +r +u +s +t +e +e +s + + + + + + +C +o +u +n +t +y + +C +l +e +r +k + + + + + + +H +o +m +e +l +e +s +s +n +e +s +s +a +n +d + + +S +u +p +p +o +r +t +i +v +e + +H +o +u +s +i +n +g + + + + + + +H +e +a +l +t +h + +C +o +m +m +i +s +s +i +o +n + + + + + + +G +S +A +C +i +t +y + +A +d +m +i +n +i +s +t +r +a +t +o +r + + + + + + +M +u +n +i +c +i +p +a +l + +T +r +a +n +s +p +o +r +t +a +t +i +o +n + +A +g +e +n +c +y + + + + + + +O +f +f +i +c +e + +o +f + +C +o +m +m +u +n +i +t +y + +I +n +v +e +s +t +m +e +n +t + +a +n +d + +I +n +f +r +a +s +t +r +u +c +t +u +r +e + + + + + + +M +a +y +o +r + + + + + + +S +A +N + +F +R +A +N +C +I +S +C +O +: + +A +N + +O +V +E +R +V +I +E +W + + + + + + +S +h +e +r +i +f +f + +A +c +c +o +u +n +t +a +b +i +l +i +t +y + + + + + + +A + += + +A +p +p +o +i +n +t +e +d + + + + + + +E + += + +E +l +e +c +t +e +d + + + + + + +S + += + +S +h +a +r +e +d + +A +p +p +o +i +n +t +m +e +n +t + +b +y + +V +a +r +i +o +u +s + +E +l +e +c +t +e +d + +O +f +f +i +c +i +a +l +s + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +3 +0 + +S +A +N + +F +R +A +N +C +I +S +C +O +: + +A +N + +O +V +E +R +V +I +E +W + + + + + + + + +P +u +b +l +i +c + +W +o +r +k +s + + + + + + +A +s +i +a +n + +A +r +t + +M +u +s +e +u +m + + + + + + +A +r +t +s + +C +o +m +m +i +s +s +i +o +n + + + + + + +E +a +r +l +y + +C +h +i +l +d +h +o +o +d + + + + + + +E +n +v +i +r +o +n +m +e +n +t + +C +o +m +m +i +s +s +i +o +n + + + + + + +E +m +e +r +g +e +n +c +y + +C +o +m +m +u +n +i +c +a +t +i +o +n +s + + + + + + +P +o +r +t + +C +o +m +m +i +s +s +i +o +n + + + + + + +P +o +l +i +c +e + +A +c +c +o +u +n +t +a +b +i +l +i +t +y + + + + + + +R +e +c +r +e +a +t +i +o +n + +& + +P +a +r +k +s + + +C +o +m +m +i +s +s +i +o +n + + + + + + +R +e +t +i +r +e +m +e +n +t + + +S +y +s +t +e +m + +B +o +a +r +d + + + + + + +M +u +n +i +c +i +p +a +l + +T +r +a +n +s +p +o +r +t +a +t +i +o +n + +A +g +e +n +c +y + + + + + + +E +c +o +n +o +m +i +c +s + +W +o +r +k +f +o +r +c +e + +D +e +v +e +l +o +p +m +e +n +t + + + + + + +R +e +n +t + +S +t +a +b +i +l +i +z +a +t +i +o +n + +B +o +a +r +d + + + + + + +P +u +b +l +i +c + +U +t +i +l +i +t +i +e +s + +C +o +m +m +i +s +s +i +o +n + + + + + + +A +c +a +d +e +m +y + +o +f + +S +c +i +e +n +c +e +s + + + + + + +A +i +r +p +o +r +t + +C +o +m +m +i +s +s +i +o +n + + + + + + +T +r +e +a +s +u +r +e + +I +s +l +a +n +d + + +D +e +v +e +l +o +p +m +e +n +t + +A +u +t +h +o +r +i +t +y + + + + + + +T +r +a +n +s +p +o +r +t +a +t +i +o +n + +A +u +t +h +o +r +i +t +y + + + + + + +E +n +t +e +r +t +a +i +n +m +e +n +t + +C +o +m +m +i +s +s +i +o +n + + + + + + +A +p +p +e +a +l +s + +B +o +a +r +d + + + + + + +P +l +a +n +n +i +n +g + +C +o +m +m +i +s +s +i +o +n + + + + + + +E +t +h +i +c +s + + +C +o +m +m +i +s +s +i +o +n + + + + + + +M +e +d +i +c +a +l + +E +x +a +m +i +n +e +r + + + + + + +S +h +e +r +i +f +f + + + + + + +A +s +s +e +s +s +o +r +/ + +R +e +c +o +r +d +e +r + + + + + + +C +o +n +t +r +o +l +l +e +r + + + + + + +C +o +u +n +t +y + +C +l +e +r +k + + + + + + +T +e +c +h +n +o +l +o +g +y + + + + + + +D +i +s +t +r +i +c +t + + +A +t +t +o +r +n +e +y + + + + + + +J +u +v +e +n +i +l +e + +P +r +o +b +a +t +i +o +n + +C +o +m +m +i +s +s +i +o +n + + + + + + +P +o +l +i +c +e + +C +o +m +m +i +s +s +i +o +n + + + + + + +R +e +a +l + +E +s +t +a +t +e + + + + + + +C +i +t +y + +A +t +t +o +r +n +e +y + + + + + + +E +l +e +c +t +i +o +n +s + +C +o +m +m +i +s +s +i +o +n + + + + + + +B +o +a +r +d + +o +f + + +S +u +p +e +r +v +i +s +o +r +s + + + + + + +H +u +m +a +n + +R +i +g +h +t +s + +C +o +m +m +i +s +s +i +o +n + + + + + + +C +h +i +l +d +r +e +n + +& + + +F +a +m +i +l +i +e +s + +C +o +m +m +i +s +s +i +o +n + + + + + + +H +e +a +l +t +h + +C +o +m +m +i +s +s +i +o +n + + + + + + +P +u +b +l +i +c + +D +e +f +e +n +d +e +r + + + + + + +B +u +i +l +d +i +n +g + + +I +n +s +p +e +c +t +i +o +n + +C +o +m +m +i +s +s +i +o +n + + + + + + +Y +o +u +t +h + +C +o +m +m +i +s +s +i +o +n + + + + + + +H +u +m +a +n + +S +e +r +v +i +c +e +s + +C +o +m +m +i +s +s +i +o +n + + + + + + +F +i +r +e + +C +o +m +m +i +s +s +i +o +n + + + + + + +C +i +v +i +l + +S +e +r +v +i +c +e + +C +o +m +m +i +s +s +i +o +n + + + + + + +H +e +a +l +t +h + +S +e +r +v +i +c +e + +B +o +a +r +d + + + + + + +C +h +i +l +d + +S +u +p +p +o +r +t + +S +e +r +v +i +c +e +s + + + + + + +L +i +b +r +a +r +y + +C +o +m +m +i +s +s +i +o +n + + + + + + +A +p +p +e +a +l +s + +B +o +a +r +d + + + + + + +T +r +e +a +s +u +r +e +r +/ + + +T +a +x + +C +o +l +l +e +c +t +o +r + + + + + + +H +u +m +a +n + +R +e +s +o +u +r +c +e +s + + + + + + +L +a +w + +L +i +b +r +a +r +y + +B +o +a +r +d + +o +f + +T +r +u +s +t +e +e +s + + + + + + +P +u +r +c +h +a +s +e +r +/ +C +o +n +t +r +a +c +t + +A +d +m +i +n +i +s +t +r +a +t +i +o +n + + + + + + +C +o +m +m +i +s +s +i +o +n + +o +n + +t +h +e + +S +t +a +t +u +s + +o +f + +W +o +m +e +n + + + + + + +W +a +r + +M +e +m +o +r +i +a +l + +B +o +a +r +d + +o +f + +T +r +u +s +t +e +e +s + + + + + + +F +i +n +e + +A +r +t +s + +M +u +s +e +u +m +s + + + + + + +C +o +n +v +e +n +t +i +o +n + +F +a +c +i +l +i +t +i +e +s + +M +a +n +a +g +e +m +e +n +t + + + + + + +H +o +m +e +l +e +s +s +n +e +s +s + +a +n +d + + +S +u +p +p +o +r +t +i +v +e + +H +o +u +s +i +n +g + + + + + + +A +d +u +l +t + + +P +r +o +b +a +t +i +o +n + + + + + + +A +n +i +m +a +l + +C +a +r +e + +& + +C +o +n +t +r +o +l + + + + + + +C +h +i +l +d +r +e +n +, + +Y +o +u +t +h + +& + +T +h +e +i +r + +F +a +m +i +l +i +e +s + + + + + + +S +u +p +e +r +i +o +r + +C +o +u +r +t + + + + + + +G +S +A +C +i +t +y + +A +d +m +i +n +i +s +t +r +a +t +o +r + + + + + + +O +f +f +i +c +e + +o +f + +C +o +m +m +u +n +i +t +y + +I +n +v +e +s +t +m +e +n +t + +a +n +d + +I +n +f +r +a +s +t +r +u +c +t +u +r +e + + + + + + +M +a +y +o +r + + + + + + +S +A +N + +F +R +A +N +C +I +S +C +O +: + +A +N + +O +V +E +R +V +I +E +W + + + + + + +S +h +e +r +i +f +f + +A +c +c +o +u +n +t +a +b +i +l +i +t +y + + + + + + +A + += + +A +p +p +o +i +n +t +e +d + + + + + + +E + += + +E +l +e +c +t +e +d + + + + + + +S + += + +S +h +a +r +e +d + +A +p +p +o +i +n +t +m +e +n +t + +b +y + +V +a +r +i +o +u +s + +E +l +e +c +t +e +d + +O +f +f +i +c +i +a +l +s + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +3 +0 + +S +A +N + +F +R +A +N +C +I +S +C +O +: + +A +N + +O +V +E +R +V +I +E +W + + + + + + + + +P +u +b +l +i +c + +W +o +r +k +s + + + + + + +E +a +r +l +y + +C +h +i +l +d +h +o +o +d + + + + + + +A +s +i +a +n + +A +r +t + +M +u +s +e +u +m + + + + + + +A +r +t +s + +C +o +m +m +i +s +s +i +o +n + + + + + + +E +m +e +r +g +e +n +c +y + +C +o +m +m +u +n +i +c +a +t +i +o +n +s + + + + + + +E +n +v +i +r +o +n +m +e +n +t + +C +o +m +m +i +s +s +i +o +n + + + + + + +P +o +r +t + +C +o +m +m +i +s +s +i +o +n + + + + + + +R +e +c +r +e +a +t +i +o +n + +& + +P +a +r +k +s + +C +o +m +m +i +s +s +i +o +n + + + + + + +P +o +l +i +c +e + +A +c +c +o +u +n +t +a +b +i +l +i +t +y + + + + + + +R +e +t +i +r +e +m +e +n +t + + +S +y +s +t +e +m + +B +o +a +r +d + + + + + + +E +c +o +n +o +m +i +c +s + +W +o +r +k +f +o +r +c +e + +D +e +v +e +l +o +p +m +e +n +t + + + + + + +R +e +n +t + +S +t +a +b +i +l +i +z +a +t +i +o +n + + +B +o +a +r +d + + + + + + +P +u +b +l +i +c + +U +t +i +l +i +t +i +e +s + +C +o +m +m +i +s +s +i +o +n + + + + + + +A +c +a +d +e +m +y + +o +f + + +S +c +i +e +n +c +e +s + + + + + + +A +i +r +p +o +r +t + +C +o +m +m +i +s +s +i +o +n + + + + + + +S +u +p +e +r +i +o +r + +C +o +u +r +t + + + + + + +B +u +i +l +d +i +n +g + +I +n +s +p +e +c +t +i +o +n + +C +o +m +m +i +s +s +i +o +n + + + + + + +H +e +a +l +t +h + +C +o +m +m +i +s +s +i +o +n + + + + + + +T +r +e +a +s +u +r +e + +I +s +l +a +n +d + + +D +e +v +e +l +o +p +m +e +n +t + +A +u +t +h +o +r +i +t +y + + + + + + +P +u +b +l +i +c + +D +e +f +e +n +d +e +r + + + + + + +C +h +i +l +d + +S +u +p +p +o +r +t + +S +e +r +v +i +c +e +s + + + + + + +A +p +p +e +a +l +s + +B +o +a +r +d + + + + + + +S +h +e +r +i +f +f + + + + + + +C +o +n +v +e +n +t +i +o +n + +F +a +c +i +l +i +t +i +e +s + +M +a +n +a +g +e +m +e +n +t + + + + + + +T +r +e +a +s +u +r +e +r +/ + + +T +a +x + +C +o +l +l +e +c +t +o +r + + + + + + +P +l +a +n +n +i +n +g + +C +o +m +m +i +s +s +i +o +n + + + + + + +C +h +i +l +d +r +e +n + +& + + +F +a +m +i +l +i +e +s + +C +o +m +m +i +s +s +i +o +n + + + + + + +E +n +t +e +r +t +a +i +n +m +e +n +t + +C +o +m +m +i +s +s +i +o +n + + + + + + +P +o +l +i +c +e + +C +o +m +m +i +s +s +i +o +n + + + + + + +R +e +a +l + +E +s +t +a +t +e + + + + + + +H +e +a +l +t +h + +S +e +r +v +i +c +e + +B +o +a +r +d + + + + + + +E +t +h +i +c +s + + +C +o +m +m +i +s +s +i +o +n + + + + + + +A +s +s +e +s +s +o +r +/ + +R +e +c +o +r +d +e +r + + + + + + +Y +o +u +t +h + +C +o +m +m +i +s +s +i +o +n + + + + + + +C +i +t +y + +A +t +t +o +r +n +e +y + + + + + + +D +i +s +t +r +i +c +t + +A +t +t +o +r +n +e +y + + + + + + +T +r +a +n +s +p +o +r +t +a +t +i +o +n + +A +u +t +h +o +r +i +t +y + + + + + + +E +l +e +c +t +i +o +n +s + +C +o +m +m +i +s +s +i +o +n + + + + + + +A +p +p +e +a +l +s + +B +o +a +r +d + + + + + + +C +o +n +t +r +o +l +l +e +r + + + + + + +B +o +a +r +d + +o +f + + +S +u +p +e +r +v +i +s +o +r +s + + + + + + +H +u +m +a +n + +R +e +s +o +u +r +c +e +s + + + + + + +C +o +m +m +i +s +s +i +o +n + +o +n + +t +h +e + +S +t +a +t +u +s + +o +f +W +o +m +e +n + + + + + + +F +i +n +e + +A +r +t +s + +M +u +s +e +u +m +s + + + + + + +A +n +i +m +a +l + +C +a +r +e + +& + +C +o +n +t +r +o +l + + + + + + +J +u +v +e +n +i +l +e + +P +r +o +b +a +t +i +o +n + +C +o +m +m +i +s +s +i +o +n + + + + + + +C +h +i +l +d +r +e +n +, + +Y +o +u +t +h + +& + +T +h +e +i +r + +F +a +m +i +l +i +e +s + + + + + + +F +i +r +e + +C +o +m +m +i +s +s +i +o +n + + + + + + +P +u +r +c +h +a +s +e +r +/ +C +o +n +t +r +a +c +t + +A +d +m +i +n +i +s +t +r +a +t +i +o +n + + + + + + +L +a +w + +L +i +b +r +a +r +y + +B +o +a +r +d + +o +f + +T +r +u +s +t +e +e +s + + + + + + +H +u +m +a +n + +S +e +r +v +i +c +e +s + +C +o +m +m +i +s +s +i +o +n + + + + + + +W +a +r + +M +e +m +o +r +i +a +l + +B +o +a +r +d + +o +f + +T +r +u +s +t +e +e +s + + + + + + +L +i +b +r +a +r +y + +C +o +m +m +i +s +s +i +o +n + + + + + + +H +o +m +e +l +e +s +s +n +e +s +s + +a +n +d + + +S +u +p +p +o +r +t +i +v +e + +H +o +u +s +i +n +g + + + + + + +T +e +c +h +n +o +l +o +g +y + + + + + + +A +d +u +l +t + +P +r +o +b +a +t +i +o +n + + + + + + +C +i +v +i +l + +S +e +r +v +i +c +e + + +C +o +m +m +i +s +s +i +o +n + + + + + + +C +o +u +n +t +y + +C +l +e +r +k + + + + + + +H +u +m +a +n + +R +i +g +h +t +s + +C +o +m +m +i +s +s +i +o +n + + + + + + +M +e +d +i +c +a +l + +E +x +a +m +i +n +e +r + + + + + + +G +S +A +C +i +t +y + +A +d +m +i +n +i +s +t +r +a +t +o +r + + + + + + +M +u +n +i +c +i +p +a +l + +T +r +a +n +s +p +o +r +t +a +t +i +o +n + +A +g +e +n +c +y + + + + + + +O +f +f +i +c +e + +o +f + +C +o +m +m +u +n +i +t +y + +I +n +v +e +s +t +m +e +n +t + +a +n +d + +I +n +f +r +a +s +t +r +u +c +t +u +r +e + + + + + + +M +a +y +o +r + + + + + + +S +A +N + +F +R +A +N +C +I +S +C +O +: + +A +N + +O +V +E +R +V +I +E +W + + + + + + +S +h +e +r +i +f +f + +A +c +c +o +u +n +t +a +b +i +l +i +t +y + + + + + + +A + += + +A +p +p +o +i +n +t +e +d + + + + + + +E + += + +E +l +e +c +t +e +d + + + + + + +S + += + +S +h +a +r +e +d + +A +p +p +o +i +n +t +m +e +n +t + +b +y + +V +a +r +i +o +u +s + +E +l +e +c +t +e +d + +O +f +f +i +c +i +a +l +s + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +S +A +N + +F +R +A +N +C +I +S +C +O +: + +A +N + +O +V +E +R +V +I +E +W + + + + + + + + +P +u +b +l +i +c +W +o +r +k +s + + + + + + +A +r +t +s + +C +o +m +m +i +s +s +i +o +n + + + + + + +E +a +r +l +y + +C +h +i +l +d +h +o +o +d + + + + + + +A +s +i +a +n + +A +r +t + + +M +u +s +e +u +m + + + + + + +E +n +v +i +r +o +n +m +e +n +t + +C +o +m +m +i +s +s +i +o +n + + + + + + +E +m +e +r +g +e +n +c +y + +C +o +m +m +u +n +i +c +a +t +i +o +n +s + + + + + + +P +o +r +t + +C +o +m +m +i +s +s +i +o +n + + + + + + +R +e +c +r +e +a +t +i +o +n + +& + +P +a +r +k +s + +C +o +m +m +i +s +s +i +o +n + + + + + + +P +o +l +i +c +e + +A +c +c +o +u +n +t +a +b +i +l +i +t +y + + + + + + +R +e +t +i +r +e +m +e +n +t + + +S +y +s +t +e +m + +B +o +a +r +d + + + + + + +E +c +o +n +o +m +i +c + +& + + +W +o +r +k +f +o +r +c +e + + +D +e +v +e +l +o +p +m +e +n +t + + + + + + +R +e +n +t + +S +t +a +b +i +l +i +z +a +t +i +o +n + +B +o +a +r +d + + + + + + +P +u +b +l +i +c + + +U +t +i +l +i +t +i +e +s + +C +o +m +m +i +s +s +i +o +n + + + + + + +A +i +r +p +o +r +t + +C +o +m +m +i +s +s +i +o +n + + + + + + +A +c +a +d +e +m +y + +o +f + + +S +c +i +e +n +c +e +s + + + + + + +B +u +i +l +d +i +n +g + +I +n +s +p +e +c +t +i +o +n + +C +o +m +m +i +s +s +i +o +n + + + + + + +T +r +a +n +s +p +o +r +t +a +t +i +o +n + +A +u +t +h +o +r +i +t +y + + + + + + +C +h +i +l +d + +S +u +p +p +o +r +t + +S +e +r +v +i +c +e +s + + + + + + +A +p +p +e +a +l +s + +B +o +a +r +d + + + + + + +H +u +m +a +n + +R +i +g +h +t +s + +C +o +m +m +i +s +s +i +o +n + + + + + + +F +i +n +e + +A +r +t +s + +M +u +s +e +u +m +s + + + + + + +A +s +s +e +s +s +o +r +/ + +R +e +c +o +r +d +e +r + + + + + + +C +h +i +l +d +r +e +n +, + +Y +o +u +t +h + +& + +T +h +e +i +r + +F +a +m +i +l +i +e +s + + + + + + +C +o +n +t +r +o +l +l +e +r + + + + + + +S +h +e +r +i +f +f + + + + + + +P +u +r +c +h +a +s +e +r +/ +C +o +n +t +r +a +c +t + +A +d +m +i +n +i +s +t +r +a +t +i +o +n + + + + + + +T +r +e +a +s +u +r +e + +I +s +l +a +n +d + +D +e +v +e +l +o +p +m +e +n +t + +A +u +t +h +o +r +i +t +y + + + + + + +E +l +e +c +t +i +o +n +s + +C +o +m +m +i +s +s +i +o +n + + + + + + +H +u +m +a +n + +S +e +r +v +i +c +e +s + +C +o +m +m +i +s +s +i +o +n + + + + + + +E +n +t +e +r +t +a +i +n +m +e +n +t + +C +o +m +m +i +s +s +i +o +n + + + + + + +A +p +p +e +a +l +s + +B +o +a +r +d + + + + + + +R +e +a +l + +E +s +t +a +t +e + + + + + + +C +o +n +v +e +n +t +i +o +n + +F +a +c +i +l +i +t +i +e +s + +M +a +n +a +g +e +m +e +n +t + + + + + + +P +u +b +l +i +c + +D +e +f +e +n +d +e +r + + + + + + +Y +o +u +t +h + +C +o +m +m +i +s +s +i +o +n + + + + + + +A +n +i +m +a +l + +C +a +r +e + +& + +C +o +n +t +r +o +l + + + + + + +C +i +t +y + +A +t +t +o +r +n +e +y + + + + + + +C +o +u +n +t +y + +C +l +e +r +k + + + + + + +B +o +a +r +d + +o +f + +S +u +p +e +r +v +i +s +o +r +s + + + + + + +H +u +m +a +n + +R +e +s +o +u +r +c +e +s + + + + + + +T +r +e +a +s +u +r +e +r +/ + + +T +a +x + +C +o +l +l +e +c +t +o +r + + + + + + +C +o +m +m +i +s +s +i +o +n + +o +n + +t +h +e + +S +t +a +t +u +s + +o +f + +W +o +m +e +n + + + + + + +G +S +A +C +i +t +y + +A +d +m +i +n +i +s +t +r +a +t +o +r + + + + + + +L +i +b +r +a +r +y + +C +o +m +m +i +s +s +i +o +n + + + + + + +J +u +v +e +n +i +l +e + + +P +r +o +b +a +t +i +o +n + + +C +o +m +m +i +s +s +i +o +n + + + + + + +T +e +c +h +n +o +l +o +g +y + + + + + + +H +e +a +l +t +h + +C +o +m +m +i +s +s +i +o +n + + + + + + +M +e +d +i +c +a +l + + +E +x +a +m +i +n +e +r + + + + + + +L +a +w + +L +i +b +r +a +r +y + +B +o +a +r +d + +o +f + +T +r +u +s +t +e +e +s + + + + + + +H +o +m +e +l +e +s +s +n +e +s +s + +a +n +d + + +S +u +p +p +o +r +t +i +v +e + +H +o +u +s +i +n +g + + + + + + +F +i +r +e + +C +o +m +m +i +s +s +i +o +n + + + + + + +C +i +v +i +l + +S +e +r +v +i +c +e + +C +o +m +m +i +s +s +i +o +n + + + + + + +W +a +r + +M +e +m +o +r +i +a +l + +B +o +a +r +d + +o +f + +T +r +u +s +t +e +e +s + + + + + + +D +i +s +t +r +i +c +t + + +A +t +t +o +r +n +e +y + + + + + + +S +u +p +e +r +i +o +r + +C +o +u +r +t + + + + + + +A +d +u +l +t + + +P +r +o +b +a +t +i +o +n + + + + + + +M +a +y +o +r + + + + + + +> + + +2 + + + + + + +F +R +A +N +C +I +S +C +O +: + +A +N + +O +V +E +R +V +I +E +W + + + + + + +E +t +h +i +c +s + +C +o +m +m +i +s +s +i +o +n + + + + + + +S + + +P +l +a +n +n +i +n +g + +C +o +m +m +i +s +s +i +o +n + + + + + + +S +] + + +P +o +l +i +c +e + +C +o +m +m +i +s +s +i +o +n + + + + + + +3 + + +H +e +a +l +t +h + +S +e +r +v +i +c +e + +B +o +a +r +d + + + + + + +3 + + +C +h +i +l +d +r +e +n + +& + +F +a +m +i +l +i +e +s + +C +o +m +m +i +s +s +i +o +n + + + + + + +O +f +f +i +c +e + +o +f + +C +o +m +m +u +n +i +t +y + +I +n +v +e +s +t +m +e +n +t + +a +n +d + +I +n +f +r +a +s +t +r +u +c +t +u +r +e + + + + + + +M +u +n +i +c +i +p +a +l + +T +r +a +n +s +p +o +r +t +a +t +i +o +n + +A +g +e +n +c +y + + + + + + +S +h +e +r +i +f +f + +A +c +c +o +u +n +t +a +b +i +l +i +t +y + + + + + + +A + += + +A +p +p +o +i +n +t +e +d + + + + + + +E + += + +E +l +e +c +t +e +d + + + + + + +S + += + +S +h +a +r +e +d + +A +p +p +o +i +n +t +m +e +n +t + +b +y + +V +a +r +i +o +u +s + +E +l +e +c +t +e +d + +O +f +f +i +c +i +a +l +s + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +S +A +N + +F +R +A +N +C +I +S +C +O +: + +A +N + +O +V +E +R +V +I +E +W + + + + + + + + + + + + +M +a +y +o +r + + + + + + +A +s +s +e +s +s +o +r +/ + +R +e +c +o +r +d +e +r + + + + + + +B +o +a +r +d + +o +f + +S +u +p +e +r +v +i +s +o +r +s + + + + + + + + +C +i +t +y + +A +t +t +o +r +n +e +y + + + + + + + + +D +i +s +t +r +i +c +t + + +A +t +t +o +r +n +e +y + + + + + + + + +P +u +b +l +i +c + +D +e +f +e +n +d +e +r + + + + + + + + +S +h +e +r +i +f +f + + + + + + + + +S +u +p +e +r +i +o +r + +C +o +u +r +t + + + + + + + + +T +r +e +a +s +u +r +e +r +/ + + +T +a +x + +C +o +l +l +e +c +t +o +r + + + + + + +A +p +p +e +a +l +s + +B +o +a +r +d + + + + + + +Y +o +u +t +h + +C +o +m +m +i +s +s +i +o +n + + + + + + + + +T +r +a +n +s +p +o +r +t +a +t +i +o +n + +A +u +t +h +o +r +i +t +y + + + + + + + + +C +o +n +t +r +o +l +l +e +r + + + + + + +A +d +u +l +t + +P +r +o +b +a +t +i +o +n + + + + + + + + +A +c +a +d +e +m +y + +o +f + +S +c +i +e +n +c +e +s + + + + + + +A +i +r +p +o +r +t + +C +o +m +m +i +s +s +i +o +n + + + + + + +A +r +t +s + +C +o +m +m +i +s +s +i +o +n + + + + + + +A +s +i +a +n + +A +r +t + +M +u +s +e +u +m + + + + + + +E +a +r +l +y + +C +h +i +l +d +h +o +o +d + + + + + + +E +c +o +n +o +m +i +c +s + +W +o +r +k +f +o +r +c +e + +D +e +v +e +l +o +p +m +e +n +t + + + + + + +E +m +e +r +g +e +n +c +y + +C +o +m +m +u +n +i +c +a +t +i +o +n +s + + + + + + +E +n +v +i +r +o +n +m +e +n +t + +C +o +m +m +i +s +s +i +o +n + + + + + + +A +n +i +m +a +l + +C +a +r +e + + +& + +C +o +n +t +r +o +l + + + + + + +P +u +r +c +h +a +s +e +r +/ +C +o +n +t +r +a +c +t + +A +d +m +i +n +i +s +t +r +a +t +i +o +n + + + + + + +A +p +p +e +a +l +s + +B +o +a +r +d + + + + + + +E +t +h +i +c +s + +C +o +m +m +i +s +s +i +o +n + + + + + + + + +G +S +A +C +i +t +y + +A +d +m +i +n +i +s +t +r +a +t +o +r + + + + + + +A + + + + + + +C +h +i +l +d +r +e +n +, + +Y +o +u +t +h + +& + +T +h +e +i +r + +F +a +m +i +l +i +e +s + + + + + + +C +i +v +i +l + +S +e +r +v +i +c +e + +C +o +m +m +i +s +s +i +o +n + + + + + + +F +i +n +e + +A +r +t +s + +M +u +s +e +u +m +s + + + + + + +F +i +r +e + +C +o +m +m +i +s +s +i +o +n + + + + + + +C +o +n +v +e +n +t +i +o +n + +F +a +c +i +l +i +t +i +e +s + +M +a +n +a +g +e +m +e +n +t + + + + + + +R +e +a +l + +E +s +t +a +t +e + + + + + + +C +o +u +n +t +y + +C +l +e +r +k + + + + + + +M +e +d +i +c +a +l + +E +x +a +m +i +n +e +r + + + + + + +T +e +c +h +n +o +l +o +g +y + + + + + + +T +r +e +a +s +u +r +e + +I +s +l +a +n +d + + +D +e +v +e +l +o +p +m +e +n +t + +A +u +t +h +o +r +i +t +y + + + + + + + + +H +e +a +l +t +h + + +C +o +m +m +i +s +s +i +o +n + + + + + + +H +o +m +e +l +e +s +s +n +e +s +s + +a +n +d + +S +u +p +p +o +r +t +i +v +e + +H +o +u +s +i +n +g + + + + + + +H +u +m +a +n + +R +e +s +o +u +r +c +e +s + + + + + + + + +H +u +m +a +n + +R +i +g +h +t +s + +C +o +m +m +i +s +s +i +o +n + + + + + + +P +o +l +i +c +e + +A +c +c +o +u +n +t +a +b +i +l +i +t +y + + + + + + +P +o +r +t + +C +o +m +m +i +s +s +i +o +n + + + + + + +H +u +m +a +n + +S +e +r +v +i +c +e +s + +C +o +m +m +i +s +s +i +o +n + + + + + + +J +u +v +e +n +i +l +e + +P +r +o +b +a +t +i +o +n + +C +o +m +m +i +s +s +i +o +n + + + + + + +L +a +w + +L +i +b +r +a +r +y + +B +o +a +r +d + +o +f + +T +r +u +s +t +e +e +s + + + + + + +L +i +b +r +a +r +y + +C +o +m +m +i +s +s +i +o +n + + + + + + + + +P +u +b +l +i +c + + +U +t +i +l +i +t +i +e +s + +C +o +m +m +i +s +s +i +o +n + + + + + + +P +u +b +l +i +c + +W +o +r +k +s + + + + + + +R +e +c +r +e +a +t +i +o +n + +& + +P +a +r +k +s + + +C +o +m +m +i +s +s +i +o +n + + + + + + +R +e +n +t + +S +t +a +b +i +l +i +z +a +t +i +o +n + +B +o +a +r +d + + + + + + +R +e +t +i +r +e +m +e +n +t + +S +y +s +t +e +m + +B +o +a +r +d + + + + + + + + +C +h +i +l +d + +S +u +p +p +o +r +t + +S +e +r +v +i +c +e +s + + + + + + +H +e +a +l +t +h + +S +e +r +v +i +c +e + +B +o +a +r +d + + + + + + +E +n +t +e +r +t +a +i +n +m +e +n +t + +C +o +m +m +i +s +s +i +o +n + + + + + + +C +o +m +m +i +s +s +i +o +n + +o +n + +t +h +e + +S +t +a +t +u +s + +o +f + +W +o +m +e +n + + + + + + +E +l +e +c +t +i +o +n +s + +C +o +m +m +i +s +s +i +o +n + + + + + + +O +f +f +i +c +e + +o +f + +C +o +m +m +u +n +i +t +y + +I +n +v +e +s +t +m +e +n +t + +a +n +d + +I +n +f +r +a +s +t +r +u +c +t +u +r +e + + + + + + +P +l +a +n +n +i +n +g + +C +o +m +m +i +s +s +i +o +n + + + + + + +W +a +r + +M +e +m +o +r +i +a +l + +B +o +a +r +d + +o +f + +T +r +u +s +t +e +e +s + + + + + + +B +u +i +l +d +i +n +g + +I +n +s +p +e +c +t +i +o +n + +C +o +m +m +i +s +s +i +o +n + + + + + + +C +h +i +l +d +r +e +n + +& + + +F +a +m +i +l +i +e +s + +C +o +m +m +i +s +s +i +o +n + + + + + + +A + + + + + + + + + + +P +o +l +i +c +e + +C +o +m +m +i +s +s +i +o +n + + + + + + + + +M +u +n +i +c +i +p +a +l + +T +r +a +n +s +p +o +r +t +a +t +i +o +n + +A +g +e +n +c +y + + + + + + +S +h +e +r +i +f +f + +A +c +c +o +u +n +t +a +b +i +l +i +t +y + + + + + + +A + += + +A +p +p +o +i +n +t +e +d + + + + + + +E + += + +E +l +e +c +t +e +d + +S + += + +S +h +a +r +e +d + +A +p +p +o +i +n +t +m +e +n +t + +b +y + +V +a +r +i +o +u +s + +E +l +e +c +t +e +d + +O +f +f +i +c +i +a +l +s + + + + + + +F +R +A +N +C +I +S +C +O +: + +A +N + +O +V +E +R +V +I +E +W + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/module/importAbbyy.spec.js b/tests/module/importAbbyy.spec.js index 60aabdf..e0fe5b3 100644 --- a/tests/module/importAbbyy.spec.js +++ b/tests/module/importAbbyy.spec.js @@ -31,3 +31,61 @@ describe('Check Abbyy XML import function.', function () { await scribe.terminate(); }); }).timeout(120000); + +describe('Check that text orientation is handled correctly in Abbyy imports.', function () { + this.timeout(10000); + + it('Lines printed at exactly 90/180/270 degrees have orientation detected correctly', async () => { + await scribe.importFiles([`${ASSETS_PATH_KARMA}/CSF_Proposed_Budget_Book_June_2024_r8_30_all_orientations_abbyy.xml`]); + assert.strictEqual(scribe.data.ocr.active[0].lines[2].words[0].line.orientation, 3); + assert.strictEqual(scribe.data.ocr.active[3].lines[2].words[0].line.orientation, 2); + assert.strictEqual(scribe.data.ocr.active[2].lines[2].words[0].line.orientation, 1); + }).timeout(10000); + + // The following tests compare the coordinates of a rotated line to the same line in a non-rotated version of the same document. + it('Lines oriented at 90 degrees counterclockwise have coordinates calculated correctly', async () => { + assert.approximately(scribe.data.ocr.active[0].lines[2].words[0].bbox.left, scribe.data.ocr.active[1].lines[2].words[0].bbox.left, 1); + assert.approximately(scribe.data.ocr.active[0].lines[2].words[0].bbox.right, scribe.data.ocr.active[1].lines[2].words[0].bbox.right, 1); + assert.approximately(scribe.data.ocr.active[0].lines[2].words[0].bbox.top, scribe.data.ocr.active[1].lines[2].words[0].bbox.top, 1); + assert.approximately(scribe.data.ocr.active[0].lines[2].words[0].bbox.bottom, scribe.data.ocr.active[1].lines[2].words[0].bbox.bottom, 1); + }).timeout(10000); + + it('Lines oriented at 90 degrees clockwise have coordinates calculated correctly', async () => { + assert.approximately(scribe.data.ocr.active[2].lines[2].words[0].bbox.left, scribe.data.ocr.active[1].lines[2].words[0].bbox.left, 1); + // This requires a larger tolerance, however the issue appears to be with the input rather than the parsing. + assert.approximately(scribe.data.ocr.active[2].lines[2].words[0].bbox.right, scribe.data.ocr.active[1].lines[2].words[0].bbox.right, 2); + assert.approximately(scribe.data.ocr.active[2].lines[2].words[0].bbox.top, scribe.data.ocr.active[1].lines[2].words[0].bbox.top, 1); + assert.approximately(scribe.data.ocr.active[2].lines[2].words[0].bbox.bottom, scribe.data.ocr.active[1].lines[2].words[0].bbox.bottom, 1); + }).timeout(10000); + + it('Lines oriented at 180 degrees have coordinates calculated correctly', async () => { + assert.approximately(scribe.data.ocr.active[3].lines[2].words[0].bbox.left, scribe.data.ocr.active[1].lines[2].words[0].bbox.left, 1); + assert.approximately(scribe.data.ocr.active[3].lines[2].words[0].bbox.right, scribe.data.ocr.active[1].lines[2].words[0].bbox.right, 1); + assert.approximately(scribe.data.ocr.active[3].lines[2].words[0].bbox.top, scribe.data.ocr.active[1].lines[2].words[0].bbox.top, 1); + assert.approximately(scribe.data.ocr.active[3].lines[2].words[0].bbox.bottom, scribe.data.ocr.active[1].lines[2].words[0].bbox.bottom, 1); + }).timeout(10000); + + it('Lines oriented at 90/180/270 degrees have line rotation detected correctly', async () => { + assert.approximately(scribe.data.ocr.active[4].lines[0].baseline[0], Math.tan(5 * (Math.PI / 180)), 0.01); + assert.approximately(scribe.data.ocr.active[6].lines[0].baseline[0], Math.tan(5 * (Math.PI / 180)), 0.01); + assert.approximately(scribe.data.ocr.active[8].lines[0].baseline[0], Math.tan(5 * (Math.PI / 180)), 0.01); + assert.approximately(scribe.data.ocr.active[10].lines[0].baseline[0], Math.tan(5 * (Math.PI / 180)), 0.01); + assert.approximately(scribe.data.ocr.active[5].lines[0].baseline[0], -Math.tan(5 * (Math.PI / 180)), 0.01); + assert.approximately(scribe.data.ocr.active[7].lines[0].baseline[0], -Math.tan(5 * (Math.PI / 180)), 0.01); + assert.approximately(scribe.data.ocr.active[9].lines[0].baseline[0], -Math.tan(5 * (Math.PI / 180)), 0.01); + assert.approximately(scribe.data.ocr.active[11].lines[0].baseline[0], -Math.tan(5 * (Math.PI / 180)), 0.01); + + assert.approximately(scribe.data.pageMetrics[4].angle, 5, 1); + assert.approximately(scribe.data.pageMetrics[6].angle, 5, 1); + assert.approximately(scribe.data.pageMetrics[8].angle, 5, 1); + assert.approximately(scribe.data.pageMetrics[10].angle, 5, 1); + assert.approximately(scribe.data.pageMetrics[5].angle, -5, 1); + assert.approximately(scribe.data.pageMetrics[7].angle, -5, 1); + assert.approximately(scribe.data.pageMetrics[9].angle, -5, 1); + assert.approximately(scribe.data.pageMetrics[11].angle, -5, 1); + }).timeout(10000); + + after(async () => { + await scribe.terminate(); + }); +}).timeout(120000);