100% found this document useful (1 vote)
271 views19 pages

User Curves PDF

The document provides information about user curves in GeoVista Platform Logger software. User curves allow users to create custom curves by writing programs that perform transformations on sonde data. Programs are written in Reverse Polish notation using a stack-based approach and can reference sonde values, perform basic math operations, conditional branching, and more. Examples demonstrate calculating borehole volume and conductivity normalization. The document outlines the basics of the user curve programming approach and provides guidance for writing effective programs.

Uploaded by

Đại Hùng
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
100% found this document useful (1 vote)
271 views19 pages

User Curves PDF

The document provides information about user curves in GeoVista Platform Logger software. User curves allow users to create custom curves by writing programs that perform transformations on sonde data. Programs are written in Reverse Polish notation using a stack-based approach and can reference sonde values, perform basic math operations, conditional branching, and more. Examples demonstrate calculating borehole volume and conductivity normalization. The document outlines the basics of the user curve programming approach and provides guidance for writing effective programs.

Uploaded by

Đại Hùng
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 19

GeoVista Platform Logger

User Curves

Manual Update Record


Created April 2003 Author M Payne
Updated June 2003. Added STOREBCD6 and improved index.
Updated March 2004. Added the Exp function

Table of Contents
Introduction: ............................................................................................................................................. 3
Activating User Curves Function ............................................................................................................. 3
User Curve Programming......................................................................................................................... 4
The basic operations & Reverse Polish notation ...................................................................................... 4
How RP Is Implemented........................................................................................................................... 5
This is an empty stack: ............................................................................................................................. 5
ADD ......................................................................................................................................................... 8
Multiply .................................................................................................................................................... 8
Divide ....................................................................................................................................................... 8
Subtract..................................................................................................................................................... 8
LogE ......................................................................................................................................................... 8
Log10 ....................................................................................................................................................... 8
Absolute.................................................................................................................................................... 8
Exp ........................................................................................................................................................... 8
The structure of a user programme........................................................................................................... 8
The user programme includes three main sections as follows:................................................................. 8
i) Identification section............................................................................................................................. 8
ii) Definition section. ................................................................................................................................ 9
Code section ............................................................................................................................................. 9
Simple programme example..................................................................................................................... 9
Identification Section: .............................................................................................................................. 9
Code Section: ......................................................................................................................................... 10
Summary of the capabilities so far ......................................................................................................... 11
Further features of the software.............................................................................................................. 11
Access To Current Depth ....................................................................................................................... 11
Local Data values. .................................................................................................................................. 12
Program Flow Control............................................................................................................................ 13
Unconditional Branching-GOTO ....................................................................................................... 13
COMPSLT; ........................................................................................................................................ 13
COMPSGT; ........................................................................................................................................ 13
Special Operators.................................................................................................................................... 14
STOREBCD6 ..................................................................................................................................... 14
Example using all of the constructs so far. ............................................................................................. 15
Example programme 1: Calculate Borehole Volume ............................................................................ 16
Example programme 2: Conductivity Normalization for Water Na+ Cl- in solution............................. 17
Example programme 3: Borehole volume Calculation using Two-Arm Caliper.................................... 18
System Limits......................................................................................................................................... 19
Software revisions .................................................................................................................................. 19

GeoVista Platform Logger User Function Manual


Page 2 Of 19

USER CURVES
Introduction:
The GeoVista Platform Logger software includes a facility for User Curves. These are
curves created by the user as opposed to those produced directly by the sondes. They
are created using short programmes that compute the required transformation. One
can produce either fixed value traces (e.g. Bit Size trace) or variable value traces that
change as a function of one or several sonde data channels (e.g. Borehole Volume
trace).
The computed traces can be applied and displayed either during logging or during
play-back.
When applied, the User Curves are seen by the logging software as additional (albeit
virtual) sondes in the sonde stack with zero length.
Activating User Curves Function
User curve programmes are written in the correct format on a Microsoft Notepad file
saved in the UserFunctions directory, itself being in the systems root directory. The
files must be saved using a descriptive name and a *.usr extension. Make sure The
extension *.usr is present after saving the file as Notepad tends to save files with
extension *.txt by default.
To activate a User Curve for presentation during logging, first make sure a sonde
stack is selected. After logging the User Curve is saved in the header along with other
curves. It is then permanently available for display in subsequent playback.
If no User Curve was recorded during logging, the operator has still a chance to apply
one in playback. To activate a User Curve for presentation during playback, first
select the file to open then select the required User Curve and enable it prior to
displaying the log.
a. Select sonde stack or select file to playback (as the case may be)
b. Click on the User curves drop-down menu and select the select program option.
This will display all the programmes currently available in the directory from
which the required one can be selected.

