@sailfish-ai/sf-veritas 0.2.13 → 0.2.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/contextManager-Cx03mw7l.js +258 -0
- package/dist/contextManager-CxQqBCEA.cjs +1 -0
- package/dist/funcSpanTransformer-Byqzu4B1.js +231 -0
- package/dist/funcSpanTransformer-CDh0o-AP.cjs +1 -0
- package/dist/plugins/funcspanEsbuildPlugin.cjs +1 -1
- package/dist/plugins/funcspanEsbuildPlugin.mjs +2 -2
- package/dist/plugins/funcspanRollupPlugin.cjs +1 -1
- package/dist/plugins/funcspanRollupPlugin.mjs +2 -2
- package/dist/plugins/funcspanTscPlugin.cjs +1 -1
- package/dist/plugins/funcspanTscPlugin.mjs +2 -2
- package/dist/plugins/funcspanVitePlugin.cjs +1 -1
- package/dist/plugins/funcspanVitePlugin.mjs +2 -2
- package/dist/plugins/funcspanWebpackLoader.cjs +1 -1
- package/dist/plugins/funcspanWebpackLoader.mjs +1 -1
- package/dist/plugins/funcspanWebpackPlugin.cjs +1 -1
- package/dist/plugins/funcspanWebpackPlugin.mjs +1 -1
- package/dist/{runtimeConfig-CgLfwL3X.js → runtimeConfig-DndXTWki.js} +130 -127
- package/dist/{runtimeConfig-DIsq-KCn.cjs → runtimeConfig-TWzqPe1S.cjs} +7 -7
- package/dist/sf-veritas.cjs +37 -12
- package/dist/sf-veritas.mjs +546 -489
- package/dist/types/networkRequestTransmitter.d.ts +4 -0
- package/dist/types/setupConfig.d.ts +35 -0
- package/dist/worker-pool-capture.cjs +1 -1
- package/dist/worker-pool-capture.mjs +1 -1
- package/dist/{workerPoolSpanCapture-BYaf3NOr.js → workerPoolSpanCapture-DWS_V0Mn.js} +1 -1
- package/dist/{workerPoolSpanCapture-D85i6nhQ.cjs → workerPoolSpanCapture-Danyb3Qa.cjs} +1 -1
- package/package.json +2 -1
- package/dist/contextManager-BkETRITg.cjs +0 -1
- package/dist/contextManager-CEPhVu9T.js +0 -197
- package/dist/funcSpanTransformer-B9WWl-g1.cjs +0 -1
- package/dist/funcSpanTransformer-CWNEWRxq.js +0 -225
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { readFileSync as m, writeFileSync as l } from "fs";
|
|
2
2
|
import { sync as g } from "glob";
|
|
3
3
|
import { resolve as C } from "path";
|
|
4
|
-
import { t as _ } from "../funcSpanTransformer-
|
|
5
|
-
import { s as N } from "../runtimeConfig-
|
|
4
|
+
import { t as _ } from "../funcSpanTransformer-Byqzu4B1.js";
|
|
5
|
+
import { s as N } from "../runtimeConfig-DndXTWki.js";
|
|
6
6
|
async function D(n = {}) {
|
|
7
7
|
try {
|
|
8
8
|
if (N()) return void console.warn("[FuncSpan TSC Plugin] Runtime mode active - build plugin DISABLED to prevent double-instrumentation");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("../funcSpanTransformer-
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("../funcSpanTransformer-CDh0o-AP.cjs"),l=require("../runtimeConfig-TWzqPe1S.cjs");exports.funcspanVitePlugin=function(s={}){try{if(l.shouldEnableRuntimeHooks())return console.warn("[FuncSpan Vite Plugin] Runtime mode active - build plugin DISABLED to prevent double-instrumentation"),{name:"sailfish-funcspan-vite-disabled"}}catch{}const{enabled:o=!0,includeNodeModules:t=[],debug:i=!1}=s;return{name:"sailfish-funcspan-vite",enforce:"pre",async transform(u,e){if(!o||!e.match(/\.(js|ts|jsx|tsx)$/)||e.startsWith("\0")||e.includes("node_modules")&&!t.some(n=>e.includes(`node_modules/${n}`))||e.includes("@sailfish-ai/sf-veritas")||e.includes("jsts-backend/dist"))return null;try{const n=await r.transformFunctionSpans(u,e,{projectRoot:process.cwd(),includeNodeModules:t,debug:i});if(n.modified)return{code:n.code,map:null}}catch(n){i&&console.error(`[FuncSpan Vite] Error transforming ${e}:`,n)}return null}}};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { t as o } from "../funcSpanTransformer-
|
|
2
|
-
import { s as l } from "../runtimeConfig-
|
|
1
|
+
import { t as o } from "../funcSpanTransformer-Byqzu4B1.js";
|
|
2
|
+
import { s as l } from "../runtimeConfig-DndXTWki.js";
|
|
3
3
|
function d(u = {}) {
|
|
4
4
|
try {
|
|
5
5
|
if (l()) return console.warn("[FuncSpan Vite Plugin] Runtime mode active - build plugin DISABLED to prevent double-instrumentation"), { name: "sailfish-funcspan-vite-disabled" };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";const I=require("../funcSpanTransformer-
|
|
1
|
+
"use strict";const I=require("../funcSpanTransformer-CDh0o-AP.cjs"),M=require("@babel/parser"),x=require("@babel/traverse"),O=require("@babel/generator"),R=require("@babel/types"),z=require("path");function L(n){const p=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(n){for(const r in n)if(r!=="default"){const l=Object.getOwnPropertyDescriptor(n,r);Object.defineProperty(p,r,l.get?l:{enumerable:!0,get:()=>n[r]})}}return p.default=n,Object.freeze(p)}const e=L(R),C=x.default||x,N=O.default||O,Z=["lookup","lookupService","resolve","resolve4","resolve6","resolveAny","resolveCname","resolveMx","resolveNs","resolvePtr","resolveSoa","resolveSrv","resolveTxt","reverse","setServers","getServers"],A=["readFile","writeFile","appendFile","readdir","stat","lstat","mkdir","rmdir","unlink","rename","copyFile","open","close","read","write","access"],B=["pbkdf2","randomBytes","randomFill","scrypt"],G=["deflate","deflateRaw","gzip","gunzip","inflate","inflateRaw","unzip","brotliCompress","brotliDecompress"];module.exports=function(n){const p=this.async(),r=this.getOptions();(async()=>{try{let l=await I.transformFunctionSpans(n,this.resourcePath,{projectRoot:r.projectRoot||process.cwd(),includeNodeModules:r.includeNodeModules||[],debug:r.debug||!1}),m=l.modified?l.code:n,v=l.map;if(r.enableWorkerPoolTracking){const k=await(async function(g,W,D={}){const{projectRoot:q=process.cwd(),trackDns:h=!1,trackFs:w=!1,trackCrypto:j=!1,trackZlib:T=!1,debug:d=!1}=D;if(!(h||w||j||T))return{code:g,modified:!1,callsWrapped:0};const b=z.relative(q,W).replace(/\\/g,"/");let u;d&&console.log(`[WorkerPool Transform] Processing: ${b}`);try{u=M.parse(g,{sourceType:"module",plugins:["typescript","jsx","decorators-legacy","classProperties","objectRestSpread","asyncGenerators","dynamicImport","optionalCatchBinding","optionalChaining","nullishCoalescingOperator"]})}catch(t){return d&&console.error(`[WorkerPool Transform] Parse error in ${b}:`,t),{code:g,modified:!1,callsWrapped:0}}let F=!1,y=0,S=!1;const P=new Map,c=new Map;if(h&&c.set("dns",Z),w&&c.set("fs",A),j&&c.set("crypto",B),T&&c.set("zlib",G),C(u,{VariableDeclarator(t){const o=t.node.init,i=t.node.id;if(o&&e.isCallExpression(o)&&e.isIdentifier(o.callee,{name:"require"})&&o.arguments.length===1&&e.isStringLiteral(o.arguments[0])){const s=o.arguments[0].value;for(const[a]of c)s!==a&&s!==`node:${a}`||e.isIdentifier(i)&&(P.set(i.name,a),d&&console.log(`[WorkerPool Transform] Found ${a} binding: ${i.name}`))}},ImportDeclaration(t){const o=t.node.source.value;for(const[i]of c)if(o===i||o===`node:${i}`){for(const s of t.node.specifiers)if(e.isImportDefaultSpecifier(s)||e.isImportNamespaceSpecifier(s)){const a=s.local.name;P.set(a,i),d&&console.log(`[WorkerPool Transform] Found ${i} import: ${a}`)}}}}),C(u,{CallExpression(t){const o=t.node.callee;if(e.isMemberExpression(o)&&e.isIdentifier(o.object)){const i=o.object.name,s=P.get(i);if(s&&c.has(s)){const a=c.get(s),f=e.isIdentifier(o.property)?o.property.name:null;if(f&&a.includes(f)){d&&console.log(`[WorkerPool Transform] Wrapping ${s}.${f}()`);const E=e.callExpression(e.identifier("captureWorkerPoolOperation"),[e.stringLiteral(s),e.stringLiteral(f),e.memberExpression(e.identifier(i),e.identifier(f)),e.arrayExpression(t.node.arguments),e.identifier(i)]);t.replaceWith(E),S=!0,y++,F=!0}}}}}),S){const t=e.variableDeclaration("const",[e.variableDeclarator(e.objectPattern([e.objectProperty(e.identifier("captureWorkerPoolOperation"),e.identifier("captureWorkerPoolOperation"),!1,!0)]),e.callExpression(e.identifier("require"),[e.stringLiteral("@sailfish-ai/sf-veritas/worker-pool-capture")]))]);u.program.body.length>0&&u.program.body.unshift(t),d&&console.log("[WorkerPool Transform] Added captureWorkerPoolOperation import")}if(!F)return{code:g,modified:!1,callsWrapped:0};const $=N(u,{sourceMaps:!0,sourceFileName:W});return d&&console.log(`[WorkerPool Transform] Wrapped ${y} calls in ${b}`),{code:$.code,map:$.map,modified:!0,callsWrapped:y}})(m,this.resourcePath,{projectRoot:r.projectRoot||process.cwd(),trackDns:r.workerPoolTrackDns||!1,trackFs:r.workerPoolTrackFs||!1,trackCrypto:r.workerPoolTrackCrypto||!1,trackZlib:r.workerPoolTrackZlib||!1,debug:r.debug||!1});k.modified&&(m=k.code,v=k.map)}m!==n?p(null,m,v):p(null,n)}catch(l){r.debug&&console.error(`[FuncSpan Webpack Loader] Error transforming ${this.resourcePath}:`,l),p(null,n)}})()};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const b=require("../runtimeConfig-
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const b=require("../runtimeConfig-TWzqPe1S.cjs"),a=require("path"),P=require("url");function m(r){const o=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(r){for(const n in r)if(n!=="default"){const t=Object.getOwnPropertyDescriptor(r,n);Object.defineProperty(o,n,t.get?t:{enumerable:!0,get:()=>r[n]})}}return o.default=r,Object.freeze(o)}const f=m(a);class u{options;constructor(o={}){this.options={enabled:!0,includeNodeModules:[],debug:!1,enableWorkerPoolTracking:!1,workerPoolTrackDns:!1,workerPoolTrackFs:!1,workerPoolTrackCrypto:!1,workerPoolTrackZlib:!1,...o}}apply(o){try{if(b.shouldEnableRuntimeHooks())return void console.warn("[FuncSpan Webpack Plugin] Runtime mode active - build plugin DISABLED to prevent double-instrumentation")}catch{}const{enabled:n,includeNodeModules:t,debug:c}=this.options;if(!n)return;const l="FuncspanWebpackPlugin";o.hooks.compilation.tap(l,s=>{s.hooks.buildModule.tap(l,i=>{i.resource&&i.resource.match(/\.(js|ts|jsx|tsx)$/)&&(!i.resource.includes("node_modules")||t?.some(e=>i.resource.includes(`node_modules/${e}`)))}),o.webpack.NormalModule.getCompilationHooks(s).loader.tap(l,(i,e)=>{if(!e.resource||!e.resource.match(/\.(js|ts|jsx|tsx)$/)||e.resource.includes("node_modules")&&!t?.some(p=>e.resource.includes(`node_modules/${p}`)))return;const d=typeof __dirname<"u"?__dirname:a.dirname(P.fileURLToPath(require("node:url").pathToFileURL(__filename).href)),k=f.join(d,"funcspanWebpackLoader.cjs");e.loaders.push({loader:k,options:{projectRoot:o.context,includeNodeModules:t,debug:c,enableWorkerPoolTracking:this.options.enableWorkerPoolTracking,workerPoolTrackDns:this.options.workerPoolTrackDns,workerPoolTrackFs:this.options.workerPoolTrackFs,workerPoolTrackCrypto:this.options.workerPoolTrackCrypto,workerPoolTrackZlib:this.options.workerPoolTrackZlib}})})}),c&&console.log("[FuncSpan Webpack] Plugin initialized")}}exports.FuncspanWebpackPlugin=u,exports.default=u;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
var k = Object.defineProperty;
|
|
2
2
|
var m = (r, o, s) => o in r ? k(r, o, { enumerable: !0, configurable: !0, writable: !0, value: s }) : r[o] = s;
|
|
3
3
|
var c = (r, o, s) => m(r, typeof o != "symbol" ? o + "" : o, s);
|
|
4
|
-
import { s as b } from "../runtimeConfig-
|
|
4
|
+
import { s as b } from "../runtimeConfig-DndXTWki.js";
|
|
5
5
|
import * as P from "path";
|
|
6
6
|
import { dirname as T } from "path";
|
|
7
7
|
import { fileURLToPath as f } from "url";
|
|
@@ -1,14 +1,15 @@
|
|
|
1
|
-
var
|
|
2
|
-
var
|
|
3
|
-
var y = (I, g, C) =>
|
|
4
|
-
import { readFileSync as
|
|
1
|
+
var Q = Object.defineProperty;
|
|
2
|
+
var O = (I, g, C) => g in I ? Q(I, g, { enumerable: !0, configurable: !0, writable: !0, value: C }) : I[g] = C;
|
|
3
|
+
var y = (I, g, C) => O(I, typeof g != "symbol" ? g + "" : g, C);
|
|
4
|
+
import { readFileSync as D } from "fs";
|
|
5
|
+
import P from "os";
|
|
5
6
|
import { s as M } from "./source-map-Cr6YkjTd.js";
|
|
6
7
|
import { Worker as _ } from "worker_threads";
|
|
7
|
-
import { g as B, C as H } from "./contextManager-
|
|
8
|
-
import { resolve as
|
|
9
|
-
const
|
|
8
|
+
import { g as B, a as q, C as H } from "./contextManager-Cx03mw7l.js";
|
|
9
|
+
import { resolve as $ } from "path";
|
|
10
|
+
const gg = {};
|
|
10
11
|
class J {
|
|
11
|
-
constructor({ file: g, line: C, function: c, code:
|
|
12
|
+
constructor({ file: g, line: C, function: c, code: A, locals: i = {}, offender: l = !1, column: n }) {
|
|
12
13
|
y(this, "file");
|
|
13
14
|
y(this, "line");
|
|
14
15
|
y(this, "function");
|
|
@@ -16,7 +17,7 @@ class J {
|
|
|
16
17
|
y(this, "locals");
|
|
17
18
|
y(this, "offender");
|
|
18
19
|
y(this, "column");
|
|
19
|
-
this.file = g, this.line = C, this.function = c, this.code =
|
|
20
|
+
this.file = g, this.line = C, this.function = c, this.code = A, this.locals = i, this.offender = l, this.column = n;
|
|
20
21
|
}
|
|
21
22
|
toDict() {
|
|
22
23
|
const g = { file: this.file, line: this.line, function: this.function, code: this.code, locals: Object.fromEntries(Object.entries(this.locals).map(([C, c]) => [C, String(c)])) };
|
|
@@ -34,58 +35,60 @@ class S {
|
|
|
34
35
|
return JSON.stringify(S.encode(g), (C, c) => c instanceof J ? c.toDict() : c);
|
|
35
36
|
}
|
|
36
37
|
}
|
|
37
|
-
const
|
|
38
|
-
function
|
|
39
|
-
return
|
|
38
|
+
const Ig = ["/sf-veritas/", "/@sailfish-ai/", "/node_modules/", "/dist/", "/<", "/internal/", "node:"], p = /* @__PURE__ */ new Map();
|
|
39
|
+
function Cg(I) {
|
|
40
|
+
return Ig.some((g) => I.includes(g));
|
|
40
41
|
}
|
|
41
|
-
function
|
|
42
|
+
function cg(I) {
|
|
42
43
|
let g = I;
|
|
43
44
|
g.startsWith("file://") && (g = g.substring(7)), process.platform === "win32" && g.startsWith("/") && g.length > 2 && g[2] === ":" && (g = g.substring(1));
|
|
44
45
|
try {
|
|
45
|
-
return
|
|
46
|
+
return $(g);
|
|
46
47
|
} catch {
|
|
47
48
|
return I;
|
|
48
49
|
}
|
|
49
50
|
}
|
|
50
|
-
function
|
|
51
|
+
function lg(I = 0) {
|
|
51
52
|
const g = new Error().stack;
|
|
52
53
|
if (!g) return [null, null];
|
|
53
|
-
const C = (function(
|
|
54
|
-
const o = 2 +
|
|
55
|
-
return
|
|
54
|
+
const C = (function(n, e) {
|
|
55
|
+
const o = 2 + e;
|
|
56
|
+
return n.split(`
|
|
56
57
|
`).slice(o, o + 5).join(`
|
|
57
58
|
`);
|
|
58
59
|
})(g, I), c = p.get(C);
|
|
59
60
|
if (c) return c;
|
|
60
|
-
const
|
|
61
|
-
if (!
|
|
62
|
-
const
|
|
61
|
+
const A = (function(n) {
|
|
62
|
+
if (!n) return [];
|
|
63
|
+
const e = n.split(`
|
|
63
64
|
`).slice(1), o = [];
|
|
64
|
-
for (const s of
|
|
65
|
+
for (const s of e) {
|
|
65
66
|
let Z = /at\s+(.+?)\s+\((.+?):(\d+):(\d+)\)/.exec(s);
|
|
66
67
|
Z ? o.push({ functionName: Z[1], file: Z[2], line: parseInt(Z[3], 10), column: parseInt(Z[4], 10) }) : (Z = /at\s+(.+?):(\d+):(\d+)/.exec(s), Z && o.push({ functionName: "<anonymous>", file: Z[1], line: parseInt(Z[2], 10), column: parseInt(Z[3], 10) }));
|
|
67
68
|
}
|
|
68
69
|
return o;
|
|
69
|
-
})(g),
|
|
70
|
-
for (let
|
|
71
|
-
const
|
|
72
|
-
if (!
|
|
73
|
-
const o = [
|
|
70
|
+
})(g), i = 1 + I;
|
|
71
|
+
for (let n = i; n < Math.min(A.length, i + 10); n++) {
|
|
72
|
+
const e = A[n];
|
|
73
|
+
if (!e || !e.file || Cg(e.file)) continue;
|
|
74
|
+
const o = [cg(e.file), e.line];
|
|
74
75
|
if (p.size >= 512) {
|
|
75
76
|
const s = p.keys().next().value;
|
|
76
77
|
s !== void 0 && p.delete(s);
|
|
77
78
|
}
|
|
78
79
|
return p.set(C, o), o;
|
|
79
80
|
}
|
|
80
|
-
const
|
|
81
|
-
return p.set(C,
|
|
81
|
+
const l = [null, null];
|
|
82
|
+
return p.set(C, l), l;
|
|
82
83
|
}
|
|
83
|
-
const f = console.log.bind(console), F = console.error.bind(console),
|
|
84
|
+
const f = console.log.bind(console), F = console.error.bind(console), R = console.warn.bind(console), z = console.info.bind(console), k = console.debug.bind(console), W = f, L = F;
|
|
84
85
|
let a = !1;
|
|
85
|
-
function
|
|
86
|
+
function ag(I) {
|
|
86
87
|
function g(C, c) {
|
|
87
|
-
const
|
|
88
|
-
|
|
88
|
+
const A = q();
|
|
89
|
+
if (A?.logIgnoreRegex && A.logIgnoreRegex.test(c)) return;
|
|
90
|
+
const [i, l] = lg(2);
|
|
91
|
+
I.setOperationName("CollectLogs"), I.doSend([c, C, i, l]);
|
|
89
92
|
}
|
|
90
93
|
console.log = (...C) => {
|
|
91
94
|
if (a) f(...C);
|
|
@@ -108,21 +111,21 @@ function Zg(I) {
|
|
|
108
111
|
}
|
|
109
112
|
}
|
|
110
113
|
}, console.warn = (...C) => {
|
|
111
|
-
if (a)
|
|
114
|
+
if (a) R(...C);
|
|
112
115
|
else {
|
|
113
116
|
a = !0;
|
|
114
117
|
try {
|
|
115
|
-
g("WARN", C.join(" ")),
|
|
118
|
+
g("WARN", C.join(" ")), R(...C);
|
|
116
119
|
} finally {
|
|
117
120
|
a = !1;
|
|
118
121
|
}
|
|
119
122
|
}
|
|
120
123
|
}, console.info = (...C) => {
|
|
121
|
-
if (a)
|
|
124
|
+
if (a) z(...C);
|
|
122
125
|
else {
|
|
123
126
|
a = !0;
|
|
124
127
|
try {
|
|
125
|
-
g("INFO", C.join(" ")),
|
|
128
|
+
g("INFO", C.join(" ")), z(...C);
|
|
126
129
|
} finally {
|
|
127
130
|
a = !1;
|
|
128
131
|
}
|
|
@@ -140,20 +143,20 @@ function Zg(I) {
|
|
|
140
143
|
});
|
|
141
144
|
}
|
|
142
145
|
let V, N = 0;
|
|
143
|
-
function
|
|
146
|
+
function Bg(I) {
|
|
144
147
|
B().sfDebug && W("Initializing Exception Interceptor...");
|
|
145
148
|
try {
|
|
146
|
-
const
|
|
147
|
-
I?.setSupplementalFields?.({ isFromLocalService:
|
|
149
|
+
const n = T();
|
|
150
|
+
I?.setSupplementalFields?.({ isFromLocalService: n }), (async function(e) {
|
|
148
151
|
if (x) return;
|
|
149
152
|
x = !0;
|
|
150
153
|
const o = process.env || {};
|
|
151
|
-
if (
|
|
154
|
+
if (E(o.SF_IS_LOCAL) === void 0)
|
|
152
155
|
try {
|
|
153
156
|
await (async function(s) {
|
|
154
157
|
const Z = K("http://169.254.169.254/latest/meta-data/", {}, s), h = K("http://metadata.google.internal/computeMetadata/v1/instance/", { "Metadata-Flavor": "Google" }, s), u = K("http://169.254.169.254/metadata/instance?api-version=2021-02-01", { Metadata: "true" }, s);
|
|
155
|
-
return (await Promise.allSettled([Z, h, u])).some((
|
|
156
|
-
})(150) && V && (V = !1,
|
|
158
|
+
return (await Promise.allSettled([Z, h, u])).some((t) => t.status === "fulfilled" && (t.value === "ok" || t.value === "http_error"));
|
|
159
|
+
})(150) && V && (V = !1, e?.setSupplementalFields?.({ isFromLocalService: !1 }));
|
|
157
160
|
} catch {
|
|
158
161
|
}
|
|
159
162
|
})(I).catch(() => {
|
|
@@ -163,30 +166,30 @@ function dg(I) {
|
|
|
163
166
|
const g = new _(new URL("data:application/javascript;base64,aW1wb3J0IHsgU2Vzc2lvbiB9IGZyb20gImluc3BlY3Rvci9wcm9taXNlcyI7CmltcG9ydCB7IHBhcmVudFBvcnQsIHdvcmtlckRhdGEgfSBmcm9tICJ3b3JrZXJfdGhyZWFkcyI7CgpnbG9iYWwuc2ZEZWJ1ZyA9IHVuZGVmaW5lZDsKZ2xvYmFsLnN0YWNrRGVwdGhMb2NhbHMgPSB1bmRlZmluZWQ7Cmdsb2JhbC5ub2RlTW9kdWxlc1RvQ29sbGVjdExvY2FsVmFyaWFibGVzT24gPSB1bmRlZmluZWQ7CgovKioKICogUHJvY2Vzc2VzIGNhbGwgZnJhbWVzIGZyb20gYW4gZXhjZXB0aW9uIGFuZCBwb3N0cyB0aGVtIHZpYSB0aGUgV29ya2Vy4oCZcyBwYXJlbnRQb3J0LgogKgogKiBAcGFyYW0gc2Vzc2lvbiAtIFRoZSBEZXZUb29scyBzZXNzaW9uIG9yIHNpbWlsYXIgb2JqZWN0IHlvdSB1c2UgdG8gcXVlcnkgZm9yIHNjcmlwdCBzb3VyY2VzLgogKiBAcGFyYW0gY2FsbEZyYW1lcyAtIEFuIGFycmF5IG9mIGNhbGwgZnJhbWUgb2JqZWN0cy4KICogQHBhcmFtIGRlc2NyaXB0aW9uTGluZXMgLSBBbiBhcnJheSBvZiBsaW5lcyBmcm9tIHRoZSBlcnJvcuKAmXMgZGVzY3JpcHRpb24sIGVhY2ggdHlwaWNhbGx5IGJlZ2lubmluZyB3aXRoICJhdCAiLgogKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0KICovCmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcm9jZXNzQ2FsbEZyYW1lcyhzZXNzaW9uLCBjYWxsRnJhbWVzLCBkZXNjcmlwdGlvbkxpbmVzKSB7CiAgLyoqCiAgICogTGltaXQgdGhlIGNhbGwgZnJhbWVzIHRvIHRoZSBtYXhpbXVtIGRlcHRoIHNwZWNpZmllZCBieSBnbG9iYWwuc3RhY2tEZXB0aExvY2Fscy4KICAgKiBUaGlzIGFzc3VtZXMgdGhhdCBnbG9iYWwuc3RhY2tEZXB0aExvY2FscyBpcyBkZWZpbmVkIGFzIGEgbnVtYmVyLgogICAqLwogIGNvbnN0IGxpbWl0ZWRDYWxsRnJhbWVzID0gY2FsbEZyYW1lcy5zbGljZSgwLCBnbG9iYWwuc3RhY2tEZXB0aExvY2Fscyk7CgogIGNvbnN0IGZyYW1lcyA9IGF3YWl0IFByb21pc2UuYWxsKAogICAgbGltaXRlZENhbGxGcmFtZXMubWFwKGFzeW5jIChmcmFtZSwgaW5kZXgpID0+IHsKICAgICAgdHJ5IHsKICAgICAgICBjb25zdCB7IGZ1bmN0aW9uTmFtZSwgbG9jYXRpb24sIHVybCwgc2NvcGVDaGFpbiB9ID0gZnJhbWU7CiAgICAgICAgLy8gRmluZCB0aGUgbG9jYWwgc2NvcGUsIGlmIGFueQogICAgICAgIGNvbnN0IGxvY2FsU2NvcGUgPSBzY29wZUNoYWluLmZpbmQoKHNjb3BlKSA9PiBzY29wZS50eXBlID09PSAibG9jYWwiKTsKCiAgICAgICAgbGV0IGNvZGUgPSAiPG5vdCBjYXB0dXJlZD4iOwogICAgICAgIC8vIFVzZSBlaXRoZXIgdGhlIFVSTCBvciB0aGUgZGVzY3JpcHRpb24gbGluZSBmb3IgZmlsZSByZWZlcmVuY2UKICAgICAgICBsZXQgZmlsZSA9ICIiOwogICAgICAgIGlmICh1cmwgJiYgdXJsLnRyaW0oKSAhPT0gIiIpIHsKICAgICAgICAgIGZpbGUgPSB1cmw7CiAgICAgICAgfSBlbHNlIGlmIChkZXNjcmlwdGlvbkxpbmVzW2luZGV4XSkgewogICAgICAgICAgZmlsZSA9IGRlc2NyaXB0aW9uTGluZXNbaW5kZXhdLnRyaW0oKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZmlsZSA9ICI8dW5rbm93bj4iOwogICAgICAgIH0KCiAgICAgICAgLy8gSWYgd2UgaGF2ZSBhIHZhbGlkIGxvY2F0aW9uIGFuZCBzY3JpcHRJZCwgZmV0Y2ggdGhlIGNvZGUgbGluZQogICAgICAgIGlmIChsb2NhdGlvbiAmJiBsb2NhdGlvbi5zY3JpcHRJZCkgewogICAgICAgICAgY29uc3Qgc2NyaXB0SWQgPSBsb2NhdGlvbi5zY3JpcHRJZDsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIGNvbnN0IHsgc2NyaXB0U291cmNlIH0gPSBhd2FpdCBzZXNzaW9uLnBvc3QoCiAgICAgICAgICAgICAgIkRlYnVnZ2VyLmdldFNjcmlwdFNvdXJjZSIsCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc2NyaXB0SWQsCiAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgY29uc3Qgc291cmNlTGluZXMgPSBzY3JpcHRTb3VyY2Uuc3BsaXQoIlxuIik7CiAgICAgICAgICAgIGNvZGUgPSBzb3VyY2VMaW5lc1tsb2NhdGlvbi5saW5lTnVtYmVyXSB8fCAiPG5vdCBjYXB0dXJlZD4iOwogICAgICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgIGlmIChnbG9iYWwuc2ZEZWJ1ZykgewogICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoIltXb3JrZXJdIEZhaWxlZCB0byBmZXRjaCBzY3JpcHQgc291cmNlOiIsIGVycik7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIEZldGNoIGxvY2FsIHZhcmlhYmxlcyBpZiB0aGVyZSdzIGFuIG9iamVjdElkCiAgICAgICAgY29uc3QgbG9jYWxzID0gbG9jYWxTY29wZT8ub2JqZWN0Py5vYmplY3RJZAogICAgICAgICAgPyBhd2FpdCBmZXRjaExvY2FsVmFyaWFibGVzKHNlc3Npb24sIGxvY2FsU2NvcGUub2JqZWN0Lm9iamVjdElkKQogICAgICAgICAgOiB7fTsKCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIGZ1bmN0aW9uOiBmdW5jdGlvbk5hbWUgfHwgIjxhbm9ueW1vdXM+IiwKICAgICAgICAgIGxvY2FscywKICAgICAgICAgIGZpbGUsCiAgICAgICAgICBsaW5lOiBsb2NhdGlvbj8ubGluZU51bWJlciB8fCAwLAogICAgICAgICAgY29kZSwKICAgICAgICB9OwogICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgIGlmIChnbG9iYWwuc2ZEZWJ1ZykgewogICAgICAgICAgY29uc29sZS5lcnJvcigiW1dvcmtlcl0gRXJyb3IgcHJvY2Vzc2luZyBjYWxsIGZyYW1lOiIsIGVycm9yKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIGZ1bmN0aW9uOiAiPGVycm9yPiIsCiAgICAgICAgICBsb2NhbHM6IHt9LAogICAgICAgICAgZmlsZTogIjx1bmtub3duPiIsCiAgICAgICAgICBsaW5lOiAwLAogICAgICAgICAgY29kZTogIjxub3QgY2FwdHVyZWQ+IiwKICAgICAgICB9OwogICAgICB9CiAgICB9KSwKICApOwogIC8vIFBvc3QgZXhjZXB0aW9uIGRhdGEKICBwYXJlbnRQb3J0Py5wb3N0TWVzc2FnZSh7IHR5cGU6ICJleGNlcHRpb24iLCBmcmFtZXMgfSk7Cn0KCi8qKgogKiBIYW5kbGVzIHRoZSAicGF1c2VkIiBzdGF0ZSBvZiB0aGUgZGVidWdnZXIgYW5kIHByb2Nlc3NlcyBleGNlcHRpb25zIG9yIHByb21pc2UgcmVqZWN0aW9ucy4KICogQHBhcmFtIHtTZXNzaW9ufSBzZXNzaW9uIC0gVGhlIGRlYnVnZ2luZyBzZXNzaW9uIGluc3RhbmNlLgogKiBAcGFyYW0ge29iamVjdH0gcGFyYW1zIC0gUGFyYW1ldGVycyBmcm9tIHRoZSAicGF1c2VkIiBldmVudC4KICovCmFzeW5jIGZ1bmN0aW9uIGhhbmRsZVBhdXNlZChzZXNzaW9uLCBwYXJhbXMpIHsKICBjb25zdCB7IHJlYXNvbiwgZGF0YSwgY2FsbEZyYW1lcyB9ID0gcGFyYW1zOwoKICBpZiAocmVhc29uICE9PSAiZXhjZXB0aW9uIiAmJiByZWFzb24gIT09ICJwcm9taXNlUmVqZWN0aW9uIikgewogICAgcmV0dXJuOwogIH0KCiAgLy8gRGVmaW5lIHJlZ2V4IHBhdHRlcm5zIHRvIGlkZW50aWZ5IG5vbi1hcHBsaWNhdGlvbiBzb3VyY2UgZXJyb3JzLgogIGNvbnN0IG5vbkFwcFBhdHRlcm5zID0gWwogICAgL25vZGU6aW50ZXJuYWwvLAogICAgL2ludGVybmFsXC8vLAogICAgL25vZGVfbW9kdWxlcy8sCiAgICAvbm9kZTpmcy8sCiAgXTsKCiAgbGV0IGZpcnN0RnJhbWVMaW5lID0gIiI7CiAgbGV0IGRlc2NyaXB0aW9uTGluZXMgPSBbXTsKCiAgaWYgKGRhdGEgJiYgdHlwZW9mIGRhdGEuZGVzY3JpcHRpb24gPT09ICJzdHJpbmciKSB7CiAgICAvLyBTcGxpdCB0aGUgZGVzY3JpcHRpb24gaW50byBsaW5lcyBhbmQgZmlsdGVyIHRvIGtlZXAgb25seSBsaW5lcyB0aGF0IHN0YXJ0IHdpdGggImF0ICIKICAgIGRlc2NyaXB0aW9uTGluZXMgPSBkYXRhLmRlc2NyaXB0aW9uCiAgICAgIC5zcGxpdCgiXG4iKQogICAgICAuZmlsdGVyKChsaW5lKSA9PiBsaW5lLnRyaW0oKS5zdGFydHNXaXRoKCJhdCAiKSk7CgogICAgLy8gVXNlIHRoZSBmaXJzdCBjYWxsIGZyYW1lIGxpbmUgZnJvbSB0aGUgZGVzY3JpcHRpb24gZm9yIGZpbHRlcmluZy4KICAgIGZpcnN0RnJhbWVMaW5lID0gZGVzY3JpcHRpb25MaW5lc1swXSB8fCAiIjsKICAgIGlmICghZmlyc3RGcmFtZUxpbmUpIHsKICAgICAgLy8gSWYsIGZvciBzb21lIHJlYXNvbiwgdGhlcmUncyBubyBmcmFtZSwgYmFpbCBvdXQKICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYSAibm9uLWFwcCIgZXJyb3IKICAgIGNvbnN0IGVycm9yRnJvbU5vbkFwcCA9IG5vbkFwcFBhdHRlcm5zLnNvbWUoKHBhdHRlcm4pID0+CiAgICAgIHBhdHRlcm4udGVzdChmaXJzdEZyYW1lTGluZS50cmltKCkpLAogICAgKTsKCiAgICAvLyBDb252ZXJ0IGBnbG9iYWwubm9kZU1vZHVsZXNUb0NvbGxlY3RMb2NhbFZhcmlhYmxlc09uYCB0byBhbiBhcnJheSBmb3Igc2FmZXR5CiAgICBjb25zdCBub2RlTW9kdWxlc0xpc3QgPSBBcnJheS5pc0FycmF5KAogICAgICBnbG9iYWwubm9kZU1vZHVsZXNUb0NvbGxlY3RMb2NhbFZhcmlhYmxlc09uLAogICAgKQogICAgICA/IGdsb2JhbC5ub2RlTW9kdWxlc1RvQ29sbGVjdExvY2FsVmFyaWFibGVzT24KICAgICAgOiBbXTsKICAgIGlmIChlcnJvckZyb21Ob25BcHApIHsKICAgICAgLy8gSWYgdGhlIGVycm9yIGlzIGZyb20gYSBub24tYXBwIHNvdXJjZSwgd2UgaGF2ZSBhIGZldyBzY2VuYXJpb3M6CiAgICAgIGlmIChub2RlTW9kdWxlc0xpc3QuaW5jbHVkZXMoIl9fYWxsX18iKSkgewogICAgICAgIC8vIElmIHRoZSBsaXN0IGluY2x1ZGVzIF9fYWxsX18sIGNhcHR1cmUgbG9jYWwgdmFyaWFibGVzIGZyb20gKmFsbCogbm9kZV9tb2R1bGVzCiAgICAgICAgaWYgKGdsb2JhbC5zZkRlYnVnKSB7CiAgICAgICAgICBjb25zb2xlLmxvZygKICAgICAgICAgICAgIltXb3JrZXJdIEVycm9yIGlzIGZyb20gbm9uLWFwcCBzb3VyY2UsIGJ1dCBjYXB0dXJpbmcgZHVlIHRvIF9fYWxsX18gcnVsZS4iLAogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgLy8gQ29udGludWUgKGRvIE5PVCByZXR1cm4pLi4uCiAgICAgIH0gZWxzZSBpZiAobm9kZU1vZHVsZXNMaXN0Lmxlbmd0aCA+IDApIHsKICAgICAgICAvLyBDaGVjayBpZiB0aGUgZmlyc3QgZnJhbWUgcmVmZXJlbmNlcyBvbmUgb2YgdGhlIG1vZHVsZXMgd2UgYWxsb3cgY2FwdHVyaW5nIGZyb20KICAgICAgICBjb25zdCBpc0Zyb21BbGxvd2VkTm9kZU1vZHVsZSA9IG5vZGVNb2R1bGVzTGlzdC5zb21lKChtb2R1bGVOYW1lKSA9PgogICAgICAgICAgZmlyc3RGcmFtZUxpbmUuaW5jbHVkZXMoYCR7bW9kdWxlTmFtZX1gKSwKICAgICAgICApOwoKICAgICAgICBpZiAoIWlzRnJvbUFsbG93ZWROb2RlTW9kdWxlKSB7CiAgICAgICAgICAvLyBOb3QgZnJvbSBhbiBhbGxvd2VkIG5vZGUgbW9kdWxlID0+IHJldHVybiBlYXJseQogICAgICAgICAgaWYgKGdsb2JhbC5zZkRlYnVnKSB7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKAogICAgICAgICAgICAgICJbV29ya2VyXSBFcnJvciBhcHBlYXJzIHRvIGJlIHRyaWdnZXJlZCBmcm9tIG5vbi1hcHBsaWNhdGlvbiBzb3VyY2VzOyBpZ25vcmluZy4iLAogICAgICAgICAgICApOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAvLyBPdGhlcndpc2UsIGl0J3MgZnJvbSBhbiBhbGxvd2VkIG5vZGUgbW9kdWxlLCBzbyBjb250aW51ZQogICAgICB9IGVsc2UgewogICAgICAgIC8vIElmIHRoZSBsaXN0IGlzIGVtcHR5LCBwcmVzZXJ2ZSBleGlzdGluZyBiZWhhdmlvciBhbmQgaWdub3JlIG5vbi1hcHBsaWNhdGlvbiBlcnJvcnMKICAgICAgICBpZiAoZ2xvYmFsLnNmRGVidWcpIHsKICAgICAgICAgIGNvbnNvbGUubG9nKAogICAgICAgICAgICAiW1dvcmtlcl0gRXJyb3IgYXBwZWFycyB0byBiZSB0cmlnZ2VyZWQgZnJvbSBub24tYXBwbGljYXRpb24gc291cmNlczsgaWdub3JpbmcuIiwKICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfQoKICAgIC8vIElmIHdlIHJlYWNoIHRoaXMgcG9pbnQsIHRoZSBlcnJvciBpcyBlaXRoZXIgZnJvbSBhcHAgY29kZSwgb3IgZnJvbSBhIG5vZGUgbW9kdWxlIGFsbG93ZWQgYnkgdGhlIGxpc3QKICAgIC8vID0+IFByb2NlZWQgd2l0aCBjYXB0dXJpbmcgbG9jYWwgdmFyaWFibGVzLCBldGMuCiAgICBhd2FpdCBwcm9jZXNzQ2FsbEZyYW1lcyhzZXNzaW9uLCBjYWxsRnJhbWVzLCBkZXNjcmlwdGlvbkxpbmVzKTsKICB9IGVsc2UgewogICAgLy8gSWYgdGhlcmUgaXMgbm8gZGF0YS5kZXNjcmlwdGlvbiBvciBpdCdzIG5vdCBhIHN0cmluZywganVzdCByZXR1cm4KICAgIHJldHVybjsKICB9Cn0KCi8qKgogKiBJbml0aWFsaXplcyB0aGUgZGVidWdnZXIgYW5kIHNldHMgdXAgZXZlbnQgbGlzdGVuZXJzIGZvciBleGNlcHRpb25zIGFuZCBwcm9taXNlIHJlamVjdGlvbnMuCiAqLwphc3luYyBmdW5jdGlvbiBzdGFydERlYnVnZ2VyKCkgewogIHBhcmVudFBvcnQ/LnBvc3RNZXNzYWdlKHsgdHlwZTogIm1lc3NhZ2UiLCByZWFkeVRvR2V0UGFyYW1ldGVyczogdHJ1ZSB9KTsKCiAgbGV0IHJlc29sdmVNZXNzYWdlUHJvbWlzZTsKICBjb25zdCBtZXNzYWdlUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7CiAgICByZXNvbHZlTWVzc2FnZVByb21pc2UgPSByZXNvbHZlOwogIH0pOwogIGxldCBpc1BhdXNlZCA9IGZhbHNlOwoKICBwYXJlbnRQb3J0Py5vbigibWVzc2FnZSIsIChtZXNzYWdlKSA9PiB7CiAgICB0cnkgewogICAgICBpZiAobWVzc2FnZT8udHlwZSA9PT0gInByb2Nlc3NFeGNlcHRpb24iKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICBpZiAoCiAgICAgICAgbWVzc2FnZT8uc2ZEZWJ1ZyAhPT0gdW5kZWZpbmVkICYmCiAgICAgICAgbWVzc2FnZT8uc3RhY2tEZXB0aExvY2FscyAhPT0gdW5kZWZpbmVkCiAgICAgICkgewogICAgICAgIGlmIChnbG9iYWwuc2ZEZWJ1ZykgewogICAgICAgICAgY29uc29sZS5sb2coIlVwZGF0aW5nIGdsb2JhbCBkZWJ1ZyB2YXJpYWJsZXMuLi4iKTsKICAgICAgICB9CgogICAgICAgIGdsb2JhbC5zZkRlYnVnID0gbWVzc2FnZS5zZkRlYnVnOwogICAgICAgIGdsb2JhbC5zdGFja0RlcHRoTG9jYWxzID0gbWVzc2FnZS5zdGFja0RlcHRoTG9jYWxzOwogICAgICAgIGdsb2JhbC5ub2RlTW9kdWxlc1RvQ29sbGVjdExvY2FsVmFyaWFibGVzT24gPQogICAgICAgICAgbWVzc2FnZS5ub2RlTW9kdWxlc1RvQ29sbGVjdExvY2FsVmFyaWFibGVzT247CgogICAgICAgIHJlc29sdmVNZXNzYWdlUHJvbWlzZSgpOwogICAgICB9CiAgICB9IGNhdGNoIChlcnJvcikgewogICAgICBpZiAoZ2xvYmFsLnNmRGVidWcpIHsKICAgICAgICBjb25zb2xlLmVycm9yKCLinYwgRXJyb3IgaW4gbWVzc2FnZSBoYW5kbGluZzoiLCBlcnJvcik7CiAgICAgIH0KICAgIH0KICB9KTsKCiAgYXdhaXQgbWVzc2FnZVByb21pc2U7CgogIHRyeSB7CiAgICBjb25zdCBzZXNzaW9uID0gbmV3IFNlc3Npb24oKTsKICAgIHNlc3Npb24uY29ubmVjdFRvTWFpblRocmVhZCgpOwoKICAgIHNlc3Npb24ub24oIkRlYnVnZ2VyLnJlc3VtZWQiLCAoKSA9PiB7CiAgICAgIGlzUGF1c2VkID0gZmFsc2U7CiAgICB9KTsKCiAgICBzZXNzaW9uLm9uKCJEZWJ1Z2dlci5wYXVzZWQiLCBhc3luYyAoZXZlbnQpID0+IHsKICAgICAgaXNQYXVzZWQgPSB0cnVlOwogICAgICBoYW5kbGVQYXVzZWQoc2Vzc2lvbiwgZXZlbnQucGFyYW1zKS50aGVuKAogICAgICAgIGFzeW5jICgpID0+IHsKICAgICAgICAgIC8vIEFmdGVyIHRoZSBwYXVzZSB3b3JrIGlzIGNvbXBsZXRlLCByZXN1bWUgZXhlY3V0aW9uIQogICAgICAgICAgaWYgKGlzUGF1c2VkKSB7CiAgICAgICAgICAgIGF3YWl0IHNlc3Npb24ucG9zdCgiRGVidWdnZXIucmVzdW1lIik7CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBhc3luYyAoXykgPT4gewogICAgICAgICAgaWYgKGlzUGF1c2VkKSB7CiAgICAgICAgICAgIGF3YWl0IHNlc3Npb24ucG9zdCgiRGVidWdnZXIucmVzdW1lIik7CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgKTsKICAgIH0pOwoKICAgIGF3YWl0IHNlc3Npb24ucG9zdCgiRGVidWdnZXIuZW5hYmxlIik7CgogICAgY29uc3QgY2FwdHVyZUFsbCA9IHdvcmtlckRhdGEuY2FwdHVyZUFsbEV4Y2VwdGlvbnMgIT09IGZhbHNlOwogICAgYXdhaXQgc2Vzc2lvbi5wb3N0KCJEZWJ1Z2dlci5zZXRQYXVzZU9uRXhjZXB0aW9ucyIsIHsKICAgICAgc3RhdGU6IGNhcHR1cmVBbGwgPyAiYWxsIiA6ICJ1bmNhdWdodCIsCiAgICB9KTsKICB9IGNhdGNoIChlcnJvcikgewogICAgaWYgKGdsb2JhbC5zZkRlYnVnKSB7CiAgICAgIGNvbnNvbGUuZXJyb3IoIltXb3JrZXJdIGVycm9yICIsIGVycm9yKTsKICAgIH0KICB9CgogIGlmIChnbG9iYWwuc2ZEZWJ1ZykgewogICAgY29uc29sZS5sb2coIltXb3JrZXJdIERlYnVnZ2VyIHN0YXJ0ZWQgc3VjY2Vzc2Z1bGx5LiIpOwogIH0KfQoKYXN5bmMgZnVuY3Rpb24gdW5yb2xsT2JqZWN0KHNlc3Npb24sIG9iamVjdElkLCBuYW1lLCB2YXJzKSB7CiAgY29uc3QgcHJvcGVydGllcyA9IGF3YWl0IHNlc3Npb24ucG9zdCgiUnVudGltZS5nZXRQcm9wZXJ0aWVzIiwgewogICAgb2JqZWN0SWQsCiAgICBvd25Qcm9wZXJ0aWVzOiB0cnVlLAogIH0pOwoKICB2YXJzW25hbWVdID0gcHJvcGVydGllcy5yZXN1bHQKICAgIC5tYXAoKHYpID0+IFt2Lm5hbWUsIHYudmFsdWU/LnZhbHVlXSkKICAgIC5yZWR1Y2UoKG9iaiwgW2tleSwgdmFsXSkgPT4gewogICAgICBvYmpba2V5XSA9IHZhbDsKICAgICAgcmV0dXJuIG9iajsKICAgIH0sIHt9KTsKfQoKYXN5bmMgZnVuY3Rpb24gdW5yb2xsQXJyYXkoc2Vzc2lvbiwgb2JqZWN0SWQsIG5hbWUsIHZhcnMpIHsKICBjb25zdCBwcm9wZXJ0aWVzID0gYXdhaXQgc2Vzc2lvbi5wb3N0KCJSdW50aW1lLmdldFByb3BlcnRpZXMiLCB7CiAgICBvYmplY3RJZDogb2JqZWN0SWQsCiAgICBvd25Qcm9wZXJ0aWVzOiB0cnVlLAogIH0pOwogIHZhcnNbbmFtZV0gPSBwcm9wZXJ0aWVzLnJlc3VsdAogICAgLmZpbHRlcigodikgPT4gdi5uYW1lICE9PSAibGVuZ3RoIiAmJiAhaXNOYU4ocGFyc2VJbnQodi5uYW1lLCAxMCkpKQogICAgLnNvcnQoKGEsIGIpID0+IHBhcnNlSW50KGEubmFtZSwgMTApIC0gcGFyc2VJbnQoYi5uYW1lLCAxMCkpCiAgICAubWFwKCh2KSA9PiB2LnZhbHVlPy52YWx1ZSk7Cn0KCmZ1bmN0aW9uIHVucm9sbE90aGVyKHByb3AsIHZhcnMpIHsKICBpZiAoIXByb3AudmFsdWUpIHsKICAgIHJldHVybjsKICB9CgogIGlmICgidmFsdWUiIGluIHByb3AudmFsdWUpIHsKICAgIGlmIChwcm9wLnZhbHVlLnZhbHVlID09PSB1bmRlZmluZWQgfHwgcHJvcC52YWx1ZS52YWx1ZSA9PT0gbnVsbCkgewogICAgICB2YXJzW3Byb3AubmFtZV0gPSBgPCR7cHJvcC52YWx1ZS52YWx1ZX0+YDsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIHZhcnNbcHJvcC5uYW1lXSA9IHByb3AudmFsdWUudmFsdWU7CiAgICByZXR1cm47CiAgfQoKICBpZiAoImRlc2NyaXB0aW9uIiBpbiBwcm9wLnZhbHVlICYmIHByb3AudmFsdWUudHlwZSAhPT0gImZ1bmN0aW9uIikgewogICAgdmFyc1twcm9wLm5hbWVdID0gYDwke3Byb3AudmFsdWUuZGVzY3JpcHRpb259PmA7CiAgICByZXR1cm47CiAgfQoKICBpZiAocHJvcC52YWx1ZS50eXBlID09PSAidW5kZWZpbmVkIikgewogICAgdmFyc1twcm9wLm5hbWVdID0gIjx1bmRlZmluZWQ+IjsKICAgIHJldHVybjsKICB9Cn0KCi8qKgogKiBGZXRjaGVzIGxvY2FsIHZhcmlhYmxlcyBmcm9tIHRoZSBnaXZlbiBvYmplY3QgSUQuCiAqIEBwYXJhbSB7U2Vzc2lvbn0gc2Vzc2lvbiAtIFRoZSBkZWJ1Z2dpbmcgc2Vzc2lvbiBpbnN0YW5jZS4KICogQHBhcmFtIHtzdHJpbmd9IG9iamVjdElkIC0gVGhlIG9iamVjdCBJRCByZXByZXNlbnRpbmcgdGhlIGxvY2FsIHNjb3BlLgogKiBAcmV0dXJucyB7b2JqZWN0fSBBIGtleS12YWx1ZSBtYXAgb2YgbG9jYWwgdmFyaWFibGUgbmFtZXMgYW5kIHRoZWlyIHZhbHVlcy4KICovCmFzeW5jIGZ1bmN0aW9uIGZldGNoTG9jYWxWYXJpYWJsZXMoc2Vzc2lvbiwgb2JqZWN0SWQpIHsKICBpZiAoIW9iamVjdElkKSByZXR1cm4ge307CgogIHRyeSB7CiAgICBjb25zdCB7IHJlc3VsdCB9ID0gYXdhaXQgc2Vzc2lvbi5wb3N0KCJSdW50aW1lLmdldFByb3BlcnRpZXMiLCB7CiAgICAgIG9iamVjdElkLAogICAgICBvd25Qcm9wZXJ0aWVzOiB0cnVlLAogICAgfSk7CgogICAgY29uc3QgcHJvcGVydGllcyA9IHJlc3VsdDsKICAgIGlmIChwcm9wZXJ0aWVzKSB7CiAgICAgIGNvbnN0IHZhcmlhYmxlcyA9IHt9OwogICAgICBmb3IgKGNvbnN0IHByb3Agb2YgcHJvcGVydGllcykgewogICAgICAgIGlmIChwcm9wPy52YWx1ZT8ub2JqZWN0SWQgJiYgcHJvcD8udmFsdWUuY2xhc3NOYW1lID09PSAiQXJyYXkiKSB7CiAgICAgICAgICBjb25zdCBpZCA9IHByb3AudmFsdWUub2JqZWN0SWQ7CiAgICAgICAgICBhd2FpdCB1bnJvbGxBcnJheShzZXNzaW9uLCBpZCwgcHJvcC5uYW1lLCB2YXJpYWJsZXMpOwogICAgICAgIH0gZWxzZSBpZiAoCiAgICAgICAgICBwcm9wPy52YWx1ZT8ub2JqZWN0SWQgJiYKICAgICAgICAgIHByb3A/LnZhbHVlPy5jbGFzc05hbWUgPT09ICJPYmplY3QiCiAgICAgICAgKSB7CiAgICAgICAgICBjb25zdCBpZCA9IHByb3AudmFsdWUub2JqZWN0SWQ7CiAgICAgICAgICBhd2FpdCB1bnJvbGxPYmplY3Qoc2Vzc2lvbiwgaWQsIHByb3AubmFtZSwgdmFyaWFibGVzKTsKICAgICAgICB9IGVsc2UgaWYgKHByb3A/LnZhbHVlKSB7CiAgICAgICAgICB1bnJvbGxPdGhlcihwcm9wLCB2YXJpYWJsZXMpOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gdmFyaWFibGVzOwogICAgfQogIH0gY2F0Y2ggKGVycikgewogICAgaWYgKGdsb2JhbC5zZkRlYnVnKSB7CiAgICAgIGNvbnNvbGUuZXJyb3IoIltXb3JrZXJdIEZhaWxlZCB0byBmZXRjaCBsb2NhbCB2YXJpYWJsZXM6IiwgZXJyKTsKICAgIH0KICAgIHJldHVybiB7fTsKICB9Cn0KCnN0YXJ0RGVidWdnZXIoKS5jYXRjaCgoZXJyb3IpID0+IHsKICBpZiAoZ2xvYmFsLnNmRGVidWcpIHsKICAgIGNvbnNvbGUuZXJyb3IoIltXb3JrZXJdIEZhaWxlZCB0byBzdGFydCBkZWJ1Z2dlcjoiLCBlcnJvcik7CiAgfQp9KTsKCi8vIEtlZXAgdGhlIHdvcmtlciBhbGl2ZQpzZXRJbnRlcnZhbCgoKSA9PiB7fSwgMTAwMDApOwo="), { workerData: { captureAllExceptions: !0 } });
|
|
164
167
|
let C = null;
|
|
165
168
|
const c = /* @__PURE__ */ new WeakMap();
|
|
166
|
-
g.on("message", (
|
|
167
|
-
if (typeof
|
|
168
|
-
const { frames:
|
|
169
|
+
g.on("message", (n) => {
|
|
170
|
+
if (typeof n == "string" && B().sfDebug && W(`[Worker] ${n}`), n.readyToGetParameters && g.postMessage({ sfDebug: B().sfDebug, stackDepthLocals: B().stackDepthLocals, nodeModulesToCollectLocalVariablesOn: B().nodeModulesToCollectLocalVariablesOn }), n.type === "exception") {
|
|
171
|
+
const { frames: e } = n, o = C;
|
|
169
172
|
if (!o) return;
|
|
170
173
|
const s = c.get(o), Z = (function(u) {
|
|
171
174
|
return u ? u.split(`
|
|
172
|
-
`).slice(1).map((
|
|
173
|
-
const Y = /at (.+?) \((.+):(\d+):(\d+)\)/.exec(
|
|
175
|
+
`).slice(1).map((t) => {
|
|
176
|
+
const Y = /at (.+?) \((.+):(\d+):(\d+)\)/.exec(t) || /at (.+):(\d+):(\d+)/.exec(t);
|
|
174
177
|
if (Y) {
|
|
175
|
-
const [, m, r, d,
|
|
176
|
-
return new J({ function: m || "<anonymous>", locals: {}, file: r || "<unknown>", line: parseInt(d, 10) || 0, code: "<not captured>", column: parseInt(
|
|
178
|
+
const [, m, r, d, b] = Y;
|
|
179
|
+
return new J({ function: m || "<anonymous>", locals: {}, file: r || "<unknown>", line: parseInt(d, 10) || 0, code: "<not captured>", column: parseInt(b) || 0 });
|
|
177
180
|
}
|
|
178
181
|
return new J({ function: "<unknown>", locals: {}, file: "<unknown>", line: 0, code: "<not captured>", column: 0 });
|
|
179
182
|
}) : [];
|
|
180
|
-
})(o.stack), h = (function(u,
|
|
183
|
+
})(o.stack), h = (function(u, t) {
|
|
181
184
|
const Y = [];
|
|
182
185
|
let m = -1, r = -1;
|
|
183
186
|
for (let d = 0; d < u.length; d++) {
|
|
184
|
-
const
|
|
185
|
-
if (r = d,
|
|
186
|
-
for (let G = 0; G <
|
|
187
|
-
const w =
|
|
188
|
-
if (
|
|
189
|
-
m = G, N = 0, B().sfDebug && W(`✅ Matched Frame Found: ${
|
|
187
|
+
const b = og(u[d].file);
|
|
188
|
+
if (r = d, b !== "<unknown>") {
|
|
189
|
+
for (let G = 0; G < t.length; G++) {
|
|
190
|
+
const w = t[G];
|
|
191
|
+
if (j(w, b) || typeof w.file == "string" && w.file.includes(b)) {
|
|
192
|
+
m = G, N = 0, B().sfDebug && W(`✅ Matched Frame Found: ${b} @ Debugger Frame ${G}`);
|
|
190
193
|
break;
|
|
191
194
|
}
|
|
192
195
|
}
|
|
@@ -195,131 +198,131 @@ function dg(I) {
|
|
|
195
198
|
}
|
|
196
199
|
if (m === -1) return N === 10 ? (N = 0, u) : (++N, B().sfDebug && W(`"❌ No matching frame found. Checking once again, Attempt N ${N}"`), []);
|
|
197
200
|
B().sfDebug && W(`🔄 Merging from matched index ${m} onward...`);
|
|
198
|
-
for (let d = 0; d <
|
|
199
|
-
const
|
|
200
|
-
Y.push(new J({ function: G?.function ||
|
|
201
|
+
for (let d = 0; d < t.length; d++) {
|
|
202
|
+
const b = u[r + d], G = t[m + d];
|
|
203
|
+
Y.push(new J({ function: G?.function || b?.function || "<anonymous>", locals: G?.locals || b?.locals || {}, file: b?.file || G?.file || "<unknown>", line: G?.line || b?.line || 0, code: G?.code || b?.code || "<not captured>" }));
|
|
201
204
|
}
|
|
202
205
|
return Y;
|
|
203
|
-
})(Z,
|
|
206
|
+
})(Z, e || []);
|
|
204
207
|
if (h.length !== 0) {
|
|
205
208
|
C = null;
|
|
206
|
-
const u = B().stackDepthCodeTraceDepth,
|
|
207
|
-
for (let
|
|
208
|
-
const G =
|
|
209
|
-
G && (G.content != null && (b
|
|
209
|
+
const u = B().stackDepthCodeTraceDepth, t = u === -1 ? h : h.slice(0, u + 1), Y = Math.min(t.length, Z.length);
|
|
210
|
+
for (let b = 0; b < Y; b++) (async () => {
|
|
211
|
+
const G = ng(t[b].file, Z[b].line, Z[b].column);
|
|
212
|
+
G && (G.content != null && (t[b].code = G.content), G.file != null && (t[b].file = G.file));
|
|
210
213
|
})();
|
|
211
214
|
I.setOperationName("CollectExceptions");
|
|
212
215
|
const m = o.message ? `${o.name}: ${o.message}` : o.name;
|
|
213
216
|
B().sfDebug && W("error message is : ", m);
|
|
214
217
|
const r = H.getInstance(), d = c.get(o);
|
|
215
218
|
d ? (r.setTraceIdFor(d, d), r.runWithSession(d, () => {
|
|
216
|
-
r.setTraceId(d), I.doSend(m,
|
|
217
|
-
})) : I.doSend(m,
|
|
218
|
-
I.doSend(m,
|
|
219
|
-
}) : I.doSend(m,
|
|
219
|
+
r.setTraceId(d), I.doSend(m, t);
|
|
220
|
+
})) : I.doSend(m, t), s ? H.getInstance().runWithSession(s, () => {
|
|
221
|
+
I.doSend(m, t);
|
|
222
|
+
}) : I.doSend(m, t);
|
|
220
223
|
}
|
|
221
224
|
}
|
|
222
|
-
}), g.on("error", (
|
|
223
|
-
L("[Worker Error]",
|
|
224
|
-
}), g.on("exit", (
|
|
225
|
-
L(`[Worker] Exited with code ${
|
|
225
|
+
}), g.on("error", (n) => {
|
|
226
|
+
L("[Worker Error]", n);
|
|
227
|
+
}), g.on("exit", (n) => {
|
|
228
|
+
L(`[Worker] Exited with code ${n}`);
|
|
226
229
|
}), g.unref();
|
|
227
|
-
const
|
|
228
|
-
function
|
|
229
|
-
const
|
|
230
|
-
Reflect.setPrototypeOf(
|
|
230
|
+
const A = Error, i = /* @__PURE__ */ new Set();
|
|
231
|
+
function l(...n) {
|
|
232
|
+
const e = Reflect.construct(A, n);
|
|
233
|
+
Reflect.setPrototypeOf(e, l.prototype);
|
|
231
234
|
try {
|
|
232
235
|
const s = H.getInstance().getTraceId();
|
|
233
|
-
c.set(
|
|
236
|
+
c.set(e, s);
|
|
234
237
|
} catch {
|
|
235
238
|
}
|
|
236
|
-
|
|
237
|
-
const o = `${
|
|
239
|
+
A.captureStackTrace && A.captureStackTrace(e, l);
|
|
240
|
+
const o = `${e.message}:${e.stack?.split(`
|
|
238
241
|
`)[1]?.trim()}`;
|
|
239
|
-
if (!
|
|
240
|
-
|
|
242
|
+
if (!i.has(o)) {
|
|
243
|
+
i.add(o), C = e;
|
|
241
244
|
const s = H.getInstance().getTraceId();
|
|
242
|
-
c.set(
|
|
245
|
+
c.set(e, s), g.postMessage({ type: "processException", error: e.message });
|
|
243
246
|
}
|
|
244
|
-
return
|
|
247
|
+
return e;
|
|
245
248
|
}
|
|
246
|
-
|
|
249
|
+
l.prototype = Object.create(A.prototype, { constructor: { value: l, enumerable: !1, writable: !0, configurable: !0 } }), Object.setPrototypeOf(l, A), globalThis.Error = l;
|
|
247
250
|
}
|
|
248
251
|
function U(I) {
|
|
249
252
|
return I = (I = (I = I.replace(/^webpack:\/\/[^\/]+\/\.?\//, "")).replace(/^.*\/pages\//, "pages/")).replace(/\.(js|ts)$/, "");
|
|
250
253
|
}
|
|
251
|
-
function
|
|
252
|
-
const c = (function(
|
|
253
|
-
|
|
254
|
-
const
|
|
255
|
-
return
|
|
254
|
+
function ng(I, g, C) {
|
|
255
|
+
const c = (function(i) {
|
|
256
|
+
i.startsWith("at ") && (i = i.slice(3).trim());
|
|
257
|
+
const l = i.match(/^(.*?)(:\d+)+(\.map)?$/);
|
|
258
|
+
return l ? l[1] : i;
|
|
256
259
|
})(I);
|
|
257
260
|
if (!c || c === "<unknown>") return null;
|
|
258
|
-
const
|
|
261
|
+
const A = c + ".map";
|
|
259
262
|
try {
|
|
260
|
-
const
|
|
261
|
-
if (
|
|
262
|
-
const
|
|
263
|
-
let
|
|
264
|
-
if (c &&
|
|
265
|
-
const
|
|
263
|
+
const i = D(A, "utf-8");
|
|
264
|
+
if (i) {
|
|
265
|
+
const l = JSON.parse(i);
|
|
266
|
+
let n = new M.SourceMapConsumer(l).originalPositionFor({ line: g, column: C });
|
|
267
|
+
if (c && n.source) {
|
|
268
|
+
const e = U(c), o = l.sources.findIndex((s) => U(s) === e);
|
|
266
269
|
if (o === -1) B().sfDebug && W(`Source file "${c}" not found in the source map.`);
|
|
267
270
|
else {
|
|
268
|
-
const s =
|
|
271
|
+
const s = l.sourcesContent[o], Z = l.names.join(",");
|
|
269
272
|
if (s)
|
|
270
273
|
return { content: s.split(`
|
|
271
|
-
`).slice(
|
|
272
|
-
`), name: Z, file:
|
|
274
|
+
`).slice(n.line - 1, n.line + 20).join(`
|
|
275
|
+
`), name: Z, file: n.source };
|
|
273
276
|
B().sfDebug && W(`No source content available for file "${c}".`);
|
|
274
277
|
}
|
|
275
278
|
}
|
|
276
|
-
return { content:
|
|
279
|
+
return { content: l.sourcesContent[0], name: l.names[0], file: l.file };
|
|
277
280
|
}
|
|
278
|
-
} catch (
|
|
279
|
-
B().sfDebug && W(`Cant read/parse "${
|
|
281
|
+
} catch (i) {
|
|
282
|
+
B().sfDebug && W(`Cant read/parse "${A}: Error - ".`, i);
|
|
280
283
|
}
|
|
281
284
|
return null;
|
|
282
285
|
}
|
|
283
|
-
function
|
|
286
|
+
function og(I) {
|
|
284
287
|
return I?.split("/").pop() || "<unknown>";
|
|
285
288
|
}
|
|
286
|
-
function
|
|
289
|
+
function j(I, g) {
|
|
287
290
|
if (!I || typeof I != "object") return !1;
|
|
288
291
|
for (const C of Object.values(I))
|
|
289
|
-
if (typeof C == "string" && C.includes(g) || typeof C == "object" &&
|
|
292
|
+
if (typeof C == "string" && C.includes(g) || typeof C == "object" && j(C, g)) return !0;
|
|
290
293
|
return !1;
|
|
291
294
|
}
|
|
292
295
|
let X, v, x = !1;
|
|
293
|
-
function
|
|
296
|
+
function E(I) {
|
|
294
297
|
if (!I) return;
|
|
295
298
|
const g = I.toLowerCase().trim();
|
|
296
299
|
return !!["1", "true", "yes", "on"].includes(g) || !["0", "false", "no", "off"].includes(g) && void 0;
|
|
297
300
|
}
|
|
298
|
-
function
|
|
301
|
+
function T() {
|
|
299
302
|
if (V !== void 0) return V;
|
|
300
|
-
const I = process.env || {}, g =
|
|
303
|
+
const I = process.env || {}, g = E(I.SF_IS_LOCAL);
|
|
301
304
|
if (g !== void 0) return V = g;
|
|
302
305
|
const C = (I.SF_ENV || I.NODE_ENV || "").toLowerCase();
|
|
303
306
|
if (["local", "dev", "development"].includes(C)) return V = !0;
|
|
304
|
-
if (["KUBERNETES_SERVICE_HOST", "AWS_EXECUTION_ENV", "ECS_CONTAINER_METADATA_URI", "ECS_CONTAINER_METADATA_URI_V4", "GAE_ENV", "K_SERVICE", "GOOGLE_CLOUD_PROJECT", "WEBSITE_INSTANCE_ID", "VERCEL", "NETLIFY", "DYNO", "RENDER", "FLY_APP_NAME", "RAILWAY_STATIC_URL", "CF_PAGES", "CLOUDFLARE"].some((
|
|
305
|
-
const c = (
|
|
307
|
+
if (["KUBERNETES_SERVICE_HOST", "AWS_EXECUTION_ENV", "ECS_CONTAINER_METADATA_URI", "ECS_CONTAINER_METADATA_URI_V4", "GAE_ENV", "K_SERVICE", "GOOGLE_CLOUD_PROJECT", "WEBSITE_INSTANCE_ID", "VERCEL", "NETLIFY", "DYNO", "RENDER", "FLY_APP_NAME", "RAILWAY_STATIC_URL", "CF_PAGES", "CLOUDFLARE"].some((A) => !!I[A])) return V = !1;
|
|
308
|
+
const c = (P.hostname?.() || I.HOSTNAME || "").toLowerCase();
|
|
306
309
|
return V = !(c !== "localhost" && !c.endsWith(".local") && !c.includes("local"));
|
|
307
310
|
}
|
|
308
311
|
function K(I, g, C) {
|
|
309
312
|
return new Promise((c) => {
|
|
310
313
|
try {
|
|
311
|
-
const
|
|
312
|
-
|
|
314
|
+
const A = new URL(I), i = (A.protocol, gg).request({ method: "GET", hostname: A.hostname, port: A.port || (A.protocol === "https:" ? 443 : 80), path: A.pathname + (A.search || ""), headers: g }, (l) => {
|
|
315
|
+
l.resume(), l.statusCode && l.statusCode >= 200 && l.statusCode < 400 ? c("ok") : c("http_error");
|
|
313
316
|
});
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
}),
|
|
317
|
+
i.on("error", () => c("error")), i.setTimeout(C, () => {
|
|
318
|
+
i.destroy(), c("timeout");
|
|
319
|
+
}), i.end();
|
|
317
320
|
} catch {
|
|
318
321
|
c("error");
|
|
319
322
|
}
|
|
320
323
|
});
|
|
321
324
|
}
|
|
322
|
-
function
|
|
325
|
+
function Ag() {
|
|
323
326
|
if (X !== void 0) return X;
|
|
324
327
|
const I = process.env.SF_FUNCSPAN_RUNTIME_ENABLED;
|
|
325
328
|
if (I === "true" || I === "1") return X = !0, !0;
|
|
@@ -331,20 +334,20 @@ function ng() {
|
|
|
331
334
|
}
|
|
332
335
|
return X = !1, !1;
|
|
333
336
|
}
|
|
334
|
-
function
|
|
335
|
-
return v !== void 0 || (v = !
|
|
337
|
+
function ig() {
|
|
338
|
+
return v !== void 0 || (v = !T()), v;
|
|
336
339
|
}
|
|
337
|
-
function
|
|
338
|
-
return !!
|
|
340
|
+
function mg() {
|
|
341
|
+
return !!Ag() && (!ig() || (console.warn("[FuncSpan Runtime] DISABLED in production environment"), !1));
|
|
339
342
|
}
|
|
340
343
|
export {
|
|
341
344
|
S as C,
|
|
342
345
|
L as a,
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
346
|
+
ag as b,
|
|
347
|
+
Bg as c,
|
|
348
|
+
ig as d,
|
|
349
|
+
Ag as e,
|
|
350
|
+
gg as h,
|
|
348
351
|
W as i,
|
|
349
|
-
|
|
352
|
+
mg as s
|
|
350
353
|
};
|