c. Click on the User programme Enable toggle option.

GeoVista Platform Logger User Function Manual


Page 3 Of 19

d. The correct transformation effected by the selected programme can be verified


using the Test Program option with test numerical values.

e. The User Curve can be accessed like other curves under its (virtual) sonde
window. When closing the logging or playback file, an option is given to save
the current curve parameters. If this option is taken, then the details of the User
curve are written onto the header file (*.hdr) Header file and made available for
subsequent playbacks.
User Curve Programming
User curve programmes are written as Microsoft Notepad files with *.usr extensions.
The programming logic is similar to that used with programmable calculators using
Reverse Polish Notation (RP). This may appear difficult at first hand if not seen
before. However, with a little practice, and following the examples presented, useful
virtual curve definitions can soon be created.
The basic operations & Reverse Polish notation
In the mathematical notation most familiar, the sum of two items is usually written
as:
A+B
(1)
When dealing with computers, this form is not that which is natural to calculation,
and an alternative format is used, namely Reverse Polish(RP). The above sum would
be written;
AB+

(2)

To calculate the sum is quite natural: take A, take B then add them together. In this
interpretation, each operand & operator is taken in the order in which it appears.
In the example (1) above, the sequence is; take A, remember that an addition is
required, take B and add them together.
For computers, the second format is the most natural, and is the format in which the
GeoVista virtual sonde curves are calculated. Just to get used to this, here are a few
equations presented both in the usual notation and RP notation.
GeoVista Platform Logger User Function Manual
Page 4 Of 19

Usual notation
A*B
AB
A/2
A(B + C)
Log10(A)
Sin(A)

RP notation
AB*
ABA2/
BC+A*
A Log10
A Sin

Ok, that is fairly straight forward. Now try these and see if you can get the
correct answer.
Usual notation
2(A * B)

Comments
How many ways are there of writing
an RP notation equivalent?

RP notation

1/A
A2
A1/2
How RP Is Implemented
It may be helpful to explain why we use the RP notation, and having an
understanding what is happening will assist in writing correct RP notation formulae.
The implementation all occurs on what is called the Stack. A stack is a list of
numeric values, with certain special aspects to how the numeric values in the stack are
accessible.
Adding & removing numeric values to & from the stack.
This is an empty stack:
TOS*

TOS means Top Of Stack

To add a value to the stack we Push a value onto the stack. Starting from
the empty stack, if the operation Push A is executed, the stack will look like
this:
TOS A

If the operation Push B is now performed on the stack, the result will be:
GeoVista Platform Logger User Function Manual
Page 5 Of 19

TOS B
A

Further Push operations will cause those existing values in the stack to be pushed
down one level, the new value placed at the top of the stack. This operation can be
performed repeatedly, or until the stack becomes full. If the stack is full, and a
further value is pushed, the error stack overflow will occur. The software cannot
recover from this error, and the formula must be rewritten so that this error does not
occur.
So, that is how numeric values are put onto the stack, but how are they retrieved?
Data values are extracted using the Pop instruction, and is the reverse of the Push
instruction.
Given the stack as above, with two numeric values having been pushed, namely A
and B, after a Pop instruction is performed, the stack will now look like:
TOS

A further Pop instruction would leave us with the empty stack. This would be quite
legal. If however a Pop instruction is performed on an empty stack, then the error
stack underflow occurs. Again, the software cannot recover from this error, and
the formula must be rewritten so that this error does not occur.
Note that when a Pop instruction is executed, the data value from TOS is sent
somewhere useful. In the case here, it will be sent to a curve of the virtual sonde.
More on that later.

GeoVista Platform Logger User Function Manual


Page 6 Of 19

Having seen that data can be Pushed onto the stack and Popped off the stack, why is
this useful? To see this, new operations will be introduced.
Starting with the stack:
TOS
A

Performing the operation Add will give a stack looking like this:
TOS A+B

What has happened is this: The execution of the Add instruction automatically causes
these operations to occur:
TOS is Popped to the Add software (in this case the value of B)
TOS is Popped to the Add software (in this case the value of A
The two values in the Add software are added together & Pushed onto the stack.
As a result, There is now one less numeric value in the stack (both A and B have
gone). The individual values A and B have been lost from the stack and now the TOS
is the sum (A+B).
The Add instruction is a binary operation, in that there are two input values and one
answer (the input values are A and B, the answer is AB+ (or (A+B) for those not yet
converted to RP).
In comparison, the natural logarithm function is unary. There is one input value and
one answer. All operations described here are either unary or binary.

GeoVista Platform Logger User Function Manual


Page 7 Of 19

The table below presents all the computational instructions that are implemented in
the GeoVista system. The sequence of events column represents the actions that
take place in terms of Pop, Push and usual mathematical actions.
Instruction
ADD
Multiply
Divide
Subtract
LogE

Sequence of events
POP A
POP B
PUSH (A+B)
POP A
POP B
PUSH (A*B)
POP A
POP B
PUSH (A/B)
POP A
POP B
PUSH (A-B)
POP A
PUSH Loge(A)

Log10

POP A
PUSH Log10(A)

Absolute

POP A
PUSH Abs(A)

Exp

POP A
PUSH eA

Comments
Binary operation
Binary operation
Binary operation
Binary operation
Unary operation. No
change in number of items
on stack
Unary operation. No
change in number of items
on stack
Unary operation. No
change in number of items
on stack
Unary operation. No
change in number of items
on stack

There are a few more operations concerned with program flow control, these will be
introduced at a later point as they are required.
Now that an understanding of RP has been introduced, the structure of a simple user
program can be discussed.
The structure of a user programme
The user programme includes three main sections as follows:
i) Identification section.
Here the name of the author and a description of the function can be entered. It is
useful to make sensible comments on the the function for future reference.
Keywords that the software looks for and expects to find in this section are: Name,
Author and Created. If these keywords are absent or spelt wrongly, an error will
occur.

GeoVista Platform Logger User Function Manual


Page 8 Of 19

ii) Definition section.


Here, the name of the curves for the virtual sonde are defined. The keywords here
are the phrase Definition Section and the word Create. These must be present and
spelt correctly.
More than one curve can be created (see the section on implementation limits) by
simply having more than 1 line in the Definition section
Code section
This section contains the computational instructions. The keyword is Code
Section. There can be as many or as few statements in the code section as required
(see the section on implementation limits) to complete the task at hand.
Simple programme example
The example programme below, shows how we create a Fluid Resistivity curve called
RES with units OHMM using the Conductivity curve of the TCON sonde.
Identification Section:
this is self evident
Definition Section:

Reading the parameters from left to right, we create one curve called RES with
units OHMM. This curve is assigned to displayed in track 2 & track 3 with a left
hand value of zero and a right hand scale value of 1,000. The curve colour will be
blue and the curve thickness will be 2.
Identification

Name Function For GeoVista


Author Martin Payne
Created April 2001
Creates Fluid Resistivity Curve for the TCON sonde

Definition

Definition section
Create RES:OHMM TK2 TK3 0.00 1000.00 Blue 2

Code

Code Section
PUSH TCON,COND;
PUSH 1.0;
DIVIDE;
PUSH 10000;
MULTIPLY;
POP RES:OHMM;
END;

GeoVista Platform Logger User Function Manual


Page 9 Of 19

Code Section:
After the keyword, the first statement is:
PUSH TCON:COND;
This will put a value onto the TOS. What is this value? It is the COND
(conductivity) channel value from the TCON (Temperature CONductivity) sonde.
At this point it should be understood that this data value has been correctly depth
offset, filtered as set in the software and calibrated according to the usual calibration
routines. It is a data value in engineering units.
Note that for this code statement to have any value, the TCON sonde must exist in
the logging tool stack selected and it must have a channel named COND. If these
conditions are not satisfied, then there will be an error reported which must be
corrected for the process to continue.
Note the semi colon after the statement. This is a syntactical requirement and must be
there otherwise an error will be reported.
The next statement is:
PUSH 1.0;
This is slightly different in that a literal value, in this case 1.0, is being pushed onto
the stack. This is quite correct and any literal number, positive or negative, can be
pushed onto the stack.
This is what the stack looks like after these two operations;
TOS
1.0
TCON:COND

The next statement is;


DIVIDE;
After execution of this operation, the stack will look like this;
TOS 1/TCON:COND

The TOS is the inverse of the conductivity value, it is now a resistivity value. To
convert between the different units used, some other arithmetic is required and these
form the next two statements in the code section.
After the unit conversion, the next statement is;
GeoVista Platform Logger User Function Manual
Page 10 Of 19

POP RES:OHMM;
This is the vital statement, in that this is how we pass the computed value back to the
virtual sonde for display with the other virtual and the real data curves.
Note that the name of the destination is RES:OHMM, identical to the curve name and
units defined in the Create statement. A data value can only be popped to one place,
and that is a user defined curve, defined in a create statement. Data cannot be pushed
from a user defined curve.
The next statement is the END; statement. All programs end with this statement, and
any text below the line containing this statement will be ignored.
It should be noted that at the end of the program execution, the stack is empty.
Verify this is the case. As discussed before, an item cannot be popped from an empty
stack, an error will occur. An error will not occur if there are data items on the stack,
but in a simple case such as this there is no reason to leave anything on the stack.
Summary of the capabilities so far
With the information presented so far, it is possible to create useful user curves and
plot them onto the log display.
It is recommended that tasks are performed with what has been learnt so far before the
next constructs are introduced. Some interesting examples that can be implemented
with that presented so far are;
1
2

Normalisation of fluid conductivity values back to 25C.


Display a caliper log in both mm and inches simultaneously.

Further features of the software.


As more complex user curves are required, it will become apparent that there are
some necessary constructs missing. These are;
1
2
3
4

Access to the value of the depth of the log at the current point
Access to cable speed and cable tension.
The ability to store and retrieve local data values between successive executions
of the program.
The ability to control the execution of the program based on the data values
presented by the sonde or those stored in the local storage areas.

Of course, the software is not deficient in these areas, they have not been introduced
until this point.
Access To Current Depth

GeoVista Platform Logger User Function Manual


Page 11 Of 19

The first item, obtaining the depth, is simple. The statement Depth; will push the
current depth onto the stack in the usual fashion. The value will be in the units of the
currently selected system, namely feet or metres.
Access to Cable Speed & Cable tension.
The commands SPEED; and TENSION; will push the current values of speed and
tension onto top of the stack.
The depth offsets applied for cable tension are such that the depth will be that of the
bottom of the sonde stack.
The depth offsets for cable speed depend on the sondes in the stack. If a flowmeter
sonde is present, then the same depth offsets for the flow measurement will be used.
If a flowmeter measurement is not present, then the cable speed will be referenced to
the bottom of the sonde stack.
Local Data values.
Local data values are declared with syntax as per the following example:
Definition Section
Create BHVL:M3 TK2 TK3 0 1.0 Red 1
Declare CaliperSummation=0;
Declare NumberOfCaliperPoints=0;
Declare AverageCaliper=0;
Note that these declarations are in the Definition Section, along with the creation of
the curves in the virtual sonde. In this example, a curve called BHVL with units M3
has been created.
In the declaration of the local variables, note that an initial value has been assigned.
This can be any floating point number.
To manipulate the values held in these local declarations, there are two functions
called Get and Save. These appear in the code section along with other program
statements. The Get & Save are similar to Push & Pop, except that they only operate
on locally declared variables. They cannot be used to put data into a curve in the
virtual sonde.
With the declarations as in the example above, deduce the result of this segment of
code below. The names of the local variables are chosen to immediately impart an
understanding of the code, as names should always be chosen. Avoid cryptic names!
.
PUSH 2ACS:CAL;
GET CaliperSummation;
ADD;
SAVE CaliperSummation;
GeoVista Platform Logger User Function Manual
Page 12 Of 19

GET NumberOfCaliperPoints;
PUSH 1;
ADD;
SAVE NumberOfCaliperPoints;
GET NumberOfCaliperPoints;
GET CaliperSummation;
DIVIDE;
SAVE AverageCaliper;
.
Note that immediately after NumberOfCaliperPoints is Saved, it must be recalled,
with a Get instruction, to the top of the stack in the next instruction. After the Save
instruction, it no longer exists on the stack.
Program Flow Control
Unconditional Branching-GOTO
The control of the flow of program execution is often required, basing the decision on
the comparison of data values. Before program flow control can be implemented,
there is a need for a label and a jump construct. These are simple and demonstrated in
the code sequence below.
GOTO Label#1;
PUSH 0;

Label#1;

This code segment will always jump from the GOTO statement to the Label#1.
Labels must be declared with this format. The Push 0 code line can never be
executed as this stands. This not very useful so a conditional jump is required.
Two conditional jump statements are provided;
COMPSLT;
COMPSGT;
These instructions operate on the two top elements of the stack, and will remove the
two top elements of the stack after execution.

GeoVista Platform Logger User Function Manual


Page 13 Of 19

Consider this code section:


Code
Push 1;
Push 0.5;
<Conditional>
SAVE A;
SAVE B;

If <Conditional>=COMPSLT

If < Conditional>=COMPSGT

After the execution of


COMPSLT, the next
instruction to be executed will
be SAVE B;. The SAVE A
instruction will be skipped.

After the execution of


COMPSLT, the next instruction
to be executed will be SAVE A;

Note that only a greater or less than instruction is provided. Due to rounding errors in
floating point numbers, a skip if equal instruction would not give predictable
results in all cases.
Special Operators.
As users applications develop, there arises a need for further instructions to be added
to the repertoire. One examples of this was the development of the QPG sonde. This
measures a precise pressure in the borehole, and users are often looking for a small
change in a large value.
STOREBCD6
For example, the absolute pressure may be 1,000 dBar, and the user wishes to
observe changes of 1dbar. With a conventional single log trace, this will not be
possible. The solution is to represent the data with 4 individual traces. Each trace
then displays the value of the integer. To clarify, the number ABCD has the value;

A 10 3 + B 10 2 + C 101 + D 10 0
So each of the 4 traces will be assigned one each to the values A,B,C & D and
displayed on a scale of 0-10. Then a change of 1 in the value will be seen as a change
of 1 in the D curve, which is now 1 track division, and can clearly be seen.

GeoVista Platform Logger User Function Manual


Page 14 Of 19

An example of this program for the QPG sonde is shown below.


Name Function For GeoVista
Author Martin Payne
Created May 2003
Description Provides computed
Definition section
Create 1000:dBar TK3 TK3 0
Create 100:dBar
TK3 TK3 0
Create 10:dBar
TK2 TK2 0
Create 1:dBar
TK2 TK2 0
Code Section
PUSH QPG:Pres;
STOREBCD6;
POP
1000:dBar;
POP
1000:dBar;
POP
1000:dBar;
POP
100:dBar;
POP
10:dBar;
POP
1:dBar;

curves
10
10
10
10

Red 2
Blue 2
Green 2
Black 2

END;

The important instruction is STOREBCD6. This instruction will perform this


operation;
STOREBCD6

POP X
PUSH A
PUSH B
PUSH C
PUSH D
PUSH E
PUSH F

Unary operation. 6 new


items on the stack.

The STOREBCD6 instruction actually decodes 6 digits, as seen in the evaluation


below. In the QPG example it was known that a maximum of 4 digits would be
required so the leading zeroes were simply POPped off the stack and discarded.
A 10 5 + B 10 4 + C 10 3 + D 10 2 + E 101 + F 10 0
Example using all of the constructs so far.
This complete program uses the caliper from the density sonde to calculate borehole
volume. This is a surprisingly complex program, follow it through and try to explain
all the code lines.

GeoVista Platform Logger User Function Manual


Page 15 Of 19

Example programme 1: Calculate Borehole Volume


Name Function For GeoVista
Author Martin Payne
Created 2rd Sept 2000
Description Calculates borehole volume For Density Sonde
Definition section
Create BHVL:M3 TK2 TK3 0 1.0 Red 1
Declare LastDepth=0;
Declare FirstLoopFlag=1;
Declare RunningVolume=0;
Code Section
GET FirstLoopFlag;
PUSH 0.5;
COMPSLT;
GOTO Label#1;
PUSH 0;
detects the first execution of the program
SAVE FirstLoopFlag; to prime the start depth local variable
GET RunningVolume;
POP BHVL:M3;
DEPTH;
SAVE LastDepth;
GOTO Label#2;
Label#1;
PUSH 4.0;
PUSH DENS:CAL;
PUSH DENS:CAL;
MULTIPLY;
PUSH 3.142;
MULTIPLY;
DIVIDE;
gets area of hole on TOS (in mm^2)
DEPTH;
GET LastDepth;
SUBTRACT;
ABSOLUTE;
MULTIPLY;
PUSH 0.000001;
MULTIPLY; gets change in volume on TOS
GET RunningVolume;
ADD;
SAVE RunningVolume;
DEPTH;
SAVE LastDepth;
GET RunningVolume;
GeoVista Platform Logger User Function Manual
Page 16 Of 19

POP BHVL:M3;
Label#2;
END;
What is the text after the instructions? These are comments. Any text after the semi
colon terminating the instructions is ignored by the software, and can be used to
annotate the program. A well commented program is much more valuable than one
with no comments.
Example programme 2: Conductivity Normalization for Water Na+ Cl- in solution.
Name Function For GeoVista
Author Seghir Messamah
Created August 2001
Normalises Conductivity values to 25 degC
Definition section
Create NCND:uSie TK2 TK3 0.00 100.00 Blue 2
Code Section
PUSH TCON:TEMP;
PUSH 21.5;
ADD;
PUSH 1;
DIVIDE;
PUSH 46.5;
MULTIPLY;
PUSH TCON:COND;
MULTIPLY;
POP NCND:uSie;
END;

GeoVista Platform Logger User Function Manual


Page 17 Of 19

Example programme 3: Borehole volume Calculation using Two-Arm Caliper


Name Function For GeoVista
Author Martin Payne
Created 2rd Sept 2000
Description Calculates borehole volume
Definition section
Create BHVL:M3 TK2 TK3 0 1.0 Red
Declare LastDepth=0;
Declare FirstLoopFlag=1;
Declare RunningVolume=0;
Code Section
GET FirstLoopFlag;
PUSH 0.5;
COMPSLT;
GOTO Label#1;
PUSH 0;
SAVE FirstLoopFlag;
GET RunningVolume;
POP BHVL:M3;
DEPTH;
SAVE LastDepth;
GOTO Label#2;
Label#1;
PUSH 4.0;
PUSH CALX:CAL;
PUSH CALX:CAL;
MULTIPLY;
PUSH 3.142;
MULTIPLY;
DIVIDE;
gets area of hole on TOS (in mm^2)
DEPTH;
GET LastDepth;
SUBTRACT;
ABSOLUTE;
MULTIPLY;
PUSH 0.000001;
MULTIPLY; gets change in volume on TOS
GET RunningVolume;
ADD;
SAVE RunningVolume;
DEPTH;
SAVE LastDepth;
GeoVista Platform Logger User Function Manual
Page 18 Of 19

GET RunningVolume;
POP BHVL:M3;
Label#2;
END;

System Limits
There are limits to various aspects of the implementation, and these are declared here.
Normally, these limits are greater than will be required, but if these are breached an
error message will be issued.
There will usually be another way to write the program to avoid these limits being a
problem.
Maximum number of user instructions = 100
Maximum number of locals = 10
Maximum number of virtual sonde curves = 10
Maximum depth of stack = 100
Software revisions
Note that as the GeoVista Platform Logger software is upgraded, the version of
software being used may not support all described functions.
A summary of revisions is given here. A later version is always available from
GeoVista.
Versions prior to 5.0 are not recommended to be used with user functions. Errors may
occur.
Version 5.72 added the STOREBCD6 function
Version 5.78 added the exp function
Version 5.81 Added the Speed & Tension commands.

End Of Document
GeoVista Platform Logger User Function Manual
Page 19 Of 19

You might also like

pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy